Delphi 德尔菲:WM_COPYDATA工作一次

Delphi 德尔菲:WM_COPYDATA工作一次,delphi,winapi,delphi-xe,Delphi,Winapi,Delphi Xe,基于此,我写了一个简单的项目来沟通两个应用程序,但它只工作一次,也不完美 如果我发送“stackoverflow”,我将在另一侧收到“stackov”,并且只收到一次。似乎不再触发WMGetData过程 发件人代码: 按规定 应该是 CDS.cbData:= Length(S) * SizeOf(S[1]) 因为cbData成员应该包含您传输的字节数,并且delphi XEstringtype引用unicode字符串(每个字符2个字节) 你的第二个问题 receiverHandle := F

基于此,我写了一个简单的项目来沟通两个应用程序,但它只工作一次,也不完美

如果我发送“stackoverflow”,我将在另一侧收到“stackov”,并且只收到一次。似乎不再触发
WMGetData
过程

发件人代码:

按规定

应该是

CDS.cbData:= Length(S) * SizeOf(S[1])
因为cbData成员应该包含您传输的字节数,并且delphi XE
string
type引用unicode字符串(每个字符2个字节)

你的第二个问题

receiverHandle := FindWindow(PChar('TForm2'),PChar('Form2')) ;
我的最佳猜测是,此调用第二次失败,因为您将第二个表单的标题更改为Form2Stackov。

如指定

应该是

CDS.cbData:= Length(S) * SizeOf(S[1])
因为cbData成员应该包含您传输的字节数,并且delphi XE
string
type引用unicode字符串(每个字符2个字节)

你的第二个问题

receiverHandle := FindWindow(PChar('TForm2'),PChar('Form2')) ;

我的最佳猜测是,此调用第二次失败,因为您将第二个表单的标题更改为Form2Stackov。

值得注意:
cb
是匈牙利符号前缀,是字节计数的缩写。指定字符计数的符号有一个
cch
前缀。RTL在
SysUtils
单元中有一个函数,它返回
字符串的字符负载占用的字节数,例如:
CDS.cbData:=ByteLength(s)这仍然是错误的,因为接收器依赖于空终止符。因此,要么在接收器中使用字节计数(更好),要么在发送器中使用
Length()+1
。正如我在对这个问题的评论中提到的,还有更多的错误。注意使用tellength
。仅对本机UTF-16字符串有用。对于字节字符串,您将找到转换为UTF-16的字符串,然后是报告的字节长度。按设计,但有混淆的余地。@David,我不明白你说的更好的解决方案,混淆的部分是它有一个“或”
Length(S)
当S成为一个AnsiString时,它起作用了。值得注意的是:
cb
是匈牙利符号前缀,是字节计数的缩写。指定字符计数的符号有一个
cch
前缀。RTL在
SysUtils
单元中有一个函数,它返回
字符串的字符负载占用的字节数,例如:
CDS.cbData:=ByteLength(s)这仍然是错误的,因为接收器依赖于空终止符。因此,要么在接收器中使用字节计数(更好),要么在发送器中使用
Length()+1
。正如我在对这个问题的评论中提到的,还有更多的错误。注意使用tellength
。仅对本机UTF-16字符串有用。对于字节字符串,您将找到转换为UTF-16的字符串,然后是报告的字节长度。按设计,但有混淆的余地。@David,我不明白你说的更好的解决方案,混淆的部分是它有一个“或”<代码>长度
当S成为一个AnsiString时,它起作用了。你为什么要转换为
整数
?切换到64位时,32位截断错误在前面。这些参数是
WPARAM
LPARAM
。永远不要在窗口句柄上调用
CloseHandle
CloseHandle
用于内核32句柄,而不是user32窗口句柄。你不需要做任何事情来整理你没有的窗户把手。@David谢谢你的提示。我不知道为什么要铸造。那是一个著名的。关于
CloseHandle
我看到另一个以try/finally的方式关闭handle。我不确定该如何看待这个评论。我认为你的方法不太好。更详细地说,你在这里接受了一个既不正确又不完整的答案。您已经指出了Web上一篇不可发布的古代文章,其中包含错误。不要相信你在网上看到的一切。检查并验证。为什么要强制转换为
整数
?切换到64位时,32位截断错误在前面。这些参数是
WPARAM
LPARAM
。永远不要在窗口句柄上调用
CloseHandle
CloseHandle
用于内核32句柄,而不是user32窗口句柄。你不需要做任何事情来整理你没有的窗户把手。@David谢谢你的提示。我不知道为什么要铸造。那是一个著名的。关于
CloseHandle
我看到另一个以try/finally的方式关闭handle。我不确定该如何看待这个评论。我认为你的方法不太好。更详细地说,你在这里接受了一个既不正确又不完整的答案。您已经指出了Web上一篇不可发布的古代文章,其中包含错误。不要相信你在网上看到的一切。核实。
receiverHandle := FindWindow(PChar('TForm2'),PChar('Form2')) ;