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 文字列 (通常は 1 文字あたり 1 バイト) であり、C# の char* は Unicode 文字列 (WCHAR* のように - 1 文字あたり 2 バイト) です。

実際、char* から WCHAR* に reinterpret_cast します。これはうまくいきません。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 に答える