如题!我看到的<COM本质论>讲理论不用线程,单VC生成时默认就有一个线程模式(signle)。MTS的组件选择哪个线程模式哪?signle,apartmet,both?谁能具体讲讲!

解决方案 »

  1.   

    我用VC60+win2000+ATL3.0+visual assistant6
      

  2.   

    想验证这个问题,给你个建议自己试验一下就知道了
    创建一个com,做一个接口函数,如Test
    Test()
    {
     AtlTrace("Current ThreadId:%d",GetCurrentThreadId());
    ...
    }客户端
    main()
    {
      printf("\nMainThread ID:%d",GetCurrentThreadId());
      ...
      yourcom.Test();
    }
      

  3.   

    你的问题很...
    是不是所有的COM 组件都运行在线程里吗?你说什么程序代码不是在线程里运行的?!
    如果不在线程里,那请问在哪运行?
      

  4.   

    > 是不是所有的COM 组件都运行在线程里吗?是的,确切来讲,所有的COM 组件都运行在套间(APARTMENT)里。
      

  5.   

    我前面MTS写错了是MTA.
    我现在讨论的是COM组件,主要想知道为什么组件一定要运行在线程里?请指出准确的资料来源!对这个问题我想明确认识!我手里有一些参考资料:
    Inside COM/Enss  COM/ATL编程指南/COM原理与应用/COM/DCOM从入门到精通/COM+原理/COM集中营的一些资料/...在实际用VC作程序的时候,总是有一个默认的线程模式.而我看Inside COM的时候好像可以不用.
    如果大家认为必须要用,请指出理由?另外在MTA里为什么不用调度线程指针,而STA里一定要哪?除了VC还有其它COM书写工具吗?
      

  6.   

    俺认为准确地说
    COM也是一段代码,他肯定是运行在一个线程中的,毫无例外
    这根本不用特别说明。但COM的规范指定了所有的COM 组件都运行在公寓(APARTMENT)里。
    我想你把线程模型-公寓(也有叫套间)和线程混淆了从线程的角度看,COM可能和客户端运行在同一个线程中
    也可能运行在COM环境提供的另外的一个线程中从线程模型的角度看,COM肯定运行在某一个公寓中
    COM环境为不同的公寓模型提供了不同的线程同步机制CoInitialize不是启动一个线程,而是启动一个公寓,
    让以后创建的COM对象有一个可用的公寓
    COM环境在实际工作的时候,可能会根据实际情况,把你的COM对象放到某类公寓中俺觉得,书上写的线程模型部分都比较凌乱,需要自己去体会
    要想理解这个东东,需要区别出好几个概念
    COM组件指定的线程模型,以及表现
    客户端的指定的线程模型
    注册表指定的线程模型
    C/S间实际运行的关系
    公寓间的调用与线程间的调度关系……遗憾的是,俺没有看到哪本书写得非常清晰
    ……当然,俺看书从来也不认真,理解能力也差,所以到现在为止,俺也不太明白
    只是随便说说而已至于MTA,STA,Free,Both之类的,还是看书吧,仔细体会吧至于开发COM的工具,俺觉得
    VC的ATL最强大,也最灵活,出来的东西也非常精致,
    但太复杂,难掌握,需要理解的概念太多俺用Delphi和VB也做过COM,相对来说,Delphi做COM非常方便容易,
    如果模型不复杂,实在是太简单了,只是比ATL要臃肿得多。
    ……没有用delphi做过复杂的COM应用,不知道会怎么样。但如果只是要进行简单的
    代码封装,那么delphi非常好VB就更是臃肿了,还需要一个运行库支持呢。
      

  7.   

    非常感谢 zzyx(菜农)及大家 的关注!这个问题已经比较长时间了。大家的建议使我有很大收获,谢谢!