IPC использует SendMessage, но получатель имеет произвольную заголовок окна - PullRequest
1 голос
/ 16 марта 2010

Я обнаружил " Delphi Inter Process Communication (IPC) с использованием SendMessage " с Google.

Вот фрагмент кода от Отправителя, чтобы отправить сообщение для Получателя:

procedure TfrmClient.FormCreate(Sender: TObject);
begin
  MyMsg := RegisterWindowMessage('MyMessage');
  ServerApplicationHandle := FindWindow('TApplication', 'Project1');
end;

Проблема в том, что у моего получателя есть название произвольной подписи. Так как я могу отправить сообщение получателю? Любая идея? Мой отправитель - DLL, а мой получатель - Exe.

Ответы [ 5 ]

4 голосов
/ 16 марта 2010

Одно очевидное решение для EXE - дать DLL дескриптор окна, в которое он должен отправлять сообщения. EXE вызовет функцию в DLL, так что сейчас самое время предоставить дескриптор окна. Удалить все догадки. (В этом отношении EXE-файл может просто дать DLL-адресу адрес функции для вызова и вообще пропустить сообщения.)

Другим решением является передача сообщения. Используйте специальный дескриптор окна HWND_BROADCAST при вызове SendMessage, и сообщение будет отправлено на все окна верхнего уровня в системе. Только другие окна, которые зарегистрировали тот же идентификатор сообщения, будут делать что-либо, когда они получат это сообщение; другие должны просто и безопасно игнорировать это.

1 голос
/ 16 марта 2010

Я знаю, что это не ответ на ваш вопрос, но мне кажется, что выбор IPC в этом случае не лучший. Посмотрите на IPC на основе именованных каналов. Они быстрее сообщений, и у вас нет проблем, как найти получателя:

http://www.cromis.net/blog/downloads/cromis-ipc/

1 голос
/ 16 марта 2010

В дополнение к ответу Роба, если у вас есть большое количество сообщений для обмена, используйте первое сообщение, чтобы отправить дескриптор окна, и начните двустороннюю не вещательную связь.

И если вам действительно не нужен фактический элемент управления, я бы использовал AllocateHWnd(), чтобы дать вам дескриптор окна для приема трансляции.

0 голосов
/ 16 марта 2010

Имейте в виду, что высота повлияет на вашу способность общаться. Приложение с повышенными привилегиями не может отправлять / получать сообщения от процесса, который не является.

Как предложил Бегун, вам лучше использовать именованные каналы или даже Почтовые ящики .

0 голосов
/ 16 марта 2010

Не публиковать в TApplication, а только в главной форме и давать вашей главной форме значимое имя:

const
  DLL_MESSAGE = WM_APP + 100;

type
  TMyDLLMessageReceiverForm=class(TForm)
    procedure ReceiveTheDLLsCustomMessage(var Msg: TMessage); message DLL_MESSAGE;
  end;

Из библиотеки DLL:

var
  WndHandle: HWND;

...

WndHandle := FindWindow('TMyDLLReceiverForm', nil);
if WndHandle <> 0 then
  PostMessage(WndHandle, DLL_MESSAGE, SomeParam, SomeOtherParam);
...