使用 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 垃圾。
我确信我遗漏了一些基本的东西,但我似乎看不到它。有人可以帮忙吗?
您当前的代码存在一些问题:
PostMessage
不等待接收申请才返回。因此,固定的对象在消息被处理之前变为取消固定,并且可能被移动到内存中的新位置。 (这可能不是这里的主要问题。)
- 假设您的 C++/CLI 和 C# 组件是完全独立的进程,您正在做的是将一个进程中的指针 space 发送到另一个进程。该指针不再有效。
要修复#2,您需要以某种方式将内存从一个进程复制到另一个进程。
- 正如 Hans Passant 在评论中所说,您可以使用命名管道将您喜欢的任何数据发送到其他应用程序。这可能是最好的解决方案,绝对是最full-featured.
- 如果您必须坚持使用 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 示例。
我正在尝试将字符串从 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 垃圾。
我确信我遗漏了一些基本的东西,但我似乎看不到它。有人可以帮忙吗?
您当前的代码存在一些问题:
PostMessage
不等待接收申请才返回。因此,固定的对象在消息被处理之前变为取消固定,并且可能被移动到内存中的新位置。 (这可能不是这里的主要问题。)- 假设您的 C++/CLI 和 C# 组件是完全独立的进程,您正在做的是将一个进程中的指针 space 发送到另一个进程。该指针不再有效。
要修复#2,您需要以某种方式将内存从一个进程复制到另一个进程。
- 正如 Hans Passant 在评论中所说,您可以使用命名管道将您喜欢的任何数据发送到其他应用程序。这可能是最好的解决方案,绝对是最full-featured.
- 如果您必须坚持使用 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 示例。