如何在 2 个进程之间共享 COM 对象?

Posted

技术标签:

【中文标题】如何在 2 个进程之间共享 COM 对象?【英文标题】:How to share COM objects between 2 processes? 【发布时间】:2010-06-20 03:40:57 【问题描述】:

我希望 Application1.exe 实例化其 Item 类的一个实例。 我希望 Application2.exe 对此对象调用 GetPrice()。

我已按照以下网站上的步骤 1-7:http://www.codeguru.com/Cpp/COM-Tech/activex/tutorials/article.php/c5567/

这是我目前所拥有的。

Application1 的 main 如下所示:

CoInitialize( NULL );

DWORD dwRegister;
ItemFactory *pFactory = new ItemFactory;
CoRegisterClassObject( CLSID_Item, pFactory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwRegister );

_getch();
return 0;

Application2 的 main 如下所示:

CoInitialize( NULL );
CoGetClassObject( CLSID_Item, CLSCTX_LOCAL_SERVER, NULL, IID_IItem, (LPVOID *)&pFactory );

我的问题(希望是我唯一的问题)是我不知道如何将我的 Item 类(或其接口 IItem)与 CLSID_Item 关联;这只是我在另一个文件中定义的一些随机 GUID。我试过了

CoRegisterPSClsid( IID_IItem, CLSID_Item );

在这一行之后,我尝试了

Item *pItem;
CoCreateInstance( CLSID_Item, NULL, CLSCTX_LOCAL_SERVER, IID_IItem, (LPVOID *)&pItem );

我收到 E_NOINTERFACE 错误。 我应该使用 CoCreateInstance 创建工厂吗?呃,好糊涂……

【问题讨论】:

【参考方案1】:

为了跨进程或线程边界使用 COM,您必须 tell COM about your interfaces 以便它可以在进程之间编组您的函数参数/返回值。最简单的方法是使用系统中预定义的接口,例如 IDispatch,但如果要使用自己的接口,则必须使用 register a proxy/stub DLL 或 a type library。如果您不这样做,那么跨 COM 域为您的自定义接口调用 QueryInterface 将失败并显示 E_NOINTERFACE,正如您所看到的。

【讨论】:

以上是关于如何在 2 个进程之间共享 COM 对象?的主要内容,如果未能解决你的问题,请参考以下文章

2个进程(应用程序)之间的共享内存

如何使用共享内存而不是通过多个进程之间的酸洗来传递对象

如何在 .exe 和 .dll 之间正确共享对象?

在操作系统中,进程之间是如何通信的

python在子进程之间共享单例对象

如何在两个线程之间共享数据