Delphi 德尔菲:WM_COPYDATA工作一次
基于此,我写了一个简单的项目来沟通两个应用程序,但它只工作一次,也不完美 如果我发送“stackoverflow”,我将在另一侧收到“stackov”,并且只收到一次。似乎不再触发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
WMGetData
过程
发件人代码:按规定 应该是
CDS.cbData:= Length(S) * SizeOf(S[1])
因为cbData成员应该包含您传输的字节数,并且delphi XEstring
type引用unicode字符串(每个字符2个字节)
你的第二个问题
receiverHandle := FindWindow(PChar('TForm2'),PChar('Form2')) ;
我的最佳猜测是,此调用第二次失败,因为您将第二个表单的标题更改为Form2Stackov。如指定
应该是
CDS.cbData:= Length(S) * SizeOf(S[1])
因为cbData成员应该包含您传输的字节数,并且delphi XEstring
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')) ;