我想讓Delphi應用程序通過WM_COPYDATA與其他應用程序進行通信。我遇到的問題是發件人應用程序是用Delphi 7編寫的,而接收器是用Delphi 10.2編寫的。我將Delphi 7程序的代碼複製到了Delphi 10中,並且通信非常完美。然而,在Delphi 7中使用完全相同的代碼卻導致我的字符串被傳遞給接收器應用程序以損壞。是我使用的代碼如下:通過WM_COPYDATA在不同的Delphi版本應用程序之間傳輸數據
一個發送端,我有:
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發送的消息字符串被破壞?
這將是最好使用'WideChar'用UTF-16發送數據,或使用UTF-8'AnsiChar'。根本不要使用ANSI。 –
@RemyLebeau謝謝你,在此期間計算出來,但不知道如何轉換數據。 –
您需要取消引用您在Move()中第一個參數傳遞的指針,並在第二個參數中刪除「@」:Move(PAnsiChar(p^.lpData)^,S [1],l )'。另外,你的'cbData'值已經包含null結束符,所以你不需要在接收端使用'+ 1'。如果有的話,你應該使用'-1'來忽略空終止符。或者更好的是,根本不發送空終止符,你不需要它 –