Как отправить межпроцессное сообщение? - PullRequest
0 голосов
/ 29 апреля 2019

Оба PostMessage и SendNotifyMessage завершаются с ошибкой ERROR_MESSAGE_SYNC_ONLY.Таким образом, мой единственный оставшийся вариант - SendMessage, но он, похоже, ничего не делает - он возвращает ноль, а GetLastError - это ERROR_ENVVAR_NOT_FOUND.

Вот мой код отправителя (процесс 1):

SendMessage(FindWindowEx(HWND_MESSAGE,NULL,"Message","serverwindow"),WM_COPYDATA,HWND_MESSAGE,
        &(COPYDATASTRUCT){0, sizeof "localhost", "localhost"})

И получатель (процесс 0):

HWND hWnd=CreateWindowExA(0,"Message","serverwindow",0,0,0,0,0,HWND_MESSAGE,NULL,GetModuleHandle(NULL),NULL);
MSG msg;
while (Sleep(500), true)
while (PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
    printf("message recieved\n");

1 Ответ

1 голос
/ 30 апреля 2019

Как сказал Дэвид в комментарии, WM_COPYDATA - это сообщение отправлено , это не сообщение в очереди , поэтому цикл сообщений, подобный показанному вами, никогда не увидит сообщениевыводится (Get|Peek)Message().Сообщение доставляется непосредственно в WindowProc окна получения, поэтому его нужно обработать.Однако при отправке сообщения через границы потока / процесса принимающему потоку все равно необходимо запустить цикл сообщений, чтобы отправленные сообщения были отправлены в окна этого потока, пока (Get|Peek)Message() ожидает сообщение в очереди.

Согласно документации SendMessage():

Отправляет указанное сообщение окну или окнам. Функция SendMessage вызывает оконную процедуру для указанного окна и не возвращается, пока оконная процедура не обработает сообщение.

...

Если указанное окно былосозданная вызывающим потоком, оконная процедура вызывается сразу как подпрограмма. Если указанное окно было создано другим потоком, система переключается на этот поток и вызывает соответствующую оконную процедуру.Сообщения, отправленные между потоками, обрабатываются только тогда, когда принимающий поток выполняет код поиска сообщений.Отправляющий поток блокируется до тех пор, пока принимающий поток не обработает сообщение. Однако отправляющий поток будет обрабатывать входящие не поставленные в очередь сообщения, ожидая обработки своего сообщения.Чтобы предотвратить это, используйте SendMessageTimeout с установленным SMTO_BLOCK.Для получения дополнительной информации о сообщениях без очереди см. Сообщения без очереди .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...