我试图将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垃圾。
我确定我错过了一些基本的东西,但我似乎无法看到它。有人可以帮忙吗?
答案 0 :(得分:5)
您当前的代码存在一些问题:
PostMessage
在返回之前不会等待接收应用程序。因此,固定对象在处理消息之前变为取消固定,并且可以移动到存储器中的新位置。 (这可能不是这里的主要问题。)要修复#2,您需要以某种方式将内存从一个进程复制到另一个进程。
WM_COPYDATA
消息。此消息将Windows将您的数据(在本例中为字符串内容)从一个进程复制到另一个进程。请参阅MSDN上的Using Data Copy示例。