You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:18:24