gpt4 book ai didi

c++ - 通过 PostMessage 发送/接收字符串

转载 作者:可可西里 更新时间:2023-11-01 18:36:09 24 4
gpt4 key购买 nike

虽然网上已经有 一些 资源来解决这个粗略的主题,但我仍然没有找到适合我的答案。

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

最佳答案

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

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

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

关于c++ - 通过 PostMessage 发送/接收字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10619301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com