我一直在努力解决这个问题,我现在和我最好的朋友之一(google)对我没有任何帮助。目前,我正在开发一个C#应用程序(WinForms),它需要从C ++应用程序发送的消息的LParam中获取和使用数据。目前,我的C ++测试应用程序检查消息接收器(C#应用程序)是否有可用的句柄,如果句柄有效,则发送消息。 C ++应用程序的代码如下:
int _tmain(int argc, _TCHAR* argv[])
{
HWND hScreenSaver = ::FindWindow(NULL,TEXT("MessageReceiver")); //MessageReceiveris the window name of the C# application
if (hScreenSaver == NULL)
{
std::cout << "Handle Invalid!" << std::endl;
return exit();
}
char testMessage[13] = "Test Message";
::SendMessageA(hScreenSaver, (UINT)101296, 0, (LPARAM)&testMessage);
return exit();
}
int exit()
{
system("Pause");
return 0;
}
我相信C ++应用程序正常工作(构建并运行没有错误)。我以为我会发布它只是为了显示消息是如何发送的。一个快速的说明是消息号没有重要性,我随机选择它 - 以防万一有人想知道。
收到消息的我的C#测试应用程序发布在下面:
protected override void WndProc(ref Message m)
{
if(m.Msg == 101296)
{
if(m.LParam == IntPtr.Zero)
{
textBox1.Text = "Nothing Sent in LParam";
}
else
{
textBox1.Text = Marshal.PtrToStringAuto(m.LParam); //This is causing the error detailed below
}
}
base.WndProc(ref m);
}
当同时运行这两个应用程序时,C ++应用程序成功向C#应用程序发送消息,C#应用程序处理消息直到指定的点。错误消息是:
A first chance exception of type 'System.AccessViolationException' occurred in mscorlib.dll
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
我曾试图使用Marshal.Copy而没有运气。我在StackOverflow上看过关于封送的类似帖子,但我无法用任何解决方案解决我的问题。大多数其他解决方案详细说明了(我相信我正在复制),但没有其他解决方案详细说明了这种错误。
非常感谢任何帮助。
答案 0 :(得分:0)
两个不同的应用程序具有不同的地址空间,因此一个应用程序中的地址在另一个应用程序中可能毫无意义。在进程之间交换信息有不同的方法。其中一个是发送WM_COPYDATA。请参阅示例here