Fre*_*red 1 vb.net delphi sendmessage wm-copydata
)我试图从VB应用程序发送一个简短的文本到Delphi应用程序..这是VB代码:发件人程序"发件人"
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
Run Code Online (Sandbox Code Playgroud)
这里是德尔福代码:接收程序"接收"
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;
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?可以使用WM_COPYDATA命令和SendMessage函数将字符串从VB发送到Delphi程序吗?
请帮我 :-)
F
您的Delphi代码有一些问题.
该dwData
字段包含一个整数,但您将其类型转换PChar
为指针,然后将其分配给您的字符串.这不是存储字符串数据的字段.那是lpData
.
您传递的字符串不以空值终止.操作系统仅承诺复制与您在cbData
字段中指定的字节数完全相同的字节数.这不一定是个问题,但是当你稍后阅读字符串时需要注意它.要指定s
保存从其他进程复制的字符串,请使用SetString
如下所示:
SetString(s, PAnsiChar(Msg.CopyDataStruct.lpData), Msg.CopyDataStruct.cbData);
Run Code Online (Sandbox Code Playgroud)你没有显示出什么TCopyDataType
,但如果它不是整数或整数 - 子范围类型,你使用它是错误的.该dwData
字段已经是a DWord
,因此您可以在期望数值的任何地方使用它.
你StrLCopy
打错了.第三个参数应该是目标缓冲区的大小,而不是源.这意味着通过不复制比目标中适合的更多字符来防止缓冲区溢出.该函数希望能够通过查找终止空字符来检测源缓冲区的大小(但我们已经确定了该字符将不可用).你可以像这样解决它:
StrLCopy(sText, Msg.CopyDataStruct.lpData,
Min(Length(sText), Msg.CopyDataStruct.cbData));
Run Code Online (Sandbox Code Playgroud)
(Min
在数学单元中.)
归档时间: |
|
查看次数: |
1265 次 |
最近记录: |