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

Send String from C++ to C# processes using 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. PostMessage不等待接收申请才返回。因此,固定的对象在消息被处理之前变为取消固定,并且可能被移动到内存中的新位置。 (这可能不是这里的主要问题。)
  2. 假设您的 C++/CLI 和 C# 组件是完全独立的进程,您正在做的是将一个进程中的指针 space 发送到另一个进程。该指针不再有效。

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

  1. 正如 Hans Passant 在评论中所说,您可以使用命名管道将您喜欢的任何数据发送到其他应用程序。这可能是最好的解决方案,绝对是最full-featured.
  2. 如果您必须坚持使用 windows 消息,请使用 MSDN 上的 WM_COPYDATA message. This message will have Windows copy your data (the string contents, in this case) from one process to the other. See the Using Data Copy 示例。