【发布时间】:2012-09-25 06:58:20
【问题描述】:
我正在使用来自 vb6 应用程序的 WM_COPYDATA 向 delphi 应用程序发送数据。在我本地为英语的系统中,我正确接收数据,但在另一个使用荷兰语本地的系统上,接收文本是乱码。
接收app是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)
谁能告诉我做错了什么?
【问题讨论】:
-
你是如何发送数据的?根据您使用的 Delphi 版本,该字符串可以解释为 unicode 或 ANSI。如果你能确认你的VB代码发送方式,以及Delphi版本,我可以做一个合适的回答。
-
@Deanna,它有 Delphi 7 标签,所以你离它更近了一半;-)
-
我看到这意味着它正在进行 ANSI 转换。我还需要知道VB6的代码才能给出明确的答案。 D7 seems to support wide chars but the UI doesn't.
-
@Deanna,关于 D7,就像你说的那样。您可以声明
WideStrings,但当您使用ANSI 的内置组件时,它们将无法正确显示。 -
该代码似乎混淆了字节长度、字符长度和字符编码。我会尽快回答,解释发生了什么。
标签: delphi vb6 delphi-7 sendmessage wm-copydata