小弟遇到一个很怪的问题已经写好了两个程序
ComSvc.exe
Client.exe
其中ComSvc.exe是一个用ATL编写的进程外的Com Server,已经完全注册成功。
Client是调用ComSvc的客户端。
ComSvc.exe实现了ICalc接口Client用CoCreateInstance得到ICalc的接口指针。如果我运行Client,可以取得ICalc的指针,使用ICalc的函数可以得到正确的结果我的遇到的问题是
我运行Client,取得ICalc的指针,不释放ICalc接口,此时ComSvc当然还处于运行状态然后再运行一个Client,在取得ICalc接口指针的时候,又一个ComSvc运行起来了!!!!!!为什么会再运行一个ComSvc的实例,为什么系统不使用正在运行的的ComSvc的实例呢????
如果我需要我的ComSvc不管有多少个Client,都只存在一个实例,我该怎么办??
希望各位大虾教我!!!!!!!!!

解决方案 »

  1.   

    时 Single Thread Department吗??
      

  2.   

    但是
    我的COM Component是在一个Exe中啊COM SCM得到我查询接口的请求后,
    根本不理当前系统中已经运行的COM Server
    他回去启动一个新的COM Server
    然后在这个COM Server上查询接口在这种情况下
    我怎么实现Single Object或者Singleton factory???????????????????
      

  3.   

    “为什么会再运行一个ComSvc的实例,为什么系统不使用正在运行的的ComSvc的实例呢????
    如果我需要我的ComSvc不管有多少个Client,都只存在一个实例,我该怎么办??”
    ==========================================================================
    我写的exe server从来没有出现过你这种情况,不管有多少个client激活server的接口只有一个server存在,这个问题应该和Single object没有关系,怀疑你的程序在引用计数上出了问题。把你的程序发给我,我帮你看看:[email protected]
      

  4.   

    楼主,帮忙:
    如何在客户端调用这个Service的接口啊,我试了N次都不行。说拒绝防问!
      

  5.   

    ColderRain(一切尽在不言中)说的不对吧!我觉得应该使用Singleton!这样组件的类对象在内存中才能有一份拷贝。因为在客户端调用CoCreateinstance就new出了一个新对象实例。希望高手能给出相应的例子。多谢![email protected]
      

  6.   

    给我一个谢谢
    [email protected]
      

  7.   

    楼主兄,看看这个吧.也许有帮助
    http://www.vckbase.com/document/viewdoc/?id=1183#总是调用%20CoInitialize(Ex)
      

  8.   

    遗憾!都没说到点子上。Singleton只是对一个进程而言的,当多个客户端生成你的组件实例时,你仍会看到多个服务器进程的实例在运行。真正解决问题的是下面这个API:
    CoRegisterClassObject(m_clsid, &m_xClassFactory,
    CLSCTX_LOCAL_SERVER,
    m_bMultiInstance ? REGCLS_SINGLEUSE : REGCLS_MULTIPLEUSE,
    &m_dwRegister);
    当然罗,这时MFC注册EXE COM Server的一段代码,用到的API你自已查去吧。关键是第四个参数。
      

  9.   

    楼上这位说的才对。进程外应该用REGCLS_SINGLEUSE才对。在一个进程空间内存在一个对象才用Singleton factory
      

  10.   

    在你的com类的定义中添加如下代码:
    DECLARE_CLASSFACTORY_SINGLETON(YourClassName)
      

  11.   

    dcomcnfg -〉identyfy ->不要选择 the interactive user
      

  12.   

    dcomcnfg -〉identyfy ->不要选择 the lunch user