使用WndProc

时间:2017-01-30 21:47:00

标签: c# winforms c++-cli wndproc

我试图将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);
}

在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;
    }
}   

我没有得到例外,但是我没有收到我发送的地址,而是获得了Unicode垃圾。

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

1 个答案:

答案 0 :(得分:5)

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

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

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