使用`WM_COPYDATA`将字符串传递到另一个窗口

时间:2012-09-27 07:56:03

标签: api vb6 wm-copydata

我在vb6中使用此代码发送数据

cds.dwData = CLng(RegisterWindowMessage("MyWMCopyData"))
cds.cbData = Len(Message) * 2 ' characters are 2-bytes each
cds.lpData = StrPtr(Message) ' access the string's character buffer directly
' Send the string.
Dim i As Long:i = SendMessage(lHwnd, WM_COPYDATA, MainForm.hwnd, cds)

你可以帮助我使用代码来接收它吗?我有这个

Dim B() As Byte
ReDim B(0 To tCDS.cbData - 1) As Byte
CopyMemory B(0), ByVal tCDS.lpData, tCDS.cbData
Dim sData As String
sData = Trim$(StrConv(B, vbUnicode))

如果我发送Hello,我会将其作为H e l l o

2 个答案:

答案 0 :(得分:1)

你正在混合字符串转换。

您的发送代码发送指向完整unicode字符串的指针。 当你收到它时,你将它传递给StrConv(..., vbUnicode),它从ANSI转换为unicode,“破坏”字符串数据。

要解决此问题,您只需将最终字节数组直接分配给字符串:

sData = B

或者,您可以分配字符串长度并直接复制到其中:

Dim sData As String  
sData = String(tCDS.cbData / 2, vbNullChar) ' characters are 2-bytes each
CopyMemory ByVal StrPtr(sData), ByVal tCDS.lpData, tCDS.cbData

答案 1 :(得分:0)

字符串采用Unicode格式

在uncode中,每个单个字符占用2个字节,因为ASCII只有1个字节,所以我认为vb用空格填充另一个字节(可能)