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

发布于 2024-07-15 22:53:18 字数 851 浏览 5 评论 0原文

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

I am new to inter process communication and need some help. I want to be able to send a string from a C++ program to a C# program. My problem is that the resultant string is gibberish. Here is my code:

Sending program (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);
    }
}   

And the receiving program (C#) (I have already overridden the 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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

假装爱人 2024-07-22 22:53:18

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

事实上,您从 char* 到 WCHAR* 进行了reinterpret_cast。 这行不通。 在 C++ 端使用 MultiByteToWideChar() 进行转换。

char* in C++ is ANSI character string (usually one byte per character), char* in C# is Unicode character string (like WCHAR* - two bytes per character).

You in fact reinterpret_cast from char* to WCHAR*. This won't work. Use MultiByteToWideChar() on C++ side to convert.

楠木可依 2024-07-22 22:53:18

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

Your string in C++ is ANSI. You need to convert to Unicode somewhere for C#. It's been a couple of years since I did interop, so someone else will have to tell you exactly how to do that.

乖乖兔^ω^ 2024-07-22 22:53:18

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

You'll have to convert your character array from ASCII to Unicode somehow. Here is a page that may help do it from the C# side.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文