Проблемы с IPC SendMessage - PullRequest
       20

Проблемы с IPC SendMessage

0 голосов
/ 06 октября 2010

Привет У меня проблемы с моим SendMessage.

Похоже, что сообщение никогда не достигает моей формы (я использую Winspector Spy, чтобы увидеть, какие сообщения зарегистрированы в моей форме), что странно, потому что я уверен, что отправляю на правильный дескриптор для текущего форма.

SendMessage находится внутри DLL, но это не должно иметь к этому никакого отношения.

//sStr is just an input where i type in the Handler address;  
SendMessage(Integer(sStr),WM_COPYDATA, Integer(Handle),Integer(@copyDataStruct));

SendMessage каждый раз возвращает 0.

На приемном конце:

procedure WMCopyData(var Msg: TWMCopyData); message WM_CopyData;

procedure TMainForm.WMCopyData(var Msg: TWMCopyData);
var
 s : string;
begin
    s := PChar(Msg.CopyDataStruct.lpData);
    showmessage(s);
 //Send something back
    msg.Result := 2006;
end;

Я также пробовал другие сообщения, такие как WM_CLOSE. Кто-нибудь знает, почему это не удается? Я использую Delphi 5.

Ответы [ 3 ]

1 голос
/ 06 октября 2010

Проблема в том, что вы не можете написать

Integer(sStr)

для преобразования строки, представляющей целое число (например, «12345»), в целое число (12345).

Используйте взамен

StrToInt(sStr)

.

Действительно, технически строка является только указателем на заголовок строки + данные.Я думаю, что Integer(sStr) просто возвращает этот указатель.(Или, на самом деле, просто обрабатывает sStr как целое число).

То есть вы должны сделать

SendMessage(StrToInt(sStr), WM_COPYDATA, Handle, cardinal(@copyDataStruct));
1 голос
/ 06 октября 2010

Определение SendMessage:

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;

Обновлено

Для Msg = wm_copydata:

  • Первый аргумент - дескриптор окно получения данных
  • Третий аргумент - дескриптор окна передача данных

Если вы называете первый аргумент sStr, я предполагаю, что это не дескриптор, а строка

0 голосов
/ 07 октября 2010

Я думаю, проблема в том, что вы пытаетесь использовать имя или что-то для своего окна, и это не сработает.

Попробуйте вместо этого:

var
  Wnd: HWnd;
begin
  Wnd := GetForegroundWindow(); // Assumes your target window is up front
  // Fill in CopyData structure here.
  SendMessage(Wnd, WM_COPYDATA, SomeWParamValue, Cardinal(@CopyDataStruct));
end;
...