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

时间:2010-06-20 03:40:57

标签: c++ winapi com ipc

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

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

这是我到目前为止所做的。

Application1的主要内容如下:

CoInitialize( NULL );

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

_getch();
return 0;

Application2的主要内容如下:

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 个答案:

答案 0 :(得分:1)

为了在进程或线程边界之间使用COM,您必须tell COM about your interfaces,这样它就可以封送您的函数参数/在进程之间返回值。最简单的方法是使用系统中预定义的接口,例如IDispatch,但如果您想使用自己的接口,则必须register a proxy/stub DLLa type library。如果您不这样做,那么对于您在Q域中的自定义界面的QueryInterface调用将失败,E_NOINTERFACE正如您所见。