SendMessage и PostMessage Delphi
Отправляю другой программе данные после работы, отправляю строкой. Хотел бы понять почему PostMessage не работает в то время как SendMessage отправляет данные. Мне не нужно возвращать результат после отправки сообщений, поэтому я хочу отказать от SendMessage.
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure SendData(const copyDataStruct: TCopyDataStruct);
procedure Button1Click(Sender: TObject);
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
stringToSend: string;
copyDataStruct: TCopyDataStruct;
begin
stringToSend := 'Avtorize sucefull';
copyDataStruct.dwData := 0; // идентифицировать данные
copyDataStruct.cbData := 1 + Length(stringToSend);
copyDataStruct.lpData := PChar(stringToSend);
SendData(copyDataStruct);
end;
procedure TForm2.SendData(const copyDataStruct: TCopyDataStruct);
var
receiverHandle: THandle;
res: integer;
begin
receiverHandle := FindWindow(PChar('TForm2'), PChar('Form2'));
if receiverHandle = 0 then
begin
form2.Memo1.Lines.Add(IntToStr(receiverHandle) + ' No');
Exit;
end;
// res := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct));
PostMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct));
form2.Memo1.Lines.Add(IntToStr(receiverHandle));
end;
procedure TForm2.WMCopyData(var Msg: TWMCopyData);
var
s: string;
begin
form2.Memo1.Lines.Add('sd');
s := PChar(Msg.CopyDataStruct.lpData);
form2.Memo1.Lines.Add(s);
Msg.Result := 2006; //Отошлем что-нибудь назад
end;
end.
Ответы (1 шт):
Автор решения: zed
→ Ссылка
Функция PostMessage не может отправлять сообщения типа WM_COPYDATA.
Вот тут длинный пост, с объяснением:
Если в двух словах, то это связано с тем, что системе надо знать в какой момент сообщение доставлено и уже можно освободить внутренние буферы. Очевидно, что это можно сделать только используя синхронный вызов SendMessage.