如何使用运行对象表(ROT)在两个COM对象之间进行通信?

时间:2011-03-01 15:29:44

标签: visual-c++ com atl moniker

我有两个用C ++和ATL编写的COM对象。有一个库,我知道他们的IID和CLID。

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

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

编辑:更多信息:

我正在为IE编写附加组件。有两个完全无关的COM对象,即IE加载用于不同目的。一个是BHO(Browser Helper Obect),另一个是异步可插拔协议(APP),我发现我可以通过ROT here进行通信。

1 个答案:

答案 0 :(得分:8)

尝试使用 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)。 该函数返回cookie,您可以使用它在以后显式删除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);
  }
}