C++ 通过PostMessage发送/接收字符串
虽然网上已经有一些资源可以解决这个粗糙的话题,但我仍然没有找到适合我的答案。C++ 通过PostMessage发送/接收字符串,c++,vb.net,winapi,wndproc,param,C++,Vb.net,Winapi,Wndproc,Param,虽然网上已经有一些资源可以解决这个粗糙的话题,但我仍然没有找到适合我的答案。 我希望在我的VB.net进程和我的C++进程之间进行充分的通信。我希望能够发送一个字符串到和从C++进程,但暂时我需要实现: 向C++进程发送一个字符串,并对其进行处理。 这就产生了一些我不确定的问题,但我会尽量保持简单… 在VB中使用以下函数声明 声明函数PostMessage Lib“user32”别名“PostMessageA”(_ ByVal hWnd作为IntPtr_ ByVal Msg作为UInteger_
我希望在我的VB.net进程和我的C++进程之间进行充分的通信。我希望能够发送一个字符串到和从C++进程,但暂时我需要实现:
向C++进程发送一个字符串,并对其进行处理。
这就产生了一些我不确定的问题,但我会尽量保持简单…
在VB中使用以下函数声明
声明函数PostMessage Lib“user32”别名“PostMessageA”(_
ByVal hWnd作为IntPtr_
ByVal Msg作为UInteger_
ByVal wParam作为IntPtr_
作为字符串的ByVal lParam_
)作为布尔值
这样发送信息
PostMessage(hWnd、smu-PING、Nothing,“schlampe”)
使用以下方法声明在C++中捕获消息
LRESULT回调newWndProc(HWND-HWND、UINT-uMsg、WPARAM-WPARAM、LPARAM-LPARAM)
并测试我是否可以使用访问字符串
char缓冲区[50];
sprintf(缓冲区,“接收:%s”,(字符*)LPRAM);
MsgBox(缓冲区);
我略过了很多我认为不必要的细节,但只要问一下,就会给你们。
我的问题是,消息被接收并“处理”。。。但是C++进程创建的消息框不包含我的测试消息(它读:“接收:”)。 <> P> >,我如何通过Stime/SeNeMeST从VB向C++发送字符串?
解决方案: 有关解决方案,请参阅已接受的答案。。。此外,下面是我接收字符串的方式(C++):
LRESULT回调newWndProc(HWND-HWND、UINT-uMsg、WPARAM-WPARAM、LPARAM-LPARAM){
开关(uMsg){
案例WM_COPYDATA:
MsgBox(“收到WM_COPYDATA消息”);
COPYDATASTRUCT*pcds=(COPYDATASTRUCT*)LPRAM;
LPCTSTR lpszString=(LPCTSTR)(pcds->lpData);
MsgBox(lpszString);
返回1L;
}
返回CallWindowProc(instance->OriginalProcessor(),hwnd,uMsg,wParam,lParam);
}
最后,我使用IPC示例发送消息。这个示例使用C#发送消息,但我只需要这个概念(更不用说将这样的代码转换为VB是在公园里散步了)。请注意,在我的VB实现中,我不需要用空字符终止字符串。使用Windows消息时,应使用在进程之间传输字符串数据。如果使用自定义消息ID,则不会在两个不同的进程地址空间之间封送字符串数据 这就是当前代码失败的原因。接收进程在
lParam
中传递一个指向调用进程地址空间中内存的指针。当然,这在另一个过程中毫无意义
虽然有其他方法可以在具有Windows消息的进程之间封送这样的数据,但迄今为止,
WM_COPYDATA
是最简单的方法。如果您的需求变得更加复杂,那么您可能需要考虑比Windows消息更全面的IPC方法。是使用特定窗口消息的要求吗?还是在进程之间传递数据是最终目标?对于后者,有很多方法可以实现。在使用之前,您可能应该对COPYDATASTRUCT
进行一些基本验证。某些恶意应用程序可能会向您发送虚假的WM_COPYDATA
消息。我必须提到IPC的一般方法:管道、共享内存+互斥体、套接字等@ulidtko我研究了其他方法,我得出结论,windows消息会减少我的麻烦,但是感谢您的关注。是否需要使用OnCopyData
来接收数据?重要的是要注意,我的C++ DLL被注入到另一个进程中,我不确定是否仍然可以接收<代码> CopyDATAsReals< /Cord>。此外,我不必从C++ DLL中创建一个不可见的窗口(以接收OnCopDebug)…但如果没有别的办法,我会让步。你需要一扇看不见的窗户。