- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
虽然网上已经有
一些
资源来解决这个粗略的主题,但我仍然没有找到适合我的答案。
我希望在我的 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/
我正在掌握 Chrome 自定义选项卡中可用的功能,我很想知道如何在自定义选项卡和应用程序本身之间进行通信。我可以在 CustomTabsSession 中看到有类似 requestPostMessa
我正在创建 Cypress e2e 测试,但是我们的应用程序作为父页面顶部的模态 (iframe) 打开。由于 Cypress 不支持 iframe,我决定尝试“独立”运行应用程序。但是,在启动应用程
显然,使用 window.postMessage是 preferred way在所有现代浏览器中通过 window.setTimeout(fn, 0) 对异步 javascript 回调进行排队。我找
我有 2 个应用程序,一个是隐藏窗口(“hW”),另一个是控制台应用程序(“CA”),来自我想向硬件发送命令。在控制台应用程序中,我得到了硬件句柄,这是一个问题:如果我正在运行: PostMessag
所以我在 Html5 Demos 上摆弄 Html5 PostMessage 示例我创建了一个示例 jsfiddle看看我是否理解它是如何协同工作的。 该演示使用了 document.getEleme
我有一个包含 iFrame 的基本 HTML 页面。当父级加载并且 iFrame 在其中时,iFrame 执行以下 javascript: myParent = window.top; if (win
我有以下脚本 父页面(pair_pixel_filter.php): window.addEventListener("message", function(e) { $('
我遇到的问题是,在注册服务 worker 后,navigator.serviceWorker.controller 始终为 null。 我想使用 postMessage 向 service worke
我正在使用 window.postMessage 函数与 Angular Controller 通信 iframe https://developer.mozilla.org/en-US/docs/W
我在关注 this本地消息传递指南,但现在我陷入了停滞。 Firefox 上的开发者控制台不断给我同样的错误: “尝试在断开连接的端口上发布消息”以及之前的“Webconsole 上下文已更改”。 我
有一个问题我无法解决。我在 Delphi 中创建了两个服务应用程序并尝试在其中发布消息。当然,此类应用程序中没有窗口,PostMessage 需要一个窗口句柄参数来发送消息。 因此,我使用 Alloc
到目前为止,我只看到过关于 postmessage 的教程,其中一个窗口发送一种消息,而另一个窗口仅以一种方式解释消息。 如果我想在窗口之间进行许多不同类型的交互怎么办,postmessage 可以处
我有一个带有视频 API 的 HTML 5 简单表单,我想在用户单击提交按钮时播放视频 这里是演示 HTML 表单输入。 HTML 5
我不知道该怎么办。我尝试了来自不同来源的几个示例代码,我在不同的浏览器(从 Chrome 9 到 FF 4)中尝试了它们,但似乎仍然没有任何东西可以与“postMessage”功能一起使用。JS 控制
我正在尝试将消息从父窗口发布到它打开的子窗口。然而,该消息并未被发布。 在父窗口脚本中: function editAnnotation(annotKey){ var annotString
我正在使用 var handle = window.open(url, name, options) 创建一个弹出窗口。该窗口包含许多允许用户导航的链接。用户完成导航后,可以单击按钮来表示已完成。当用
我有一个包含表单的 iframe,在该 iframe 中我有以下内容: // Send a message to the parent window window.parent.postMessag
我正在尝试将消息从父窗口发布到它打开的子窗口。然而,该消息并未被发布。 在父窗口脚本中: function editAnnotation(annotKey){ var annotString
我正在尝试使用 Ben Almans jquery postmessage调整 iFrame 的大小。我或多或少地将他的示例与不同的服务器和动态内容一起使用。 我也在该网站上发布了一个问题,但这可能是
我正在尝试使用实验性 Canvas 功能 - offscreenCanvas。 index.html const canvas = document.queryS
我是一名优秀的程序员,十分优秀!