c++ - 使用 COM 在 Windows 上的本地计算机上进行进程间通信

标签 c++ windows com inter-process-communicat

我正在研究使用 COM 和 C++ 在 Windows 上进行进程间通信的选项。

我找到了 this article on MSDN ,提供了 Windows 的进程间通信选项列表,COM 就是其中之一。
但是,不幸的是,COM 选项只列出了很多细节。

有人对如何在 Windows 上使用 COM 进行进程间通信有任何关于文档或其他资源的指示吗?

我对与远程机器通信不感兴趣(所以:没有 DCOM);我只对同一台本地计算机上的进程间通信感兴趣。

想法是定义一些自定义的 COM 接口(interface)来实现一些自定义的通信协议(protocol),然后有一个服务器程序和一个客户端程序(每个程序都在自己的进程中,运行在同一台本地机器上),并使用 COM 进行通信两者之间(例如,客户端向服务器发出请求,服务器返回正确的答案,一切都使用 COM 接口(interface))。

因此,例如:是否有预定义的 COM 接口(interface)来实现进程间通信?如果有,它们是什么?

关于这个主题的一些教程或更详细的指南会很有帮助。

最佳答案

如果你有一个双方都知道的 COM 接口(interface),那么一个进程可以用 Running Object Table 注册一些实现它的对象。使用绰号。另一个进程然后可以使用名字对象标识符从此进程间表中检索对象,并查询已知接口(interface)。现在,客户端进程引用了其他进程中存在的内容,并且调用将由 COM 编码。

虽然有很多地方会出错,尤其是在确保您的接口(interface)被正确编码方面。在您开始使用多个进程或您一直在使用 .Net 和您的 COM 接口(interface)之前,编码通常没有得到很好的测试。使用oleautomation兼容类型并在 IDL 中使用 [oleautomation] 属性标记接口(interface)有助于确保类型库编码正常工作,但注意与数组一起使用的其他属性也很重要。我们通过 IPropertyBag2 找到了这个几年前的界面。 Visual Studio 6 IDL 描述在 ocidl.idl 中如下所示:

HRESULT Read(
            [in] ULONG cProperties,
            [in] PROPBAG2 * pPropBag,
            [in] IErrorLog * pErrLog,
            [out] VARIANT * pvarValue,
            [out] HRESULT * phrError
        );

并且不会从提供的数组中编码多个 VARIANT。较新的版本如下所示:

HRESULT Read(
           [in] ULONG cProperties,
           [in, size_is(cProperties)] PROPBAG2 * pPropBag,
           [in, unique] IErrorLog * pErrLog,
           [out, size_is(cProperties)] VARIANT * pvarValue,
           [in, out, unique, size_is(cProperties)] HRESULT * phrError
       );

它正确地将 pvarValue 数组的大小与 cProperties 参数指定的大小相关联。假设具有第二个定义的类型库已经注册,那么这个接口(interface)现在应该正确编码,但几年前,那些缺失的参数让我们花费了一些脑细胞来弄清楚持久性失败的原因。

关于c++ - 使用 COM 在 Windows 上的本地计算机上进行进程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28024261/

相关文章:

c++ - 为什么不能将重载的运算符定义为类的静态成员?

windows - MSI 安装程序错误 - MSIExec 失败 : 1603

c++ - Console+Windows的窗体

java excel 交互

c++函数调用函数不起作用

c++ - 向上和向左旋转相机

c# - Emgu OpenCV : Apply different Threshold values depending on text form[sharp/bold]

c++ - "An existing connection was forcibly closed by the remote host"监听传入数据时

c# - 如何在 .net 中获取对 Internet Explorer 窗口句柄的引用

vba - 为什么 IDL 默认值看起来是四舍五入的?