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

标签 visual-c++ com atl moniker

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

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

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

编辑 : 更多信息:

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

最佳答案

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

关于visual-c++ - 如何使用运行对象表 (ROT) 在两个 COM 对象之间进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5156553/

相关文章:

visual-c++ - 如何将cv::Mat中的值转换为* CvMat

c++ - 仅使用 DLL *.h 头文件构建(编译链接)应用程序代码并在运行时加载 DLL 实现(显式链接)

c++ - 如何在 Visual Studio Community 2015 中创建 "ATL Project"?

c++ - Win32 文件锁定读取 : how to find out who's locking them

c++ - 升级到VS2012导致由于VC++运行时不同而崩溃?

c++ - COM 中的 C++ 函数指针有问题

c# - 想要在部署的机器上使用 COM dll 文件而不注册 dll 文件

excel - Excel 数据中的变音符号

winapi - 如何使用 ATL 创建匿名 IDispatch 函数?

c++ - COM SafeArray 的 SafeArray