是不是所有的COM 组件都运行在线程里吗? 如题!我看到的<COM本质论>讲理论不用线程,单VC生成时默认就有一个线程模式(signle)。MTS的组件选择哪个线程模式哪?signle,apartmet,both?谁能具体讲讲! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用VC60+win2000+ATL3.0+visual assistant6 想验证这个问题,给你个建议自己试验一下就知道了创建一个com,做一个接口函数,如TestTest(){ AtlTrace("Current ThreadId:%d",GetCurrentThreadId());...}客户端main(){ printf("\nMainThread ID:%d",GetCurrentThreadId()); ... yourcom.Test();} 你的问题很...是不是所有的COM 组件都运行在线程里吗?你说什么程序代码不是在线程里运行的?!如果不在线程里,那请问在哪运行? > 是不是所有的COM 组件都运行在线程里吗?是的,确切来讲,所有的COM 组件都运行在套间(APARTMENT)里。 我前面MTS写错了是MTA.我现在讨论的是COM组件,主要想知道为什么组件一定要运行在线程里?请指出准确的资料来源!对这个问题我想明确认识!我手里有一些参考资料:Inside COM/Enss COM/ATL编程指南/COM原理与应用/COM/DCOM从入门到精通/COM+原理/COM集中营的一些资料/...在实际用VC作程序的时候,总是有一个默认的线程模式.而我看Inside COM的时候好像可以不用.如果大家认为必须要用,请指出理由?另外在MTA里为什么不用调度线程指针,而STA里一定要哪?除了VC还有其它COM书写工具吗? 俺认为准确地说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就更是臃肿了,还需要一个运行库支持呢。 非常感谢 zzyx(菜农)及大家 的关注!这个问题已经比较长时间了。大家的建议使我有很大收获,谢谢! com ★★★在.net区求救未果,来这里寻找达人: 关于如何取得文件编码的问题? 如何获取一个编辑框指针 重绘函数Invalidate()怎么用?? 如何把主窗体的参数传递给属性页,来者有分 我的程序里我只建立了一个线程,用按扭来改变一个全局变量来终止线程,会产生同步问题吗? VC中Tab的使用 请教关于activex 如果我在对话框力作过图形了,如何更新?(通过数据库的不同纪录) 各位,能否帮小弟看看这个代码,先谢了 用new动态申请的内存 提示内存不足 将一个字符串转换成实型数据
创建一个com,做一个接口函数,如Test
Test()
{
AtlTrace("Current ThreadId:%d",GetCurrentThreadId());
...
}客户端
main()
{
printf("\nMainThread ID:%d",GetCurrentThreadId());
...
yourcom.Test();
}
是不是所有的COM 组件都运行在线程里吗?你说什么程序代码不是在线程里运行的?!
如果不在线程里,那请问在哪运行?
我现在讨论的是COM组件,主要想知道为什么组件一定要运行在线程里?请指出准确的资料来源!对这个问题我想明确认识!我手里有一些参考资料:
Inside COM/Enss COM/ATL编程指南/COM原理与应用/COM/DCOM从入门到精通/COM+原理/COM集中营的一些资料/...在实际用VC作程序的时候,总是有一个默认的线程模式.而我看Inside COM的时候好像可以不用.
如果大家认为必须要用,请指出理由?另外在MTA里为什么不用调度线程指针,而STA里一定要哪?除了VC还有其它COM书写工具吗?
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就更是臃肿了,还需要一个运行库支持呢。