Как установить связь между двумя COM-объектами, используя таблицу объектов (ROT)?
У меня есть два COM-объекта, написанные на C++ и ATL. Есть в одной библиотеке и я знаю их IID и CLID.
Я не могу найти пример такой простой связи между двумя простыми COM-объектами. Как создать IMoniker и как добавить его в ROT? А потом, как получить указатель этого объекта, в другой COM в другой процесс / поток?
Кто-нибудь может привести небольшой пример?
РЕДАКТИРОВАТЬ: Больше информации:
Я пишу дополнение для IE. Есть два совершенно не связанных между собой COM-объекта, которые IE загружают для разных целей. Одним из них является BHO (Browser Helper Obect), другим - Асинхронный подключаемый протокол (APP). Я обнаружил, что могу общаться через ROT здесь.
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 ( регистрация в 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);
}
}