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实现中,我不需要使用空字符终止字符串.
使用Windows消息时,您应该使用WM_COPYDATA在进程之间传输字符串数据.如果使用自定义消息ID,则不会在两个不同的进程地址空间之间编组字符串数据.
这就是您当前代码失败的原因.接收过程在lParam指向调用进程的地址空间中的内存的指针中传递.当然,这在其他过程中毫无意义.
虽然还有其他方法可以在使用Windows消息的进程之间编组这样的数据,但这WM_COPYDATA是迄今为止最简单的方法.如果您的需求变得更加复杂,那么您可能需要考虑比Windows消息更全面的IPC方法.
| 归档时间: |
|
| 查看次数: |
8693 次 |
| 最近记录: |