SendMessage函数仅从M VC+;发送消息的第一个字符+;应用程序到接收器(Delphi应用程序)?

SendMessage函数仅从M VC+;发送消息的第一个字符+;应用程序到接收器(Delphi应用程序)?,delphi,visual-c++,sendmessage,Delphi,Visual C++,Sendmessage,SendMessage只发送第一条章程中的消息VC++,可以帮忙吗? 只收到第一份租船合同 实际上,这是我的完整发件人应用程序代码(VC++) //通知->文件名为UCHAR[255] HWND app=FindWindow(空,文本(“消息接收者”); 复制数据结构光盘; cds.dwData=0;//什么都可以 cds.cbData=sizeof(通知->文件名)-sizeof(UCHAR); cds.lpData=(void*)通知->文件名; SendMessageA(应用程序、WM_C

SendMessage只发送第一条章程中的消息VC++,可以帮忙吗? 只收到第一份租船合同

实际上,这是我的完整发件人应用程序代码(VC++)

//通知->文件名为UCHAR[255]
HWND app=FindWindow(空,文本(“消息接收者”);
复制数据结构光盘;
cds.dwData=0;//什么都可以
cds.cbData=sizeof(通知->文件名)-sizeof(UCHAR);
cds.lpData=(void*)通知->文件名;
SendMessageA(应用程序、WM_COPYDATA、(WPARAM)应用程序、(LPRAM)和CD);
我的接收器代码(Delphi)

过程TfrmReceiver.WMCopyData(var Msg:TWMCopyData);
变量
sText:Char的数组[0..255];
s:字符串;
ms:TMemoryStream;
开始
案例Msg.CopyDataStruct.dwData of
0:{Receive Text,Text empfangen}
开始
StrLCopy(sText,Msg.CopyDataStruct.lpData,Min(Length(sText),Msg.CopyDataStruct.cbData));
标签1.标题:=sText;
结束;
1:{接收图像,Bild empfangen}
{
开始
ms:=TMemoryStream.Create;
尝试
使用Msg.CopyDataStruct^do
ms.Write(lpdata^,cbdata);
女士职位:=0;
image1.Picture.Bitmap.LoadFromStream(毫秒);
最后
弗里女士;
结束;
结束;}
结束;
结束;

您似乎在混合使用unicode和ansi字符串。在第一种情况下不要使用文本宏,请使用纯ansi字符串。 片段sizeof(TEXT(“Message Receiver”)-sizeof(UCHAR)将计算unicode字符串的无效大小


当您将Unicode字符串文本(“消息接收器”)读取到delphi字符数组时,它将被处理为“M”,因为Unicode中的“M”是两个字符—“M”和零。

您将以8位Ansi格式发送数据。但是,如果您使用的是Delphi 2009或更高版本(您没有说),其中
String
Char
是Unicode,那么您将遇到问题

将您的Delphi代码更改为以下代码,这将适用于所有版本:

procedure TfrmReceiver.WMCopyData(var Msg: TWMCopyData);
var
  sText: AnsiString;
  ms: TMemoryStream;
begin
  case Msg.CopyDataStruct.dwData of
    0: { Receive Text, Text empfangen}
    begin
      SetString(sText, PAnsiChar(Msg.CopyDataStruct.lpData), Msg.CopyDataStruct.cbData);
      Label1.Caption := Trim(sText);
    end;
    1: { Receive Image, Bild empfangen}
    {
    begin
      ms := TMemoryStream.Create;
      try
        with Msg.CopyDataStruct^ do
          ms.Write(lpData^, cbData);
        ms.Position := 0;
        Image1.Picture.Bitmap.LoadFromStream(ms);
      finally
        ms.Free;
      end;
    end;
    }
  end;
end;

如果更改C++代码发送实际的<>代码>文件名长度,而不是盲目发送255,那么可以从Delphi代码中删除<代码>三()代码/代码>

此代码的另一个问题是,对于
dwData
值,0和1是非常糟糕的选择。您应该在两侧使用
RegisterWindowMessage()
,以生成更独特的值,这些值不太可能与其他人使用
WM\u COPYDATA
冲突(例如,即使VCL在内部也使用
WM\u COPYDATA
)。例如:

const UINT MyTextMsg = RegisterWindowMessage(TEXT("MyTextMsg"));
// ...
if (MyTextMsg != 0)
{
    COPYDATASTRUCT cds;
    cds.dwData = MyTextMsg;
    // ...
}

var
MyTextMsg:UINT=0;
MyImageMsg:UINT=0;
程序TfrmReceiver.WMCopyData(var Msg:TWMCopyData);
变量
sText:AnsiString;
ms:TMemoryStream;
开始
如果(Msg.CopyDataStruct.dwData=MyTextMsg)和(MyTextMsg 0),则
开始
// ...
结束
否则,如果(Msg.CopyDataStruct.dwData=MyImageMsg)和(MyImageMsg 0),则
开始
// ...
结束;
结束;
初始化
MyTextMsg:=RegisterWindowMessage('MyTextMsg');
MyImageMsg:=RegisterWindowMessage('MyImageMsg');

另外,这只是一个优化—如果您从
TCustomMemoryStream
派生类而不是使用
TMemoryStream
,则可以将
lpData
指针传递到
TCustomMemoryStream.SetPointer()
so
LoadFromStream()
将能够直接读取消息数据,您不必在内存中单独复制该数据。

感谢您的回复,我已经用确切的问题修改了问题,如果可以请帮助?不要对您的答案进行向下投票,但是
文本
宏仅用于调用
FindWindow
,据我所知。由于它没有在任何地方与
COPYDATASTRUCT
相关的数据一起使用,因此它与这里的问题无关。(没有检查
FindWindow
的返回值有一个问题,但这似乎不是问题所在。)问题的第一个版本中有几个文本宏我还有一些其他项目要完成,但我将尝试完成这项工作,由于第一个字符发送,目前处于暂停状态,无论我发送什么字符串,Receiver始终接收第一个charter问题已解决,返回的缓冲区在每个charter后都有以null结尾的字符串#0,谢谢各位:)请指定Delphi版本。请做一些调试。发送了哪些字节,接收了哪些字节?请编辑问题以添加我请求的详细信息。感谢回复,我已经更正了delphi代码,但问题是相同的,我有delphi 5,应用程序只是没有收到完整字符串,只有第一个字节,看来,问题是在VStudio代码中,除了使用的代码> DWDATAs/Cuff>值之外,您所显示的C++代码没有错。code>UCHAR的大小为1个字节,并且您总是发送255个字节,因此只要
FileName
使用8位字符串数据(可能是这样),那么就没有什么可以阻止Delphi正确接收完整数据。这就是为什么David要求您显示发送和接收的实际字节。我正在解决这个问题,但它仍然不起作用,无论如何,谢谢,Delphi代码在Delphi到Delphi应用程序之间正常工作,但vc++到Delphi没有。您是否验证了
cbData
是否正确?在复制
lpData
数据时,您是否确实考虑了
cbData
?您的数据中是否包含任何
#0
字节,例如在第二个数组插槽中?听起来你正在做的事情与这里显示的不同,所以请更新你的问题并复制/粘贴你的真实代码或文件。
var
  MyTextMsg: UINT = 0;
  MyImageMsg: UINT = 0;

procedure TfrmReceiver.WMCopyData(var Msg: TWMCopyData);
var
  sText: AnsiString;
  ms: TMemoryStream;
begin
  if (Msg.CopyDataStruct.dwData = MyTextMsg) and (MyTextMsg <> 0) then
  begin
    // ...
  end
  else if (Msg.CopyDataStruct.dwData = MyImageMsg) and (MyImageMsg <> 0) then
  begin
    // ...
  end;
end;

initialization
  MyTextMsg := RegisterWindowMessage('MyTextMsg');
  MyImageMsg := RegisterWindowMessage('MyImageMsg');