Попробуйте использовать 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);
}
}