L
liguang
Unregistered / Unconfirmed
GUEST, unregistred user!
最近这几天生病在家,闲来无事翻了翻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组件进行调用呢?
所以在此小弟将自己对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组件进行调用呢?