gpt4 book ai didi

delphi - 通过 WM_COPYDATA 在不同 Delphi 版本应用程序之间传输数据

转载 作者:行者123 更新时间:2023-12-03 18:15:46 26 4
gpt4 key购买 nike

我试图让 Delphi 应用程序通过 WM_COPYDATA 相互通信。我遇到的问题是发送方应用程序是用 Delphi 7 编写的,而接收方是用 Delphi 10.2 编写的。我将我的 Delphi 7 程序代码复制到 Delphi 10 中,通信工作正常。然而,在 Delphi 7 中使用完全相同的代码会导致我的字符串被传递到接收方应用程序而损坏。我使用的代码如下:

我有一个发送方:

procedure TSenderApp.SendString(ToSend: string);
var
copyDataStruct : TCopyDataStruct;

receiverHandle : THandle;
res : integer;
begin
copyDataStruct.dwData := 140500; //use it to identify the message contents
copyDataStruct.cbData := (1+ Length(ToSend))* SizeOf(Char) ;
copyDataStruct.lpData := pchar(ToSend) ;

receiverHandle := FindWindow(PChar('TRecieverApp'),PChar('RecieverApp')) ;
if receiverHandle = 0 then
begin
ShowMessage('CopyData Receiver NOT found!') ;
Exit;
end;

res := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle),
LPARAM(@copyDataStruct)) ;
end;

在接收端我有:

procedure TRecieverApp.WMCopyData(var Message: TMessage);
var
p : PCopyDataStruct;
l : Integer;
s : string;
begin
p := PCopyDataStruct( Message.lParam );

if (p <> nil) then
begin
ShowMessage('New Message Recieved!');
l := p^.cbData;
SetLength( s, (l+1) );
StrLCopy( PChar(s), PChar(p^.lpData), l );
Edit1.Text := s;
end
else
Edit1.Text := 'ERROR';
end;

我做错了什么?或者为什么从 Delphi 7 编写的 SenderApp 而不是从 Delphi 10 编写的 SenderApp 发送时消息字符串被损坏?

最佳答案

您正在使用 Char 的 native 编码发送和处理数据,在 Delphi 7 中为 AnsiChar 但在 Delphi 10.2 Tokyo 中为 WideChar (Delphi 在 D2009 中将所有内容都切换为 Unicode)。当 Delphi 7 以 ANSI 格式发送数据时,Delphi 10.2 将其错误解释为 UTF-16。反之亦然。因此,无论哪种方式,您最终都会腐败。

发送前需要将数据转换成约定的字符编码,接收后再从该编码转换。

尝试更像这样的东西:

{$IF CompilerVersion >= 24} // XE3+
{$LEGACYIFEND ON}
{$IFEND}

var
MyDataID: UINT = 0;

procedure TSenderApp.SendString(const ToSend: string);
var
copyDataStruct : TCopyDataStruct;
receiverHandle : HWND;
res : LRESULT;
s : UTF8String;
begin
if MyDataID = 0 then
begin
ShowMessage('CopyData ID NOT registered!');
Exit;
end;

receiverHandle := FindWindow('TRecieverApp', 'RecieverApp');
if receiverHandle = 0 then
begin
ShowMessage('CopyData Receiver NOT found!');
Exit;
end;

{$IF CompilerVersion >= 20} // D2009+
s := UTF8String(ToSend);
{$ELSE}
s := UTF8Encode(ToSend);
{$IFEND}

copyDataStruct.dwData := MyDataID; //use it to identify the message contents
copyDataStruct.cbData := Length(s) * SizeOf(AnsiChar);
copyDataStruct.lpData := PAnsiChar(s);
res := SendMessage(receiverHandle, WM_COPYDATA, WPARAM(Handle), LPARAM(@copyDataStruct));
end;

initialization
MyDataID := RegisterWindowMessage('MyDataID');

{$IF CompilerVersion >= 24} // XE3+
{$LEGACYIFEND ON}
{$IFEND}

var
MyDataID: UINT = 0;

procedure TRecieverApp.WMCopyData(var Message: TMessage);
var
p : PCopyDataStruct;
s : UTF8String;
begin
p := PCopyDataStruct(Message.lParam);
if (p <> nil) and (MyDataID <> 0) and (p^.dwData = MyDataID) then
begin
SetString(s, PAnsiChar(p^.lpData), p^.cbData);
{$IF CompilerVersion >= 20} // D2009+
Edit1.Text := String(s);
{$ELSE}
Edit1.Text := UTF8Decode(s);
{$IFEND}
ShowMessage('New Message Received!');
end else
inherited;
end;

initialization
MyDataID := RegisterWindowMessage('MyDataID');

关于delphi - 通过 WM_COPYDATA 在不同 Delphi 版本应用程序之间传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47487659/

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