2012-05-16 324 views
6

虽然已经有 几个 在线资源解决了这个粗糙的话题,但我仍然没有找到适合我的答案。
通过PostMessage发送/接收字符串

我希望有我的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

是否需要使用特定的窗口消息?还是在流程之间传递数据的最终目标?对于后者,有[更好的方法](http://en.wikipedia.org/wiki/Inter-process_communication)实现。 – ulidtko

+2

在使用它之前,你可能应该对'COPYDATASTRUCT'进行一些基本的验证。某些恶意应用程序可能会向您发送虚假的'WM_COPYDATA'消息。 – jamesdlin

回答

6

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

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

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

+0

我一定会提到IPC的通用方法:管道,共享内存+互斥体,套接字等。 – ulidtko

+1

@ulidtko我已经研究过其他方法,并且我总结说windows消息会让我少一些麻烦,但是谢谢你所关心的。 – Spooky

+0

是否需要使用OnCopyData来接收数据?需要注意的是,我的C++ DLL被注入到另一个进程中,并且我不确定是否仍然可以收到'COPYDATASTRUCT' – Spooky