1

) 我正在尝试从 VB 应用程序向 Delphi 应用程序发送一个短文本。这是 VB 代码:Sender Program “Sender”

Public Class SendData

 Const WM_COPYDATA = &H4A
 Public Structure CopyDataStruct
    Public dwData As Integer
    Public cbData As Integer
    Public lpData As String
 End Structure

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ 
 (ByVal hWnd As Long,  ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As _
 CopyDataStruct) As Long

Private Sub SendData(ByVal cds)
    Dim iHwnd As Long
    Dim SS As String = "Test String less than 30 Char"
    Dim cds As CopyDataStruct
    cds.dwData = 0
    cds.cbData = Len(SS)
    cds.lpData = SS
    iHwnd = FindWindow(0&, "Receive")
    SendMessage(iHwnd, &H4A, Me.Handle, cds) 
End Sub

这是德尔福代码:接收程序“接收”

 procedure TForm1.HandleCopyDataString(copyDataStruct: PCopyDataStruct);
 var
  s : string;
 begin
  s := PChar(CopyDataStruct.lpData);
  cdMemo.Lines.Add(Format('Received data "%s" at %s',[s, TimeToStr(Now)]));
 end;

 procedure TForm1.WMCopyData(var Msg: TWMCopyData) ;
 var
  s : string;
  sText: array[0..255] of Char;
  copyDataType : TCopyDataType;
 begin
  copyDataType := TCopyDataType(Msg.CopyDataStruct.dwData);
  s := PChar(Msg.CopyDataStruct.dwData);
  Form1.cdMemo.Lines.Add(Format('Data from: %d',[msg.From]));
  HandleCopyDataString(Msg.CopyDataStruct);
  case Msg.CopyDataStruct.dwData of 0: //we are being sent a string
  begin
    StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
    Form1.Label1.Caption := sText;
  end;
end;
end;

我在这里做错了什么?可以使用 WM_COPYDATA 命令和 SendMessage 函数将字符串从 VB 发送到 Delphi 程序吗?

请帮我 :-)

F

4

1 回答 1

5

您的 Delphi 代码有一些问题。

  1. dwData字段包含一个integer,但您将其类型转换为PChar,一个指针,然后将其分配给您的字符串。那不是您存储字符串数据的字段。那就是lpData

  2. 您传递的字符串不是以空值结尾的。操作系统只承诺复制您在cbData字段中指定的字节数。这不一定是问题,但您需要在稍后阅读字符串时意识到这一点。要分配s以保存从其他进程复制的字符串,请使用SetString如下:

    SetString(s, PAnsiChar(Msg.CopyDataStruct.lpData), Msg.CopyDataStruct.cbData);
    
  3. 您还没有显示TCopyDataType它是什么,但如果它不是整数或整数子范围类型,那么您使用它是错误的。该dwData字段已经是 a DWord,因此您可以在需要数值的任何地方使用它。

  4. 你叫StrLCopy错了。第三个参数应该是目标缓冲区的大小,而不是源缓冲区。它的目的是通过不复制超出目标范围的字符来防止缓冲区溢出。该函数希望能够通过查找终止空字符来检测源缓冲区的大小(但我们已经确定这将不可用)。你可以像这样修复它:

    StrLCopy(sText, Msg.CopyDataStruct.lpData,
      Min(Length(sText), Msg.CopyDataStruct.cbData));
    

    Min数学单元中。)

于 2011-04-05T14:53:11.317 回答