【问题标题】:Best IPC mechanism for passing small strings传递小字符串的最佳 IPC 机制
【发布时间】:2022-01-18 13:40:29
【问题描述】:

我想在 64 位应用程序中同时加载 32 位和 64 位 DLL。这是不可能直接做到的,所以我需要为 32 位和 64 位创建一个“加载器”进程。这 2 个加载器进程将从 DLL 中收集一些数据,这些数据大多是小字符串,并立即卸载它们。然后,主 64 位应用程序(GUI)将根据位置将 DLL 的路径传递给 32 位或 64 位加载器,并重复此过程。我对IPC不太了解,应该使用什么机制?我没有任何实时或性能要求。我打算使用 Qt,所以我可能会使用它的一种 IPC 机制。

也许加载器可以像普通控制台应用程序一样直接从stdout 返回所需的数据并接受命令行参数。这可能是最简单的方法,但可能会太慢,因为加载器进程会被多次生成和删除。

【问题讨论】:

  • WM_COPYDATA "...一个应用程序发送WM_COPYDATA消息将数据传递给另一个应用程序..." docs.microsoft.com/en-us/windows/win32/dataxchg/wm-copydata .共享内存不适用于您的用例。下一个最简单的是 UDP。
  • @RichardCritten 加载器进程没有 GUI,似乎 WM_COPYDATA 仅适用于 2 个 GUI 应用程序。
  • Windows 不需要可见。
  • 我会从 QProcess 开始,或者它的 readAllStandardOutput()(如果输出的字符串数量很少)或者它的 readyRead() 信号挂接到调用 readLine() 的插槽(如果您期望有足够的输出,以至于您不想等到子进程退出后再读取任何输出)。如果证明不满意,您可以开始四处寻找更有效的替代方案。
  • 命名管道是我试过的,不幸的是它不能正常工作,有时它会返回垃圾数据,有时它会随机卡住。我将把这个项目放在一边

标签: c++ qt ipc


【解决方案1】:

使用 64 位 GUI 和 32 位 DLL 解决了同样的问题。 在对工作环境进行大量测试和基准测试之后,决定使用命名管道。 Qt 可以命名管道,WINAPI 可以命名管道,并且可以完美运行,不会给代码增加额外的复杂性。

这里有一些有用的链接:

WINAPI Interprocess Communications

WINAPI IPC Named Pipes Example

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多