使用ATL将类厂注册为MULTPLEUSER,在XP下正常,所有的client都会连接到一个COM实例上。
但是到了vista下,由于用户权限的问题,vista会自动的为在不同的上下文下的COM请求生成不同的实例,不知道如何解决。
初学COM,请高手指教!

解决方案 »

  1.   

    做成COM Server等,实现单例模式,其他的客户端请求,都由它处理...
    来了请求第一个创建实例,后面请求,发现已经创建,就直接处理
      

  2.   

    客户端的请求我只知道用CoCreateInstance来获得服务提供的接口,如何判断已经存在实例并获得接口呢?谢谢!
      

  3.   

    做成服务就不会存在这个问题?一会试验一下 。不过如果可以的话,那不是就绕过了vista的安全机制?
      

  4.   

    http://www.eggheadcafe.com/software/aspnet/29825236/singleton-against-win-vis.aspx
    看看这个链接,他是通过CoInitializeSecurity解决了uac下的单实例问题。
    也有人提出利用service来解决的方案。
      

  5.   

    程序里加互斥,启动的新的服务实例是可以关闭,但是client请求的接口没有得到。
      

  6.   

    采用Moniker技术试试,在vista下,moniker技术有所不同
      

  7.   

    关键问题不在服务器端,而在客户端口。客户端应当先调用GetActiveObject 来判断所请求的服务器端是否已经运行,如果已经运行,则 AttachDispatch, 否则的话 CreateDispatch. 参考代码:CLSID clsidWMP;
    LPDISPATCH pWMPDispatch = NULL; AfxCheckError(::CLSIDFromProgID(_T("COMServer.application"), &clsidWMP)); IID_IDispatch, (LPVOID*)&pWMPDispatch);
    LPUNKNOWN lpUnk;
    HRESULT hr = ::GetActiveObject(clsidWMP, NULL, &lpUnk);
    if (hr == NOERROR)
    {
    HRESULT hr = lpUnk->QueryInterface(IID_IDispatch,
    (LPVOID*)&pWMPDispatch);
    lpUnk->Release();
    if (hr == NOERROR)
    m_Comserver.AttachDispatch(pWMPDispatch, TRUE);
    }
    if (m_Comserver.m_lpDispatch == NULL)
    {
    m_Comserver.CreateDispatch(clsidWMP);
    }
      

  8.   

    我用过ROT,但是GetActiveObject返回“不能执行的操作”。不知道楼上的方法行不行,理论上应该也不行,因为没有解决vista的安全问题。
      

  9.   

    做成Automation server可以么?
      

  10.   

    只在xp环境下玩过,Vista环境不清楚
      

  11.   

    做成COM Server等,实现单例模式,其他的客户端请求,都由它处理...
    来了请求第一个创建实例,后面请求,发现已经创建,就直接处理
    或者加一个互斥
      

  12.   

    路过看看,windows xp下可以创建一个具名的内核对象,每次启动时判断对象是否存在,在则退出,不知道有没有参考意义?
      

  13.   

    在COM服务器中,启动的时候加入如下代码
    HRESULT hr;
    DWORD m_dwCookie;
    hr=RegisterActiveObject(GetControllingUnknown(),
    clsid,
    ACTIVEOBJECT_WEAK,
    &m_dwCookie);
    if(FAILED(hr))
    {
    AfxMessageBox(_T("Didn't register Active Object"));
    }然后在客户端调用的时候用我上面的代码就OK
      

  14.   

    做成COM Server等,实现单例模式,其他的客户端请求,都由它处理...
    来了请求第一个创建实例,后面请求,发现已经创建,就直接处理
      

  15.   

    做成COM Server等,实现单例模式,其他的客户端请求,都由它处理...
    来了请求第一个创建实例,后面请求,发现已经创建,就直接处理