一个关于com线程的问题

mycreatedream 2003-04-21 05:46:27
这是我的一个朋友提出的问题,但是我没有能力解答,希望各位高手出手相助。
---------------------------------------------------------------------

最近这几天生病在家,闲来无事翻了翻DON BOX的COM本质论。越看越发现自己对COM的理解不够、不对,尤其是关于COM套间的这一部分。
所以在此小弟将自己对COM套间的一些认识和疑问写出来,希望大家看过后能给一些指正,谢谢。

一个需要使用COM组件的程序,在使用COM组件之前需要调用CoInitializeEx函数来做一些初始化工作,而这个程序所想要使用的套间类型也就是在CoInitializeEx函数内进行初始化是初始化MTA套间的环境还是初始化STA套间的环境。
与客户在调用COM组件之前需要创建套间相对的是,用户具体要使用的COM组件,也可以通过指定线程模型来指定自己可以运行在什么样的套间内(使用Apartment线程模型的COM组件可以运行在STA套间内,使用Free线程模型的COM组件可以运行在MTA套间内)。
如果调用客户所初始化的套间类型与COM组件线程模型所基于的套间是一致的话,那么可以直接在客户的套间内来创建COM组件。如果不一致的话,那么COM组件会在其可以运行的另一个套间内被创建,并且以后它与客户的交互是使用列集这样的套间间通讯手段来完成的。

以下是我不理解的几点:
1.书上说对STA套间内对象的访问只能是串行进行的,而且一个Apartment线程模型的COM对象只能被激活它的STA客户调用。但是我做了一个实验:在Delphi当中创建了一个线程模型为Apartment的自动化对象,然后在两条被初始化为使用STA套间的线程内对一个COM对象进行调用,结果发现调用结果并不是并行的。
2.如果是一个基于STA的客户来调用一个Free线程模型的COM对象,那么应该是在COM库的透明支持下客户使用列集的方式来调用COM对象。但是我有一些不明白的是,客户的调用方法是否是被串行化后才对FREE线程模型的的COM组件进行调用呢?
...全文
52 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nelsonc 2003-04-27
  • 打赏
  • 举报
回复
你是如何在两个线程中调用同一个COM对象的?关键问题是,你不能够把一个套间中的接口指针直接在到另一个套间中使用。我不知道你的具体编程,但我猜想你是把一个套间的指针直接用到另一个套间中,这样的话,就会跳过COM对STA套间的管理,而无法串行访问一COM对象。blueblood7所说的方法是正确的。应该用列集技术在套间之间传递接口指针。但所提到的问题“但我在用第二种方式时发现无论第一个线程是否退出套间,第二个线程都无法完成对接口函数的调用。”应该不会出现,可能是哪里出错了,最有可能发生的错误是没有消息循环。
对于第二个问题。系统里至少会有两个套间,一个是客户的STA套间,另一个是系统为COM对象创建的MTA套间。由于在两个套间之间调用,所以会通过proxy/stub进行。你的问题是系统是否进行串行化。实际上,对于一个STA套间,只能有一个线程,所以不存在串行化的问题。如果你有多个STA套间,那么COM对象的函数是有可能重入的,你必须自己处理数据同步的问题。
不知道我的解答是否对你有用。还有,《COM本质论》是一本好书,直的好好研究啊。
wujpbb7 2003-04-21
  • 打赏
  • 举报
回复
在 Gregory Brill 著的《精通COM+》中有关于在两个线程之间直接传递接口指针问题的描述。
大意是:
1、如果直接传接口指针(如 http://expert.csdn.net/Expert/topic/1657/1657341.xml?temp=.5532038 中讨论的),COM 没被通知到,COM 不负责对对象访问的并发控制。
2、通知 COM 的方式就是使用列集/散集技术(CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream)。

但我在用第二种方式时发现无论第一个线程是否退出套间,第二个线程都无法完成对接口函数的调用。

(注:客户线程初试化是用 CoInitialize(NULL), COM 对象是Apartment线程模型。)

free_card 2003-04-21
  • 打赏
  • 举报
回复
关注

3,248

社区成员

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

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