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;
}
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);
}
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);
}
}
CreatePointerMoniker
or other function. But when I register this pointer moniker throughIRunningObjectTable::Register
I getE_NOTIMPL
. Maybe I should use other COM-supplied moniker? – PlaitE_NOTIMPL
to me as well. Are you sure it should work for in-proc servers in the first place? – LamarreE_NOTIMPL
. – Lamarre