问题:假设当前登录用户是Administrator,已经运行了MS Excel程序,那么在Service程序中就无法通过GetActiveObject得到当前运行的MS Excel程序.发生这种问题其实是正常的,因为服务程序是系统帐号,服务程序的ROT和Administrator登录的ROT是两张列表,因不就不能得到Administrator用户的ROT,不过我在使用模拟Administrator帐号后,还是无法得到我需要的ROT,不知CSDN中有没有高手知道解决办法.在线等待...

解决方案 »

  1.   

    http://groups.google.ca/groups?hl=en&lr=&ie=UTF-8&q=GetActiveObject+ROT&btnG=Search&meta=group%3Dmicrosoft.public.vc.atl看看这里的问题是不是跟你的有关!
      

  2.   

    我自己解决了,和大家分享一下吧.注册活动对象时要加上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();
    }