Передача и обработка сообщения между 2 процессами

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Eugira
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 22.07.2003 (Вт) 14:39

Передача и обработка сообщения между 2 процессами

Сообщение Eugira » 22.07.2003 (Вт) 14:43

кратко смысл вопроса
1), как передать сообщение из 1 выполняемого VB6-приложения другому VB6- приложению, чтобы по получении оного в 2 приложении сработала функция-обработчик получения сообщения
(речь идет видимо об API-функциях)
ясно, что 1 шаг из приложения1 отловить дескриптор окна 2 приложения:
Dim hwnd As Long
hwnd = FindWindow(vbNullString, "Имя_окна__приложения2")
If hwnd Then
.......
Историей этого вопроса послужила конкретная ситуация:
пусть из приложения-клиента открыт документ приложения MS Office (Visio, Exel...)
Пользователь, работая в нем нажимает на кнопку (пункт меню)(Popup Menu).
Как заставить обработчик этого действия передать сообщение, которое может отловить и обработать
клиентское приложение?
Проблема для Visio в том, что есть напр метод RunAddON("Имя")
где имя может быть имя_программы.exe или ThisDocument.Имся_функции(...)
или есть метод AddAdvise(...), который может передать сообщение Sink-объекту в исходноео клиентское приложение
(при этом оно должно быть типа ActiveX EXE), но проблема в том , что метод AddAdvise в Visio может обрабатывать из близких лишь следующие события: Document Saved, Shape Deleted Shape Added но ни в коем случае не событие заключающиеся в нажатии пункта меню (кнопки, Popup Menu)
Е.Багоцкий

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 22.07.2003 (Вт) 18:08

WinSock, дорогой мой, winsock
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

goro
Постоялец
Постоялец
 
Сообщения: 494
Зарегистрирован: 03.12.2002 (Вт) 11:45
Откуда: Украина, Запорожье

Сообщение goro » 22.07.2003 (Вт) 23:14

Поищи инфу по SendMessage, это тебе точно поможет 8)
ПРЕВЕД

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

Сообщение alibek » 23.07.2003 (Ср) 9:55

Winsock тут совершенно не нужен.
Есть два основных способа. Первый, более простой -- через SendMessage.
Алгоритм:
1. Находишь hWnd окна (твой первый шаг)
2. В окне второго приложения (которое должно принимать параметры) должен быть невидимый TextBox с определенным текстом (например "APP-EXCHANGE"). Ты находишь hWnd этого TextBox через FindWindowEx.
3. Теперь, когда у тебя есть хэндл текстбокса, ты можешь записывать в него текст через API SetWindowText и считывать через GetWindowText. Когда ты будешь изменять текст в этом текстбоксе, во втором приложении будет генерироваться для него событие Change, в нем и ставь обработку данных (а данными будет служить содержимое TextBox)

Второй способ несколько сложнее, но правильнее и гораздо удобнее. Нужно использовать Named Pipes. Они специально придуманы для обмена данными между процессами на одной или разных машинах.

Ну и наконец есть Mailslot, они предоставляют одностороннюю связь, но зато их очень просто использовать.
Lasciate ogni speranza, voi ch'entrate.

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сообщение Demonx » 24.07.2003 (Чт) 1:45

alibek писал(а):Named Pipes

Можно подробнее?

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

Сообщение alibek » 24.07.2003 (Чт) 8:50

Лучше, чем здесь тебе никто не расскажет :)
Lasciate ogni speranza, voi ch'entrate.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 24.07.2003 (Чт) 15:33

alibek писал(а):3. Теперь, когда у тебя есть хэндл текстбокса, ты можешь записывать в него текст через API SetWindowText и считывать через GetWindowText.


Боюсь, что SetWindowText и GetWindowText ему здесь не поможет, сам пытался их использовать. Считать заголовок чужого окна, пожалуйста, а вот дочерние окна типа Button или TextBox - фиг. Не дает, возращает пустоту (пробовал на Win98).
Я так понимаю это специально ограничили. Вместо этих функций для чужих Button'ов и т.д. надо использовать:
SendMessage(hndTextBox, WM_GETTEXTLENGTH, 0, 0)
SendMessage(hndTextBox, WM_GETTEXT, iTxtLen, ByVal s) и т.д.
- такой код у меня работал.
Главное двигаться не быстрее, чем думает твоя голова.

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

Сообщение GSerg » 25.07.2003 (Пт) 7:44

Заинтересовался и я этим вопросом, позырил по ссылке...
Там написано:
MSDN писал(а):Windows Me/98/95: Named pipes cannot be created.
Чуть ниже написано:
MSDN писал(а):Windows Me/98/95: Pipe names cannot include a colon. Therefore, if this pipe will be used from a Windows Me/98/95 client, do not include a colon in the name.
Я в полном отрубе, короче. Могу я их создавать под своей 98 или нет? Попробовал юзануть CreateNamedPipe - вроде возвращает не ноль...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение GSerg » 26.07.2003 (Сб) 7:20

Разобрался.
"Создание" - это может быть создание первой копии, а может быть создание instances уже существующих pipes. Так вот, первую копию можно создать только под 2k\XP, а instances - под всеми виндами. Таким образом, сей несомненно рулезный метод для нас опять недоступен :(
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList  
cron