Отправьте строку C ++ в строку C #. Interop - PullRequest
2 голосов
/ 13 марта 2009

Я новичок в межпроцессном взаимодействии и мне нужна помощь. Я хочу иметь возможность отправить строку из программы на 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;
}

Ответы [ 3 ]

4 голосов
/ 13 марта 2009

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

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

1 голос
/ 13 марта 2009

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

0 голосов
/ 13 марта 2009

Вам придется каким-то образом преобразовать ваш массив символов из ASCII в Unicode. Вот страница, которая может помочь сделать это со стороны C # .

...