虽然已经有一些资源在线处理这个粗略的话题,但我仍然没有找到适合我的答案。
我希望在 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示例here来发送消息。这个例子使用C#发送消息,但这个概念就是我所需要的(更不用说它是在公园里散步将这些代码转换为VB)。请注意,在我的VB实现中,我不需要使用空字符终止字符串。
答案 0 :(得分:6)
使用Windows消息时,应使用WM_COPYDATA
在进程之间传输字符串数据。如果使用自定义消息ID,则不会在两个不同的进程地址空间之间编组字符串数据。
这就是您当前代码失败的原因。接收过程在lParam
中传递一个指向调用进程的地址空间中的内存的指针。当然,这在其他过程中毫无意义。
虽然还有其他方法可以在使用Windows消息的进程之间编组此类数据,但WM_COPYDATA
是迄今为止最简单的方法。如果您的需求变得更加复杂,那么您可能需要考虑比Windows消息更全面的IPC方法。