我没有看过任何的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中的缘故吧。
作者: Evil.Ghost 发表于 2011-03-11 11:12 原文链接
评论: 0 查看评论 发表评论
最新新闻:
· 苹果iPad 2通过3C认证 最晚5月国内上市(2011-04-10 09:18)
· 盲目依赖iPhone等工具导航 英国驴友迷路多(2011-04-10 09:14)
· 趣谈:想担任CEO的话,最好是去苹果工作,其次是微软,再才是Google(2011-04-10 08:26)
· 腾讯将建立新数据中心,规模为苹果的两倍(2011-04-10 08:25)
· 轻量化的微型博客Tumblr(2011-04-10 08:03)
编辑推荐:非战之罪,从永中Office谈起
网站导航:博客园首页 我的园子 新闻 闪存 小组 博问 知识库