【问题标题】:What's a lightweight shared memory-based IPC mechanism in C/C++ for Windows?什么是 C/C++ for Windows 中基于共享内存的轻量级 IPC 机制?
【发布时间】:2011-05-21 15:49:28
【问题描述】:

我现在一直在从事一些 C++ 项目,其中涉及使用窗口消息进行一些简单的 IPC。在许多情况下,通过将数据放入共享内存段,然后使用SendMessage 调用将指针传递到共享内存,窗口消息会传递一些额外的数据。一直重复这样做很烦人,但在通过发明另一个 IPC 系统来解决这种无聊的重复之前,我想问一下:

是否存在满足标准的现有框架?:

  • 用 C 或 C++ 编写(我们在这里使用 MSVC)
  • 尽可能少的依赖;在最好的情况下,它只是一些使用普通 C++ 和 Windows 标准库的源文件,可以直接编译到应用程序/库中。
  • 适用于 Windows XP 及更高版本
  • 建立在窗口消息和共享内存段的基础上
  • 非常需要正确的错误报告(远程进程消失、远程进程不理解给定消息、参数不匹配等)

对于它的价值,COM 对我们来说并不是一个真正的选择,因为使用它非常痛苦(除非您开始在它之上使用我们希望避免的各种包装器)。我真的不需要接口和所有这些东西。只是一种方便的方式来来回发送带有(在最好的情况下是任意的)参数的消息,并进行一些错误处理。另外,我放弃了 DBUS,因为我做的比我需要的多。

【问题讨论】:

  • 我不明白为什么使用 COM 会很痛苦,尤其是当您使用 ATL 时(就像您在 MSVC++ 上所做的那样)。
  • @Billy ONeal:ATL 是我在编写unless you start using all kinds of wrappers on top of it which we'd like to avoid 时想到的基于 COM 的框架之一。
  • @French: Err.. 我的意思是 不必编写任何类型的包装器。已经为你写好了。
  • “建立在窗口消息和共享内存段之上” - 这是一个奇怪的标准。为什么解决方案需要展示特定的实现细节?可以围绕SendMessageWM_COPYDATA 和序列化(参见Using Data Copy)构建一个极其简单的解决方案。

标签: c++ c windows winapi ipc


【解决方案1】:

我已经成功使用内存映射文件进行进程间通信。我喜欢它主要是因为它简单、快速,并且可以在您可能遇到的任何版本的 Windows 上使用(好吧,我怀疑它是否可以在 Win9x 上运行,但是....)

http://msdn.microsoft.com/en-us/library/ms810613.aspx 有一篇基本文章(写于 1993 年!)展示了如何使用它们。

【讨论】:

  • +1:有趣——这看起来很不错。如果围绕它构建一些纤细的 C++ 库,那就更棒了。 :-)
  • 我还在找。
【解决方案2】:

虽然不符合您的所有条件,但ZeroMQ (http://www.zeromq.org/) 可能值得一看。它小巧、简单、快速。它还为您提供消息传递语义,这可能会有所帮助,具体取决于您使用的应用程序类型

【讨论】:

  • +1:以前从未听说过,感谢您让我知道;看着它。
  • 它非常轻巧。我自己没用过,但是下次需要IPC的时候考虑看看。
  • IPC 没有在 zmq for Windows 中实现
【解决方案3】:

这个问题在这个答案的时候已经快 3 岁了,但我不敢相信没有人正式建议 Boost.Interprocess

WINAPI 机制的轻量级、IPC 和 C++ 包装可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 2012-08-25
    • 1970-01-01
    • 2012-10-31
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多