【发布时间】:2015-12-21 04:46:36
【问题描述】:
基于this post我写了一个简单的项目来沟通两个应用程序,但它只工作一次,也不完美。
如果我发送“stackoverflow”,我将在另一侧收到一次“stackov”。 WMGetData 过程似乎不再触发。
发件人代码:
procedure TForm1.Button1Click(Sender: TObject);
var
CDS: TCopyDataStruct;
receiverHandle : THandle;
res : integer;
S: string;
begin
S:= Edit1.Text;
CDS.dwData:= 0; //Identify message
CDS.cbData:= Length(S);
CDS.lpData:= PChar(S);
receiverHandle := FindWindow(PChar('TForm2'),PChar('Form2')) ;
if receiverHandle <> 0 then
res := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@CDS))
else
Caption:= 'Not Found';
Caption:= IntToStr(Res);
CloseHandle(receiverHandle);
end;
接收方代码:
TForm2 = class(TForm)
procedure WMGetData(var Msg : TWMCopyData) ; message WM_COPYDATA;
...
procedure TForm2.WMGetData(var Msg: TWMCopyData);
var
S: string;
begin
S:= PChar(Msg.CopyDataStruct.lpData);
Caption := Caption + S;
msg.Result := 2006; //ACK for sender app.
end;
【问题讨论】:
-
你为什么要投到
Integer?切换到 64 位时会出现 32 位截断错误。这些参数是WPARAM和LPARAM。永远不要在窗口句柄上调用CloseHandle。CloseHandle用于 kernel32 句柄而不是 user32 窗口句柄。你不需要做任何事情来整理你不拥有的窗口句柄。 -
@David 感谢您的提示。我不知道为什么它被铸造了。那是一个有名的。关于
CloseHandle我看到另一个demo 以try/finally 方式关闭句柄。 -
我不知道该评论什么。我认为您的方法在这里不是很好。
-
详细说明,您在这里接受了一个不正确且不完整的答案。您还指出了网络上一篇包含错误的无法署名的古老文章。不要相信你在网上读到的一切。检查并验证。