求教:
  我用ATL写了一个MTS组件,然后在Console下调试,No Problem.
  But!当把该组件注册到COM+服务,再进行调试,O'My God, CreateInstance(...)创建实例失败.
  疑惑?求教.......
  急 急 急

解决方案 »

  1.   

    补充:
      MTS组件属性
      1.Threading Model: Both
      2.事务支持: 无
      3.启用对象池: 否问题描述:
      1.没有注册到COM+目录时,Console程序实例化组件的语句为:
         ISophe* pSophe=NULL;
         HRESULT hr=CoCreateInstance(CLSID_Sophe,NULL,CLSCTX_ALL,IID_ISophe,(void**)&pSophe);
         调试成功
      2.注册到COM+目录后,重新配置了Project/Setting/Debug项
        Executable for debug session: c:\winnt\system32\dllhost
        Program argument: /ProcessID:{D887EB5A-07F5-4187-B8F9-EDB928D74E37}
        调试失败
      

  2.   

    求教:
      刚刚看到有关于CoCreateInstanceEx的贴子,上面提到了COM+组件,所以我就用CoCreateInstanceEx调试了一下,具体如下:
         COSERVERINFO cs;
         memset(&cs,0,sizeof(cs));
         cs.pwszName=OLESTR("wuthering-ware");     MULTI_QI qi[1];
         memset(qi,0,sizeof(qi));
         qi[0].pIID=&IID_ISophe;     HRESULT hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);
         ISophe* pSophe=NULL;
       //hr=CoCreateInstance(CLSID_Sophe,NULL,CLSCTX_ALL,IID_ISophe,(void**)&pSophe);
         hr = CoCreateInstanceEx(CLSID_Sophe,   // clsid 
                        NULL,          // outer unknown
                CLSCTX_SERVER, //server context
      &cs,           // server info 
                                 1,             // size of qi
         qi             // MULTI_QI array
              );   结果和用CoCreateInstance相同,没有注册到COM+目录前调试成功.注册到COM+目录后,调试出错.
      请各位大侠指教....
      急......
      

  3.   

    我在程序里加了如下代码:
             //Set a low level of security
    hr=CoInitializeSecurity(NULL,
                            -1,
                   NULL,
                   NULL,
                   RPC_C_AUTHN_LEVEL_NONE,
                   RPC_C_IMP_LEVEL_IMPERSONATE,
                   NULL,
                   EOAC_NONE,
                   NULL);
              if(FAILED(hr))
         return 0;语句执行通过.但CoCreateInstanceEx(...)还是返回失败.我又到COM+目录服务中进行了如下安全设置:
        调用的身份验证级: 无
        模拟级: 匿名
    然后调试,仍然失败.可否就"检查安全性设置"问题更详细的描述.不胜感激.....
      

  4.   

    经过一番排列组合式的调试后,终于解决了,但却不胜明白,现描述如下:我写的那个COM+组件支持如下接口:
        IUnknown            ---  COM的根接口
        IObjectControl      ---  支持COM+缓冲池功能的接口  
        ISophe              ---  用户自定义接口
    组件的Threading Model: Both
    在VC6.0下通过Console程序调试,CreateInstance,CreateInstanceEx都是失败.当我修改了该COM+组件的接口后,修改如下:
        把该组件改成dual接口,既支持IDispatch
    O' That's crazy..... 她通过了.
     
    更加疑惑!!!!!!!!!!不是说IDispatch接口是为了那些Scripting Host(没有Pointer概念的语言)服务的吗?
    可我现在是在C++的语言环境下啊,应该是可以通过IUnknown联系通信的啊?
      

  5.   

    楼主请确保代理/占位组件正确注册了。
    未加入COM+环境时,由于楼主的组件是Both,且又是MTS组件(一定是进程内组件),故在客户端时一定不会发生跨套间问题,又估计楼主使用标准汇集法(即使用MIDL编译IDL文件),因此没有对代理/占位组件的需求,故没有任何问题。COM+和MTS中的组件的每一个实例都有一个环境对象和其相绑定,而绑定的方式就是MTS或COM+通过改写标准代理对象(也就是代理管理器和占位管理器)来截获对组件对象的调用从而实行即时激活、自动事务等服务。也就是说MTS/COM+都一定会加载代理/占位组件而不管这个组件对象实际是否跨套间调用。而楼主后来改成双接口,IDispatch的代理/占位组件已经注册了(为ole32.dll),所以后来又正常了。
      

  6.   

    非常感谢........
    彼人刚开始使用COM/COM+(开发工具是VC6.0)开发系统,以前都是用VB6.0开发COM/COM+的.