尝试使用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(check in in MSDN)。 该函数返回使用网站,你可以用它来从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);
}
}
为什么要在这种情况下使用ROT? – sharptooth 2011-03-01 15:44:48
@sharptooth我正在为IE编写附加组件。我更新了我的问题。 – 2011-03-01 16:05:48
嗯,我明白了。您必须搜索如何实现IMoniker界面。 – sharptooth 2011-03-02 08:17:27