发送/ PostMessage的,通过接收的字符串(Sending/Receiving a stri

2019-09-17 06:52发布

虽然目前已经有一些资源网上说解决这个粗略的话题,我还没有发现适合我的答案。

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

Answer 1:

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

这就是为什么当前的代码失败。 使接收过程中传递lParam一个指向存储器中调用进程的地址空间。 当然,这是在其他进程中毫无意义。

虽然还有其他的方式来封送这样的与Windows消息处理之间的数据, WM_COPYDATA是迄今为止最简单的。 如果您的要求变得更加复杂,那么你可能需要考虑的Windows消息更全面IPC方法。



文章来源: Sending/Receiving a string through PostMessage