2009-03-13 6 views
2

Ich bin neu in der Prozesskommunikation und brauche etwas Hilfe. Ich möchte in der Lage sein, eine Zeichenfolge von einem C++ - Programm an ein C# -Programm zu senden. Mein Problem ist, dass die resultierende Zeichenfolge Kauderwelsch ist. Hier ist mein Code:Senden Sie die C++ - Zeichenfolge an die C# -Zeichenfolge. Interop

Senden Programm (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); 
    } 
} 

Und das empfangende Programm (C#) (Ich habe bereits die WndProc außer Kraft gesetzt):

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; 
} 
+0

Was ist der Punkt, an dem in C# neu aufgerufen wird und die Referenz sofort mit einem neuen Wert überschrieben wird? – sharptooth

Antwort

4

char * in C++ ist ANSI-Zeichenfolge (normalerweise ein Byte pro Zeichen), char * in C# ist eine Unicode-Zeichenfolge (wie WCHAR * - zwei Bytes pro Zeichen).

Sie reinterpret_cast von char * zu WCHAR *. Dies wird nicht funktionieren. Verwenden Sie MultiByteToWideChar() auf der C++ - Seite zum Konvertieren.

1

Ihre Zeichenfolge in C++ ist ANSI. Sie müssen für C# irgendwo in Unicode konvertieren. Es ist ein paar Jahre her, seit ich interoperiert habe, also muss jemand anderes dir genau sagen, wie man das macht.