通过PostMessage发送/接收字符串

时间:2012-05-16 13:12:04

标签: c++ vb.net winapi wndproc param

虽然已经有一些资源在线处理这个粗略的话题,但我仍然没有找到适合我的答案。

我希望在 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实现中,我不需要使用空字符终止字符串。

1 个答案:

答案 0 :(得分:6)

使用Windows消息时,应使用WM_COPYDATA在进程之间传输字符串数据。如果使用自定义消息ID,则不会在两个不同的进程地址空间之间编组字符串数据。

这就是您当前代码失败的原因。接收过程在lParam中传递一个指向调用进程的地址空间中的内存的指针。当然,这在其他过程中毫无意义。

虽然还有其他方法可以在使用Windows消息的进程之间编组此类数据,但WM_COPYDATA是迄今为止最简单的方法。如果您的需求变得更加复杂,那么您可能需要考虑比Windows消息更全面的IPC方法。