2011-03-01 171 views
7

我有两个用C++和ATL编写的COM对象。有一个图书馆,我知道他们的IID和CLID。如何使用运行对象表(ROT)在两个COM对象之间进行通信?

我找不到在两个简单的COM对象之间进行简单通信的例子。如何创建IMoniker以及如何将其添加到ROT?然后,如何在其他COM中的不同进程/线程中检索此对象的指针?

有没有人可以提供一个小例子?

编辑:更多信息:

我写的IE加载项。有两个COM对象完全无关IE加载的不同目的。一个是BHO(浏览器助手Obect),另一个是异步可插入协议(APP),我发现我可以通过ROT here进行通信。

+0

为什么要在这种情况下使用ROT? – sharptooth 2011-03-01 15:44:48

+0

@sharptooth我正在为IE编写附加组件。我更新了我的问题。 – 2011-03-01 16:05:48

+0

嗯,我明白了。您必须搜索如何实现IMoniker界面。 – sharptooth 2011-03-02 08:17:27

回答

6

尝试使用CreateItemMoniker而不是CreatePointerMoniker - 它允许您在ROT中指定对象的名称。

你应该能够注册你的对象是这样的:

DWORD RegisterInROT(LPCWSTR szObjName, IUnknown* pObj) 
{ 
    DWORD dwCookie = 0; 
    CComPtr<IRunningObjectTable> pROT; 
    if (GetRunningObjectTable(0, &pROT) == S_OK) 
    { 
    CComPtr<IMoniker> pMoniker; 
    if (CreateItemMoniker(NULL, szObjName, &pMoniker) == S_OK) 
     if (pROT->Register(0, pObj, pMoniker, &dwCookie) == S_OK) 
      return dwCookie; 
    } 
    return 0; 
} 

如果你不想让你的对象是自杀死的时候有它没有更多的参考,您可以指定,而不是ROTFLAGS_REGISTRATIONKEEPSALIVE 0(check in in MSDN)。 该函数返回使用网站,你可以用它来从ROT显式删除您的对象后是这样的:

void RevokeFromROT(DWORD dwCookie) 
{ 
    CComPtr<IRunningObjectTable> pROT; 
    if (GetRunningObjectTable(0, &pROT) == S_OK) 
     pROT->Revoke(dwCookie); 
} 

您可以从ROT获取对象像这样(你应该使用相同的名称用于注册课程的对象=)

void GetObjectFromROT(LPCWSTR szObjName, IUnknown** pObj) 
{ 
    CComPtr<IRunningObjectTable> pROT; 
    if (GetRunningObjectTable(0, &pROT) == S_OK) 
    { 
    CComPtr<IMoniker> pMoniker; 
    if (CreateItemMoniker(NULL, szObjName, &pMoniker) == S_OK) 
     pROT->GetObject(pMoniker, pObj); 
    } 
}