gpt4 book ai didi

delphi - 从vb6到delphi用WM_COPYDATA发送消息是乱码

转载 作者:行者123 更新时间:2023-12-02 01:33:19 24 4
gpt4 key购买 nike

我正在使用 vb6 应用程序中的 WM_COPYDATA 将数据发送到 delphi 应用程序。在我的本地为英语的系统中,我正确接收数据,但在另一个本地为荷兰语的系统上,接收文本是乱码。

接收应用程序是delphi,代码是

procedure TReceiverMainForm.WMCopyData(var Msg: TWMCopyData);
var
copyDataType: TCopyDataType;
begin
copyDataType := TCopyDataType(Msg.CopyDataStruct.dwData);

//Handle of the Sender
mmoResult.Lines.Add(Format('WM_CopyData from: %d', [msg.From]));

case copyDataType of
cdtString: HandleCopyDataString(Msg.CopyDataStruct);
end;

//Send something back
msg.Result := mmoResult.Lines.Count;
end;

procedure TReceiverMainForm.HandleCopyDataString(
copyDataStruct: PCopyDataStruct);
var
s: string;
begin
s := PChar(copyDataStruct.lpData);
mmoResult.Lines.Add(s);
end;

编辑

这是发送数据的vb6代码,发送的数据是字符串

Dim buf() As Byte
ReDim buf(1 To LenB(Message))
Call CopyMemory(buf(1), ByVal Message, Len(Message))
cds.dwData = 0
cds.cbData = Len(Message) + 1
cds.lpData = VarPtr(buf(1))
' Send the string.
Dim i As Long
i = SendMessage(lHwnd, WM_COPYDATA, MainForm.hwnd, cds)

谁能告诉我我做错了什么?

最佳答案

VB 字符串基于 COM BSTR 字符串类型,就像 Delphi 的 WideString 字符串类型一样。 BSTR 是 UTF-16 编码的 Unicode 字符串。 LenB() 返回 VB 字符串在转换为本地计算机的当前语言环境时占用的字节数。你没有考虑到这一点。您没有将字符串字节正确复制到缓冲区中,也没有将 cds.cbData 字段设置为正确的值。 Len() 返回字符串中 UTF-16 编码字符的数量,而 LenB() 返回字节数。对于英文字符串,Len()LenB() 将返回相同的值,但对于外语则不能保证。

我建议您按原样发送原始 VB Unicode 编码数据,并更改您的 Delphi 代码以将传入数据视为 Unicode 而不是像当前所做的那样处理 Ansi (PChar 是 Delphi 中的 Ansi 7,但在 Delphi 2009+ 中是 Unicode)。

您还需要为 cds.dwData 字段分配一个唯一值。 WM_COPYDATA 由 VCL 用于其自身的一些内部数据,因此您必须区分 WM_COPYDATA 消息和 VCL 的消息。

试试这个:

cds.dwData = RegisterWindowMessage("MyWMCopyData")
If cds.dwData <> 0 Then
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)
End If

.

var
uMyWMCopyDataMsg: UINT = 0;

procedure TReceiverMainForm.WMCopyData(var Msg: TWMCopyData);
var
s: WideString; // you can use UnicodeString in D2009+
begin
if (uMyWMCopyDataMsg = 0) or (Msg.CopyDataStruct.dwData <> uMyWMCopyDataMsg) then
begin
inherited;
Exit;
end;

mmoResult.Lines.Add(Format('WM_CopyData from: %d', [msg.From]));

SetString(s, PWideChar(Msg.CopyDataStruct.lpData), Msg.CopyDataStruct.cbData div SizeOf(WideChar));
mmoResult.Lines.Add(s);

msg.Result := mmoResult.Lines.Count;
end;

initialization
uMyWMCopyDataMsg := RegisterWindowMessage('MyWMCopyData');

关于delphi - 从vb6到delphi用WM_COPYDATA发送消息是乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12577701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com