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