Хотя в Интернете уже есть несколько ресурсов, посвященных этой сложной теме, я до сих пор не нашел подходящего ответа.
Я хочу иметь полную связь между моим процессом 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++?
Решение:
См. принятый ответ для решения... но, кроме того, вот как я получаю строку (С++):
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 мне не нужно было заканчивать строку нулевым символом.
COPYDATASTRUCT
перед его использованием. Какое-то вредоносное приложение может отправлять вам поддельныеWM_COPYDATA
сообщения. - person jamesdlin   schedule 17.05.2012