gpt4 book ai didi

delphi - 使用 SendData 会导致收到的字符串损坏

转载 作者:行者123 更新时间:2023-12-03 15:43:54 25 4
gpt4 key购买 nike

我正在尝试使用从此处改编的代码在两个 Delphi 表单之间发送字符串:http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm .

接收器显示的字符串部分是垃圾。我怀疑这是因为 Delphi 2010 与 Windows API 通信时出现 Unicode I 问题。

如果可能的话,我希望能够处理 Unicode。

我一直无法找出下面代码中的强制转换错误的地方。有什么帮助吗?

发送表单:

procedure TForm1.gridDetailsDblClick(Sender: TObject);
var
StringToSend : String;
CopyDataStruct : TCopyDataStruct;
begin
StringToSend := StringGrid1.Cells[0, StringGrid1.Row];
CopyDataStruct.dwData := 0;
CopyDataStruct.cbData := 1 + Length(StringToSend) ;
CopyDataStruct.lpData := PChar(StringToSend) ;
SendDataToAppearanceForm(copyDataStruct) ;
end;

procedure TForm1.SendDataToAppearanceForm(const CopyDataStruct: TCopyDataStruct) ;
var
ReceiverHandle : THandle;
begin
ReceiverHandle := FindWindow(PChar('TForm2'), nil);
if (ReceiverHandle <> 0) then
SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@CopyDataStruct)) ;
end;

接收表单:(这会导致编辑框包含字符串的一部分,但随后是垃圾。)

procedure TForm2.WMCopyData(var Msg: TWMCopyData);
var
S: String;
begin
edText.Text := PChar(Msg.CopyDataStruct.lpData);
end; { WMCopyData }

最佳答案

您的问题是您设置的cbData不正确。这是字节数,而不是字符数。

需要+1,因为您的接收者将其解释为以空结尾的字符串。因此你的代码应该是:

(1 + Length(StringToSend))*SizeOf(Char)

或者,您可以在接收端使用 SetString()cbdata 来避免需要 +1

关于delphi - 使用 SendData 会导致收到的字符串损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5929720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com