将C ++字符串发送到C#字符串。互操作

时间:2009-03-13 15:20:48

标签: c# c++ string interop sendmessage

我是跨流程沟通的新手,需要一些帮助。我希望能够将C ++程序中的字符串发送到C#程序。我的问题是结果字符串是乱码。这是我的代码:

发送程序(C ++):

void transmitState(char* myStr)
{

    HWND hWnd = ::FindWindow(NULL, _T("myApp v.1.0"));
    if (hWnd)
    {
        COPYDATASTRUCT cds;
        ::ZeroMemory(&cds, sizeof(COPYDATASTRUCT));
        cds.dwData = 0;
        cds.lpData = (PVOID) myStr;
        cds.cbData = strlen(myStr) + 1;

        ::SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds);
    }
}   

接收程序(C#)(我已经覆盖了WndProc):

private void OnCopyData(ref Message m)
{
    COPYDATASTRUCT cds = new COPYDATASTRUCT();
    cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));

    String myStr;
    unsafe
    {
        myStr = new String((char*) cds.lpData);
    }

    label1.Text = myStr;
}

3 个答案:

答案 0 :(得分:4)

C ++中的char *是ANSI字符串(通常每个字符一个字节),C#中的char *是Unicode字符串(如WCHAR * - 每个字符两个字节)。

你实际上是从char *到WCHAR *的reinterpret_cast。这不行。在C ++端使用MultiByteToWideChar()进行转换。

答案 1 :(得分:1)

您在C ++中的字符串是ANSI。您需要在C#的某处转换为Unicode。自从我进行互操作以来已经过了几年,所以其他人必须告诉你具体如何做到这一点。

答案 2 :(得分:0)

您必须以某种方式将字符数组从ASCII转换为Unicode。 Here is a page that may help do it from the C# side