2009-03-13 10 views
2

Je suis novice dans la communication inter-processus et j'ai besoin d'aide. Je veux être en mesure d'envoyer une chaîne d'un programme C++ à un programme C#. Mon problème est que la chaîne résultante est charabia. Voici mon code:Envoyer la chaîne C++ à la chaîne C#. Interop

Envoi programme (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); 
    } 
} 

Et le programme de réception (C#) (je l'ai déjà surchargé l'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; 
} 
+0

Quel est le point d'appeler nouveau dans C# et les écraser immédiatement la référence avec une nouvelle valeur? – sharptooth

Répondre

4

char * en C++ est Chaîne de caractères ANSI (généralement un octet par caractère), char * en C# est une chaîne de caractères Unicode (comme WCHAR * - deux octets par caractère).

En fait, vous réinterprétez_cast de char * vers WCHAR *. Cela ne marchera pas. Utilisez MultiByteToWideChar() côté C++ pour convertir.

1

Votre chaîne en C++ est ANSI. Vous devez convertir en Unicode quelque part pour C#. Cela fait quelques années que je l'ai fait, alors quelqu'un d'autre devra vous dire exactement comment faire ça.