【问题标题】:How to communicate between two COM objects using Running Object Table (ROT)?如何使用运行对象表 (ROT) 在两个 COM 对象之间进行通信?
【发布时间】:2011-07-06 14:33:48
【问题描述】:

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

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

谁能提供一个小例子?

编辑:更多信息:

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

【问题讨论】:

  • 在这种情况下为什么要使用 ROT?
  • @sharptooth 我正在为 IE 编写插件。我更新了我的问题。
  • 嗯,我明白了。您必须搜索如何实现IMoniker接口。
  • @sharptooth 是吗?我希望我可以使用CreatePointerMoniker 或其他功能。但是当我通过IRunningObjectTable::Register 注册这个指针名字时,我得到E_NOTIMPL。也许我应该使用其他 COM 提供的名字?
  • 我也试过了——它也将E_NOTIMPL返回给我。您确定它首先应该适用于进程内服务器吗?

标签: visual-c++ com atl moniker


【解决方案1】:

尝试使用 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);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2017-11-04
    • 2016-05-08
    相关资源
    最近更新 更多