使用WndProc将字符串从C++发送到C#进程

Kev*_*inA 0 c# c++-cli wndproc winforms

我正在尝试从C++/CLI向C#/ WinForms发送一个字符串

这是我的PostMessage

void Browser::NavigateTo(System::String^ address){
    GCHandle gch = GCHandle::Alloc(address, GCHandleType::Pinned);
    auto GCPin = gcHandle.AddrOfPinnedObject();
    ::PostMessage(procWndHandle, WM_NAVTO, 0, (LPARAM &GCPin);
}
Run Code Online (Sandbox Code Playgroud)

在Winform函数中,我试图像这样编组它

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust"]
protected override void WndProc(ref Message m)
switch (m.Msg) {
    case WM_NAVTO:
        string s = Marshal.PtrToStringUni(m.LParam);
        break;
    }
}   
Run Code Online (Sandbox Code Playgroud)

我没有得到异常,但是我没有得到我发送的地址,而是我得到了Unicode Garbage.

我确信我错过了一些基本的东西,但我似乎无法看到它.有人可以帮忙吗?

Dav*_*Yaw 5

您当前的代码存在一些问题:

  1. PostMessage在返回之前不等待接收应用程序.因此,固定对象在处理消息之前变为取消固定,并且可以移动到存储器中的新位置.(这可能不是这里的主要问题.)
  2. 假设您的C++/CLI和C#组件是完全独立的进程,您所做的是将一个进程空间中的指针发送到另一个进程.该指针不再有效.

要修复#2,您需要以某种方式将内存从一个进程复制到另一个进程.

  1. 正如Hans Passant在评论中所说,您可以使用命名管道将您喜欢的任何数据发送到其他应用程序.这可能是最好的解决方案,绝对是最全功能的.
  2. 如果您必须坚持使用Windows消息,请使用该WM_COPYDATA消息.此消息将Windows将您的数据(在本例中为字符串内容)从一个进程复制到另一个进程.请参阅MSDN上的" 使用数据复制"示例.