1:  
  我看到许多书上写到如果组件支持对象池那麽组件中就必须没有私有的状态变量  
  这是为甚麽?  
  是不是指我在组件中不能定义一个成员变量???  
  能不能举一个小例子说明一下  
  。
2:
  mts 的组件(out-of-process)如何调试!!!!!

解决方案 »

  1.   

    对的。MTS,COM+其实主要是为事务而生的。不好反映逻辑商务对象,如果你要直观反映逻辑商务对象,最好在它之上加一层老式的COM组件。
    COM+的对象好像不太好调试,我是通过使用宏,加编译开关,调试期去除环境变量的一切调用,换言之把它当作一个老式的组件来调试。发布期把编译开关去掉就可以了。
      

  2.   

    也不仅仅是支持对象池的组件没有私有成员变量,只要你用到了环境变量的SetComplete(), SetAbort(),私有成员变量就没有了意义。
    两者不同的是,支持对象池的组件在每次调用完成,环境变量提交后,不会注销组件,而是把它放进对象池。而不支持的对象池的组件每个调用后都注销实际对象(注意,在COM+中,客户面对的是环境封装后的逻辑对象,而我前面两次这里说的是实际对象)。
    举个例子,你写一个老式组件CObject(不支持对象池),给它加一个方法
    HRESULT _stdcall DoSome()
    {
       m_pObject->SetComplete();
    }
    然后在它的FinalConstruct中添加
    MessageBox(...)语句。
    跟着你用VB Script调用
    Set obj = CreateObject("Test.Object")
    obj.DoSome
    obj.DoSome
    你会发现,每次调用,对话框就会弹出来,尽管这里逻辑对象没有注销,但是实际对象两次构造,两次释放了。
      

  3.   

    1:并不是说不能在被pooling的组件中定义成员变量,而是说调用者(调用你组件的人)不能靠你组件的变量来维护状态。因为组件在执行某起操作后,如SetComplete,SetAbort后就会Deactivate,然后被丢进池里,这时如果调用者在原来的接口上再调过其它的方法,COM+就会在其池中随机拣一个,调它的Active,返回给调用者,这时不敢保证这个组件实例就是原来那个,因为池中不止一个实例。所以它上的状态量就不可以信任了!
    2:在Debug选项中,可执行文件填c:\winnt\system32\dllhost.exe
    命令行参数填/ProcessID:{COM+中的应用程序GUID}