通过PostMessage发送/接收字符串

Spo*_*oky 7 c++ vb.net winapi param wndproc

虽然网上有一些资源可以解决这个粗略的话题,但我仍然没有找到适合我的答案.

我希望在我的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
Run Code Online (Sandbox Code Playgroud)

并发送这样的消息;

PostMessage(hWnd, SM_PING, Nothing, "schlampe")
Run Code Online (Sandbox Code Playgroud)

使用以下方法声明来捕获C++中的消息;

LRESULT CALLBACK newWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Run Code Online (Sandbox Code Playgroud)

并测试我是否可以使用;

char buffer[50];
sprintf(buffer, "Received: %s", (char *)lParam);
MsgBox(buffer);
Run Code Online (Sandbox Code Playgroud)


我浏览了许多我认为没必要的细节,但是请问并将它给予你.

我的问题是消息接收并"处理"......但是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);
}
Run Code Online (Sandbox Code Playgroud)


最后,我用了IPC例子这里发送邮件.这个例子使用C#发送消息,但这个概念就是我所需要的(更不用说它是在公园里散步将这些代码转换为VB).请注意,在我的VB实现中,我不需要使用空字符终止字符串.

Dav*_*nan 6

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

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

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