使用SendData会在收到时导致损坏的字符串

Rob*_*ank 3 delphi

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

接收器显示的字符串部分是垃圾.我怀疑这是因为当我使用Windows API与Delphi 2010进行通信时,我会发出Unicode.

我希望能够在可能的情况下处理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;
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*nan 7

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

+1是必需的,因为您的接收器将其解释为以null结尾的字符串.因此,您的代码应为:

(1 + Length(StringToSend))*SizeOf(Char)
Run Code Online (Sandbox Code Playgroud)

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