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

时间:2015-01-19 12:05:13

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

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

我找到了this article on MSDN,提供了Windows的进程间通信选项列表,COM就是其中之一。
但是,遗憾的是,刚刚列出的COM选项没有太多细节。

是否有人对如何在Windows上使用COM进行进程间通信提供有关doc或其他资源的指示?

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

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

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

有关此主题的教程或更详细的指南会很有帮助。

1 个答案:

答案 0 :(得分:3)

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

但是有很多事情要出错,特别是在确保正确编组接口的过程中。在您开始使用多个进程或者您的COM接口使用.Net之前,编组通常不会经过良好测试。使用oleautomation兼容类型并使用[oleautomation]属性在IDL中标记接口可以帮助确保类型库编组工作,但是对数组使用的其他属性的关注也很重要。几年前我们用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参数指定的大小相关联。假设已经注册了具有第二个定义的类型库,那么这个界面现在应该正确编组,但几年前那些缺失的参数花费了我们一些脑细胞来解决为什么持久性失败。