ATL COM初探(1)

我没有看过任何的COM书籍,以下总结均是我个人在ATL框架下的实验所得,如有错误望指正。目前的实验都是单进程中的,至于跨进程的实验还未进行。

Apartment:

这是一个抽象的概念,我简单的将其理解为作用域(COM对象的生存空间)。可以分为Single-Threaded Apartment(STA)和Multi-Threaded Apartment(MTA),至于Neutral Apartment, Thread Neutral Apartment, Neutral Threaded Apartment(NA, TNA, NTA)还没接触过。一个进程中可以存在多个STA,但只能存在一个MTA。创建COM对象所需要的Apartment类型不存在的时候,系统会自行创建。

主STA:

在进程中没有任何STA的情况下,第一个初始化的STA(包括之前存在STA但已经退出的情况)称为主STA。在获取(创建)单线程COM对象时,如果在没有主STA的情况下(哪怕存在STA,但主STA退出了),系统会向RPC申请一个线程来创建一个主STA,换句话说就是STA是无法改变自身的主从属性的,主从属性从初始化的时刻其就决定了。系统进行同步的STA至少需要一个消息循环,否则代理对象会被阻塞(系统创建的STA会自带一个消息循环)。

单线程COM:

只能存在于主STA,在非主STA中系统会使用代理对象进行访问并利用窗口消息进行同步,也就是说只有主STA得到的是原始指针,其他的Apartment得到的均为代理指针。如果我们想将某个COM对象约束在某个线程中,那么这个模型是很适合的。只要这个线程初始化关联主STA,那么这个模型的COM对象都会存在于这个线程了(因为一个STA作用域是不能跨线程的)。

单元COM:

存在于STA,在非所属STA中系统会使用代理对象进行访问并利用窗口消息进行同步,也就是说只有在STA中创建得到的是原始指针,Marshal得到的都是代理指针,MTA中创建得到的也是代理指针。

两者COM:

STA和MTA创建均得到原始指针。在与对象的创建不同的Apartment中得到的将是代理指针(可以指定得到原始指针,但这会失去系统对STA对象的访问同步),若创建的是STA对象,那么系统会利用窗口消息进行同步;若创建的是MTA对象,系统不会进行同步。

自由COM:

只存在于MTA,在STA中创建或者Marshal得到的都是代理指针,但系统不会进行同步。在MTA中创建和Marshal得到的都是原始指针。

中性COM:

STA和MTA创建均得到代理指针。Marshal得到的代理指针均为同一个指针,系统不会进行同步。只能得到代理指针可能是因为其只存在于NA中的缘故吧。

posted @ 2011-03-11 11:12  Evil.Ghost  阅读(929)  评论(0编辑  收藏  举报