Delphi10.4向Delphi6发送消息仅接收首字符,求解决方案
问题解决:Delphi 10.4向Delphi 6发送字符串仅接收第一个字符
核心问题分析
- 字符串编码不匹配:Delphi 10.4默认
string是UnicodeString(UTF-16双字节编码),而Delphi 6的string是ANSIString(单字节编码)。发送端直接传递宽字符指针时,接收端按ANSI解析会把宽字符的高字节(通常为0)当作字符串结束符,导致仅读取第一个字符。 - 数据长度计算错误:发送端用
SizeOf(PChar(psValue))仅计算了指针的大小(32位下4字节、64位下8字节),并没有传递字符串实际的字节数。 - COPYDATASTRUCT跨版本兼容:Delphi 10.4的
dwData是ULONG_PTR,Delphi 6是DWORD,若发送端为64位程序需注意指针转换,但编码和长度问题是当前的核心矛盾。
修复后的代码
发送端(Delphi 10.4)
将Unicode字符串转换为ANSI字符串匹配Delphi 6编码,并修正数据长度计算:
procedure TfrmMain.sendMessageToApp(psValue: string); var DataStruct: CopyDataStruct; AnsiStr: AnsiString; begin // 把Unicode字符串转为ANSI字符串,适配Delphi 6的编码 AnsiStr := AnsiString(psValue); DataStruct.dwData := 0; // 计算字符串总字节数,包含结尾的null终止符 DataStruct.cbData := Length(AnsiStr) + 1; DataStruct.lpData := PAnsiChar(AnsiStr); // 用LPARAM替代Integer,适配64位程序的指针传递 SendMessage( FindWindow(nil, PChar(Self.psFormTitleERP)), WM_COPYDATA, Self.Handle, LPARAM(@DataStruct)); end;
接收端(Delphi 6)
修正变量名笔误后直接按ANSI字符串解析:
procedure TForm1.WMCopyData(var Msg: TWMCopyData); var psMessage: String; begin // Delphi 6中PChar默认是PAnsiChar,直接转换即可 psMessage := PChar(Msg.CopyDataStruct.lpData); ShowMessage(psMessage); end;
额外优化建议
如果需要支持多语言避免ANSI编码丢失字符,可以改为传递UTF-8字符串:
- 发送端:将字符串转UTF-8,
UTF8Str := UTF8Encode(psValue);,cbData := Length(UTF8Str) + 1,lpData := PAnsiChar(UTF8Str) - 接收端:引用
UTF8单元后,psMessage := UTF8Decode(PChar(Msg.CopyDataStruct.lpData));
另外建议保持发送端和接收端的程序位数一致(均为32位或均为64位),减少跨位数指针转换的潜在问题。
内容的提问来源于stack exchange,提问作者André Martin
相关产品推荐
相关产品推荐

