【问题标题】:How to share COM objects between 2 processes?如何在 2 个进程之间共享 COM 对象?
【发布时间】: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 创建工厂吗?呃,好糊涂……

【问题讨论】:

    标签: c++ winapi com ipc


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 2011-04-09
      相关资源
      最近更新 更多