如何在 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 对象?的主要内容,如果未能解决你的问题,请参考以下文章