哪种 Windows IPC 方法更适合短命令?

Posted

技术标签:

【中文标题】哪种 Windows IPC 方法更适合短命令?【英文标题】:What Windows IPC method is better for short commands? 【发布时间】:2013-01-20 22:41:45 【问题描述】:

我需要一种用于 2 个 Windows 应用程序(都在同一台机器上)的 IPC 方法。 如果我的应用程序是基于 CLI + windows 服务,哪一个更好。

附:我已经在单独的线程中实现了目标进程(CLI 应用程序)中的消息队列。并通过PostThreadMessage 从源进程(GUI 应用程序)发布我的消息。 所以。当两个应用程序都由同一个用户运行时 - 一切正常。当我在本地服务用户下通过任务计划程序运行目标应用程序时,我收到 1444 错误代码(错误的线程 ID)。 有什么想法吗?

附言来自 MSDN

此线程必须具有 SE_TCB_NAME 权限才能将消息发布到属于具有相同本地唯一标识符 (LUID) 的进程但位于不同桌面的线程。否则,函数将失败并返回 ERROR_INVALID_THREAD_ID。

此线程必须与调用线程属于同一个桌面或属于具有相同 LUID 的进程。否则,函数将失败并返回 ERROR_INVALID_THREAD_ID。

所以。我应该确定如何将SE_TCB_NAME 从我的源进程设置到我的线程。

【问题讨论】:

【参考方案1】:

WM_COPYDATA 消息或自定义消息代码(如果您不打算传输文本或二进制数据)将起作用。 WM_COPYDATA 消息允许您传输二进制数据,Windows 会跨进程边界进行复制。

在 GUI -> CLI 应用程序中,您需要在 CLI 进程中创建一个不可见的窗口来接收消息(如果您希望消息被发送而不是从 GUI 应用程序发布)。如果您只是将消息从 GUI 发布到 CLI,那么 PostThreadMessage() 函数就足够了,并且不需要窗口。

在 CLI -> GUI 方向中根本没有复杂性,因为窗口已经(通常)存在于 GUI 应用程序中。

【讨论】:

谢谢,这是一个非常有趣的解决方案。我知道 WM_COPYDATA 但从未想过隐藏窗口...【参考方案2】:

还有一个不错的解决方案 - 来自 boost 库的 Message Queue。

【讨论】:

以上是关于哪种 Windows IPC 方法更适合短命令?的主要内容,如果未能解决你的问题,请参考以下文章

故事板 Segue 与委派。哪种方法更适合在 ViewController 之间传递数据

哪种方法更适合提高存储过程的性能

为啥如果我得到计算对象中的对象属性未定义而不是对象本身?哪种方法更适合这种情况?

哪种方法更适合此目的 commandLink 或 outputLink 或 Link [重复]

哪种脚本语言更适合嵌入多线程 C/C++ 应用程序 [关闭]

c++ IPC 在 Windows 上通过 streambuf