2009-03-13 6 views
2

Я новичок в общении между процессами и нуждаюсь в некоторой помощи. Я хочу, чтобы отправить строку из программы на C++ в программу C#. Моя проблема в том, что результирующая строка - тарабарщина. Вот мой код:Отправьте строку C++ в строку C#. Interop

Отправка программы (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; 
} 
+0

В чем смысл вызова нового в C#, и они сразу же переписывают ссылку с новым значением? – sharptooth

ответ

4

символ * в C++ является Символьная строка ANSI (обычно один байт на символ), char * в C# - это символьная строка Unicode (например, WCHAR * - два байта на символ).

Вы на самом деле reinterpret_cast от char * до WCHAR *. Это не сработает. Используйте MultiByteToWideChar() на стороне C++ для преобразования.

1

Ваша строка в C++ является ANSI. Вам нужно преобразовать в Unicode где-нибудь для C#. Прошло пару лет с тех пор, как я перестал общаться, поэтому кто-то еще должен будет рассказать вам, как это сделать.

 Смежные вопросы

  • Нет связанных вопросов^_^