Хотя в Интернете уже есть несколькоресурсов, посвященных этой грубой теме, я до сих пор не нашел ответа, который работает для меня.
Я хочу иметь полную связь между моим процессом 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 мне не нужно было заканчивать строку нулевым символом.