_______高手快来呀!!!如何在Service中调用GetActiveObject得到当前用户的ROT

时间:2021-05-13 20:15:07
问题:假设当前登录用户是Administrator,已经运行了MS Excel程序,那么在Service程序中就无法通过GetActiveObject得到当前运行的MS Excel程序.

发生这种问题其实是正常的,因为服务程序是系统帐号,服务程序的ROT和Administrator登录的ROT是两张列表,因不就不能得到Administrator用户的ROT,不过我在使用模拟Administrator帐号后,还是无法得到我需要的ROT,不知****中有没有高手知道解决办法.在线等待...

5 个解决方案

#1


http://groups.google.ca/groups?hl=en&lr=&ie=UTF-8&q=GetActiveObject+ROT&btnG=Search&meta=group%3Dmicrosoft.public.vc.atl

帮你UP

#2


对对对.和楼主一样...这个问题也是让我百思不得其解...帮楼主顶一下.....希望可以有高手可以解决这个问题

#3


希望版主能把这个问题置顶,谢谢~~~~

#4


我自己解决了,和大家分享一下吧.

注册活动对象时要加上ROTFLAGS_ALLOWANYCLIENT | ROTFLAGS_REGISTRATIONKEEPSALIVE 两个标志,这样服务程序就能够找到了.

原来的代码:
hr = RegisterActiveObject(GetInterface(&IID_IUnknown), 
clsid, NULL, &m_dwRegister);


改为以下的代码就可以了:
LPRUNNINGOBJECTTABLE lpRot = NULL;
HRESULT hr = GetRunningObjectTable(0, &lpRot);
if(lpRot != NULL)
{
IMoniker *pMoniker = NULL;

LPOLESTR szClsid = NULL;
StringFromCLSID(clsid, &szClsid);
HRESULT hr = CreateItemMoniker(L"!", szClsid, &pMoniker);
CoTaskMemFree(szClsid);

if(pMoniker != NULL)
{
hr = lpRot->Register(ROTFLAGS_ALLOWANYCLIENT | ROTFLAGS_REGISTRATIONKEEPSALIVE, 
GetInterface(&IID_IUnknown), pMoniker, &m_dwRegister);
pMoniker->Release();
}

lpRot->Release();
}

#5


过会就结帖了,分只能给进来的朋友了.:)

#1


http://groups.google.ca/groups?hl=en&lr=&ie=UTF-8&q=GetActiveObject+ROT&btnG=Search&meta=group%3Dmicrosoft.public.vc.atl

帮你UP

#2


对对对.和楼主一样...这个问题也是让我百思不得其解...帮楼主顶一下.....希望可以有高手可以解决这个问题

#3


希望版主能把这个问题置顶,谢谢~~~~

#4


我自己解决了,和大家分享一下吧.

注册活动对象时要加上ROTFLAGS_ALLOWANYCLIENT | ROTFLAGS_REGISTRATIONKEEPSALIVE 两个标志,这样服务程序就能够找到了.

原来的代码:
hr = RegisterActiveObject(GetInterface(&IID_IUnknown), 
clsid, NULL, &m_dwRegister);


改为以下的代码就可以了:
LPRUNNINGOBJECTTABLE lpRot = NULL;
HRESULT hr = GetRunningObjectTable(0, &lpRot);
if(lpRot != NULL)
{
IMoniker *pMoniker = NULL;

LPOLESTR szClsid = NULL;
StringFromCLSID(clsid, &szClsid);
HRESULT hr = CreateItemMoniker(L"!", szClsid, &pMoniker);
CoTaskMemFree(szClsid);

if(pMoniker != NULL)
{
hr = lpRot->Register(ROTFLAGS_ALLOWANYCLIENT | ROTFLAGS_REGISTRATIONKEEPSALIVE, 
GetInterface(&IID_IUnknown), pMoniker, &m_dwRegister);
pMoniker->Release();
}

lpRot->Release();
}

#5


过会就结帖了,分只能给进来的朋友了.:)