如何使用运行对象表 (ROT) 在两个 COM 对象之间进行通信? [英] How to communicate between two COM objects using Running Object Table (ROT)?

查看:55
本文介绍了如何使用运行对象表 (ROT) 在两个 COM 对象之间进行通信?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have two COM objects written in C++ and ATL. There are in one library and I know their IIDs and CLIDs.

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

I can't find an example of doing this simple communication between two simple COM objects. How to create IMoniker and how to add it to ROT? And then, how to retrieve pointer of this object,in other COM in different process/thread?

谁能提供一个小例子?

编辑:更多信息:

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

I'm writing an add-on for IE. There are two COM object completely unrelated that IE load for different purpose. One is BHO (Browser Helper Obect), other is Asynchronous Pluggable Protocol (APP) I found I can communicate through ROT here.

推荐答案

尝试使用 CreateItemMoniker 代替 CreatePointerMoniker - 它允许您在 ROT 中为对象指定名称.

Try using CreateItemMoniker instead of CreatePointerMoniker - it allows you to specify a name for your object in ROT.

您应该能够像这样注册您的对象:

You should be able to register your object like this:

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 (在 MSDN 中签入).该函数返回 cookie,您可以使用它稍后从 ROT 中明确删除您的对象,如下所示:

If you don't want your object to be auto-killed when there are no more references to it, you could specify ROTFLAGS_REGISTRATIONKEEPSALIVE instead of 0 (check in in MSDN). The function returns cookie you can use to explicitly remove your object from ROT later like this:

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

您可以像这样从 ROT 获取对象(当然您应该使用与注册对象相同的名称 =)

You can get the object from ROT like this (you should use the same name you used to register the object of course =)

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);
  }
}

这篇关于如何使用运行对象表 (ROT) 在两个 COM 对象之间进行通信?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆