Не работает SendMessage
От: barbanel  
Дата: 17.07.14 14:46
Оценка:
Здравствуйте уважаемые!
Не работает SendMessage.

Знаю что тема обсосана уже миллион раз, но уже второй день не могу найти причину.
Есть два разных приложения, одно из них шлет т.н. ping-сообщения второму, второе отчитывается что оно живое.
Смысл сего в том, что если второе приложение долго не отвечает, первое его грохает и запускает снова.

1) Первое приложение ищет хендл главной формы второго приложения и шлет ему сообщение:
SendMessage(FirstHandle, WM_APP_SERVER_PING, self.Handle, 0);

2) Второе приложение получает это сообщение и шлет в ответ:
procedure TfrmAppServerMain.OnMessageNew(var Msg: TMsg; var Handled: Boolean);
begin
    if ( msg.message = WM_APP_SERVER_PING ) then
    begin
        Handled := true;

        GuardianHandle := HWND(Msg.WParam);
        SendMessage(GuardianHandle, WM_APP_SERVER_PONG, 0, 0);
    end;
end;

Сами сообщения определены так (разумеется в обоих приложениях)
const
  WM_APP_SERVER_PING    = WM_USER + 241;
  WM_APP_SERVER_PONG    = WM_USER + 242;

Проблема: первое приложение не получает ответное сообщение.
Я убедился что хендл первого находится правильно, внутри второго сообщения также принимается правильный хендл первого приложения, но второе упорно не видит это сообщение.
Что я делаю не так? Возможно я чего-то не знаю, чего именно?

Заранее спасибо!
Re: Не работает SendMessage
От: Danchik Украина  
Дата: 18.07.14 13:55
Оценка:
Здравствуйте, barbanel, Вы писали:

[Skip]

B>Заранее спасибо!


Я не понял только одно — зачем это сделано на сообщениях?

Вы не слышали об Мютексах? CreateMutex
Создаем именованый мютекс, и если второе приложение его не дергает: оно не запущено-свалилось-зависло.
Re[2]: Не работает SendMessage
От: okman Беларусь https://searchinform.ru/
Дата: 18.07.14 15:29
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Вы не слышали об Мютексах? CreateMutex

D>Создаем именованый мютекс, и если второе приложение его не дергает: оно не запущено-свалилось-зависло.

Тогда уж лучше ждать на хэндле процесса: когда процесс завершается, его хэндл переходит в сигнальное состояние и
wait-функция возвращается с кодом WAIT_OBJECT_0.

По теме: оконные сообщения по разным причинам могут не проходить. Например, если у sender-а
более низкий integrity level, чем у receiver-а (Vista+), тогда доставка блокируется UAC-ом.
Или если процессы запущены на разных десктопах/оконных станциях/сессиях, эти границы оконные
сообщения тоже пересекать не могут.
Re: Не работает SendMessage
От: RSATom Россия  
Дата: 18.07.14 15:55
Оценка:
Я так понимаю нынче принято сначала на форуме спросить, а только потом документацию читать?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx

Applications that need to communicate using HWND_BROADCAST should use the RegisterWindowMessage function to obtain a unique message for inter-application communication.

The system only does marshalling for system messages (those in the range 0 to (WM_USER-1)). To send other messages (those >= WM_USER) to another process, you must do custom marshalling.

Re[2]: Не работает SendMessage
От: RSATom Россия  
Дата: 18.07.14 16:01
Оценка:
Здравствуйте, RSATom, Вы писали:
Оопс, автор оказывается девушка... Примите мои извинения за грубость... Девушек так мало в наших рядах... Их ценить надо.
Re[3]: Не работает SendMessage
От: Danchik Украина  
Дата: 21.07.14 11:01
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Danchik, Вы писали:


D>>Вы не слышали об Мютексах? CreateMutex

D>>Создаем именованый мютекс, и если второе приложение его не дергает: оно не запущено-свалилось-зависло.

O>Тогда уж лучше ждать на хэндле процесса: когда процесс завершается, его хэндл переходит в сигнальное состояние и

O>wait-функция возвращается с кодом WAIT_OBJECT_0.

Да, но так мы не отловим зависание процесса
Re[2]: Не работает SendMessage
От: Pavel Dvorkin Россия  
Дата: 22.07.14 11:44
Оценка:
Здравствуйте, RSATom, Вы писали:

RSA>Applications that need to communicate using HWND_BROADCAST should use the RegisterWindowMessage function to obtain a unique message for inter-application communication.


Где там HWND_BROADCAST у ТС ?
With best regards
Pavel Dvorkin
Re[3]: Не работает SendMessage
От: RSATom Россия  
Дата: 22.07.14 12:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Где там HWND_BROADCAST у ТС ?


в цитате важнее было про

To send other messages (those >= WM_USER)...

Re: Не работает SendMessage
От: Mr.Delphist  
Дата: 11.08.14 14:04
Оценка:
Здравствуйте, barbanel, Вы писали:

B>Здравствуйте уважаемые!

B>Не работает SendMessage.

B>Знаю что тема обсосана уже миллион раз, но уже второй день не могу найти причину.

B>Есть два разных приложения, одно из них шлет т.н. ping-сообщения второму, второе отчитывается что оно живое.
B>Смысл сего в том, что если второе приложение долго не отвечает, первое его грохает и запускает снова.

Может, я уже подзабыл специфику обмена сообщениями именно между разными процессами, но: мне кажется, что приложения должны делать PostMessage, а не SendMessage. Т.к. SendMessage не вернёт управление до тех пор, пока не будет отработан на принимающей стороне, получается блокировка:
1) посылаем сообщение из приложения А, ждём ответа...
2) принимаем запрос в приложении Б, отвечаем другим сообщением, ждём ответа... (но приложение А занято тем, что ждёт ответа на первый SendMessage, упс)

Поэтому, либо пользуйтесь для ответа LRESULT (тогда надобность в ответном SendMessage исчезает), либо делайте асинхронное общение через PostMessage
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.