【问题标题】:Send C++ string to C# string. Interop将 C++ 字符串发送到 C# 字符串。互操作
【发布时间】:2010-10-13 04:38:58
【问题描述】:

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

【问题讨论】:

  • 在 C# 中调用 new 并立即用新值覆盖引用有什么意义?

标签: c# c++ string interop sendmessage


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多