Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过PostMessage发送/接收字符串_C++_Vb.net_Winapi_Wndproc_Param - Fatal编程技术网

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)…但如果没有别的办法,我会让步。你需要一扇看不见的窗户。