2

我是进程间通信的新手,需要一些帮助。我希望能够将字符串从 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;
}
4

3 回答 3

4

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

实际上,您将 char* 重新解释为 WCHAR*。这行不通。在 C++ 端使用 MultiByteToWideChar() 进行转换。

于 2009-03-13T15:25:41.300 回答
1

您在 C++ 中的字符串是 ANSI。您需要在 C# 的某个地方转换为 Unicode。自从我做互操作以来已经有几年了,所以其他人将不得不告诉你具体如何做到这一点。

于 2009-03-13T15:26:29.410 回答
0

您必须以某种方式将字符数组从 ASCII 转换为 Unicode。这是一个可以从 C# 方面帮助完成的页面

于 2009-03-13T15:29:48.823 回答