gpt4 book ai didi

delphi - 如何使用 SendMessage 在 2 个应用程序之间发送数据?

转载 作者:行者123 更新时间:2023-12-02 11:01:50 25 4
gpt4 key购买 nike

我有 2 个应用程序 - Manager 具有以下代码:

procedure TForm1.CopyData(var Msg: TWMCopyData);
var sMsg: String;
begin
if IsIconic(Application.Handle) then Application.Restore;
sMsg := PWideChar(Msg.CopyDataStruct.lpData);

Caption := Caption+'#'+sMsg;

Msg.Result := 123;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
WM_MY_MESSAGE = WM_USER + 1;
var
h: HWND;
begin
Caption := 'X';
h := FindWindow('TForm1', 'Client');
if not IsWindow(h) then Exit;

Caption := Caption+'@';
SendMessage(h, WM_MY_MESSAGE, 123, 321);
end;

客户:

procedure TForm1.WndProc(var Message: TMessage);
const
WM_MY_MESSAGE = WM_USER + 1;
var DataStruct: CopyDataStruct;
S: String;
h: HWND;
begin
inherited;
if Message.Msg <> WM_MY_MESSAGE then Exit;


h := FindWindow('TForm1', 'Manager');
if not IsWindow(h) then Exit;

Message.Result := 123;

S := Edit2.Text + '@' + Edit1.Text;
DataStruct.dwData := 0;
DataStruct.cbData := 2*Length(S)+1;
DataStruct.lpData := PWideChar(S);

Caption := Caption + '#';

PostMessage(h, WM_CopyData, Form1.handle, integer(@DataStruct));
end;

该代码有效,但只能运行一次。管理器发送 2 个整数:123 和 321 作为“唤醒”消息给客户端。客户端通过发送Edit1+Edit2的内容来响应。然后 Manager 获取此数据并显示在其标题上。

为什么它只能运行一次?当我再次点击 Button1 后,它什么也没做。

最佳答案

如注释中所述,您必须将 SendMessageWM_COPYDATA 一起使用。主要原因是消息发送者负责清理用于传输的资源。如前所述in the documentation :

The receiving application should consider the data read-only. The lParam parameter is valid only during the processing of the message. The receiving application should not free the memory referenced by lParam. If the receiving application must access the data after SendMessage returns, it must copy the data into a local buffer.

唯一可行的方法是消息发送者等待接收者处理消息并返回结果。否则发送者无法知道何时可以安全地释放这些资源。

PostMessage 是异步的并立即返回,因此这是不可行的。 SendMessage 将阻塞,直到接收者处理消息并分配返回值。

在这里,您将指针传递给堆栈分配(局部变量)记录@DataStruct。此外,您还传递了一个指向字符串的指针,该字符串是局部变量。如果您使用 PostMessage,此方法将立即返回 - 堆栈位置(对于记录等值类型)将变得无效并容易被覆盖。该字符串位于堆上,但进行了引用计数,在这种情况下,该字符串将在方法返回时被释放。

解决方案是始终确保将 SendMessageWM_COPYDATA 一起使用。

关于delphi - 如何使用 SendMessage 在 2 个应用程序之间发送数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30757505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com