是不是所有的COM 组件都运行在线程里吗?

xiaohedou 2003-08-05 03:58:55
如题!我看到的<COM本质论>讲理论不用线程,单VC生成时默认就有一个线程模式(signle)。MTS的组件选择哪个线程模式哪?signle,apartmet,both?谁能具体讲讲!
...全文
55 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohedou 2003-08-18
  • 打赏
  • 举报
回复
非常感谢 zzyx(菜农)及大家 的关注!这个问题已经比较长时间了。大家的建议使我有很大收获,谢谢!
zzyx 2003-08-18
  • 打赏
  • 举报
回复
俺认为准确地说
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就更是臃肿了,还需要一个运行库支持呢。





brave_heart 2003-08-08
  • 打赏
  • 举报
回复
> 是不是所有的COM 组件都运行在线程里吗?

是的,确切来讲,所有的COM 组件都运行在套间(APARTMENT)里。
xiaohedou 2003-08-07
  • 打赏
  • 举报
回复
up!

难道没人能答吗?
nonocast 2003-08-07
  • 打赏
  • 举报
回复
你的问题很...
是不是所有的COM 组件都运行在线程里吗?

你说什么程序代码不是在线程里运行的?!
如果不在线程里,那请问在哪运行?
zzyx 2003-08-07
  • 打赏
  • 举报
回复
想验证这个问题,给你个建议自己试验一下就知道了
创建一个com,做一个接口函数,如Test
Test()
{
AtlTrace("Current ThreadId:%d",GetCurrentThreadId());
...
}

客户端
main()
{
printf("\nMainThread ID:%d",GetCurrentThreadId());
...
yourcom.Test();
}
xiaohedou 2003-08-05
  • 打赏
  • 举报
回复
我用VC60+win2000+ATL3.0+visual assistant6

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧