Отправка/получение строки через PostMessage

Хотя в Интернете уже есть несколькоресурсов, посвященных этой грубой теме, я до сих пор не нашел ответа, который работает для меня.

Я хочу иметь полную связь между моим процессом VB.netи моим процессом C++. Я хотел бы иметь возможность отправлять строку на и из процесса C++, но пока мне нужно добиться:

Отправка строки на C++процесс и обработка его.

Это создает несколько моментов, в которых я не уверен, но я постараюсь сделать это максимально простым...

Используя следующее объявление функции в VB;

Declare Function PostMessage Lib "user32" Alias "PostMessageA" ( _
    ByVal hWnd As IntPtr, _
    ByVal Msg As UInteger, _
    ByVal wParam As IntPtr, _
    ByVal lParam As String _
) As Boolean

И отправив сообщение следующим образом;

PostMessage(hWnd, SM_PING, Nothing, "schlampe")

Со следующим объявлением метода для захвата сообщения в C++;

LRESULT CALLBACK newWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

И для проверки того, могу ли я получить доступ к строке, используя;

char buffer[50];
sprintf(buffer, "Received: %s", (char *)lParam);
MsgBox(buffer);


Я пробежался по многим деталям, которые я считаю ненужными, но просите, и это будет дано вам.

Моя проблема в том, что сообщение было получено и "обработано"... но окно сообщения, созданное процессом C++, не содержит моего тестового сообщения (оно гласит: "Получено: ").

Итак, как я могу отправить строку через PostMessage/SendMessage из VB в C++?




Решение:

См. принятый ответ для решения... но, кроме того, вот как я получаю строку (C++):

LRESULT CALLBACK newWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch(uMsg) {
        case WM_COPYDATA:
            MsgBox("Received a WM_COPYDATA message");
            COPYDATASTRUCT * pcds = (COPYDATASTRUCT *)lParam;
            LPCTSTR lpszString = (LPCTSTR)(pcds->lpData);
            MsgBox(lpszString);
            return 1L;
    }
    return CallWindowProc(instance->OriginalProcessor(), hwnd, uMsg, wParam, lParam);
}


И, наконец, я использовал пример IPC здесьна отправить сообщение. В этом примере сообщение отправляется с использованием C#, но мне нужна была только эта концепция (не говоря уже о том, что преобразовать такой код в VB несложно). Обратите внимание, что в моей реализации VB мне не нужно было заканчивать строку нулевым символом.

7
задан Spooky 16 May 2012 в 15:27
поделиться