Запуск второй копии программы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Запуск второй копии программы

Сообщение Sirik » 05.10.2004 (Вт) 14:29

Как при запуске второй копии программы передать какое-то сообщение в первую копию.
Я так понимаю это можно реадизовать через Send Message и Find Window. Но как?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.10.2004 (Вт) 14:49

Принципы межпроцессной коммуникации весьма разнообразны.
Если хочешь через findwindow, то пусть каждая копия сначала вызывает registerwindowmessage, используя аргументом одну и ту же строку. Тогда все копии будут иметь один и тот же message для обмена. Ищи, посылай - будут знать, и какое отправлять, и какое вылавливать (одно и то же, разумеется).
Ну долго объяснять, пробуй :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 05.10.2004 (Вт) 14:53

Мне вобще-то надо было чтобы при втором вызове программы вторая копия закрывалась одновременно передавала управление первой.
Вот что я "накопал":
Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function OpenIcon Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Const GW_HWNDPREV = 3

Private Sub ShowPrevInstance()
    Dim OldTitle As String
    Dim ll_WindowHandle As Long
    OldTitle = App.Title
    App.Title = "abcba - This App Will Be Closed"
    ll_WindowHandle = FindWindow("Test", OldTitle)
    If ll_WindowHandle = 0 Then Exit Sub
    ll_WindowHandle = GetWindow(ll_WindowHandle, GW_HWNDPREV)
        Call OpenIcon(ll_WindowHandle)
        Call SetForegroundWindow(ll_WindowHandle)
    End
End Sub

Private Sub Form_Load()
    If App.PrevInstance Then ShowPrevInstance
End Sub


Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 05.10.2004 (Вт) 17:47

GSerg, а ты не пробовал в VB пользовать DDE?
идея проста:
у главной формы проекта устанавливаем свойство LinkMode = 1-Source, задаем LinkTopic и форма становится DDE-сервером...
я вот только пока не пойму как объединить в одной программе и сервер и клиент... пока в поисках... курю msdn...
но идея наверное не нова...
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.10.2004 (Вт) 18:27

Да поковырял я этот DDE...
Фигня жуткая.
Правда, я его с нуля реализовывал :)
К тому же, технология признана устаревшей.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 05.10.2004 (Вт) 18:57

вопчем... слова GSerg'а и безрезультатные попытки найти что-либо по DDE связанное с темой поднятой Sirik'ом... да к тому же целых два примера лежащих на vbrussian.com заставили меня отказаться от моей идеи...
линки на примеры ниже:
Передача параметров в предыдущую инстансь программы
Запуск только одной копии программы
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 05.10.2004 (Вт) 19:20

А если с Mutex'ам?
См. CreateMutex и связанные с ней функции в APIGuide... Там всё подробо расписано, есть примеры...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.10.2004 (Вт) 19:27

Ну и чё?
Mutex либо есть, либо нет. Это всё, что о нём можно сказать :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 05.10.2004 (Вт) 19:33

Вот и можно использовать его для передачи Boolean данных ;-)))))))

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.10.2004 (Вт) 22:01

О, а вот мой подход - мэйлслоты:
(на форме нужен таймер, либо Waiter от GSerg ;-))
Код: Выделить всё
Option Explicit
Private Declare Function CreateMailslot Lib "kernel32" Alias "CreateMailslotA" (ByVal lpName As String, ByVal nMaxMessageSize As Long, ByVal lReadTimeout As Long, lpSecurityAttributes As Any) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
Private Const GENERIC_WRITE As Long = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const OPEN_EXISTING As Long = 3&
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const INVALID_HANDLE_VALUE As Long = -1&
Private Const MailslotName As String = "\\.\mailslot\mytestapp"
Private Dummy As Long
Private hFile As Long

Sub Form_Load()
hFile = CreateFile(MailslotName, GENERIC_WRITE, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hFile <> INVALID_HANDLE_VALUE Then
    WriteFile hFile, Command, Len(Command), Dummy, ByVal 0&
    Unload Me
Else
    hFile = CreateMailslot(MailslotName, 0, 0, ByVal 0&)
    Print "Primary app launched with Command=""" & Command & """"
End If
End Sub

Private Sub tmrCheck_Timer()
Dim Buffer As String * 256
    ReadFile hFile, Buffer, 255, Dummy, ByVal 0&
    If Dummy > 0 Then _
        Print "Secondary app launched with Command=""" & Left$(Buffer, Dummy) & """"
End Sub

:-)
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.10.2004 (Ср) 9:24

Правильный подход - пипы :) Одобренный Microsoft'ом :)
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 6

    TopList  
cron