不能使用Marshal.PtrToStringAuto(IntPtr)将C ++ char []转换为C#字符串

时间:2014-12-03 04:28:13

标签: c# c++ marshalling sendmessage wndproc

我一直在努力解决这个问题,我现在和我最好的朋友之一(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上看过关于封送的类似帖子,但我无法用任何解决方案解决我的问题。大多数其他解决方案详细说明了(我相信我正在复制),但没有其他解决方案详细说明了这种错误。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

两个不同的应用程序具有不同的地址空间,因此一个应用程序中的地址在另一个应用程序中可能毫无意义。在进程之间交换信息有不同的方法。其中一个是发送WM_COPYDATA。请参阅示例here