7

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

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

4

1 回答 1

6

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

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

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

于 2012-05-16T13:14:43.383 回答