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中的缘故吧。

作者: 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谈起

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

posted on 2011-03-11 11:12 EvilGhost 阅读(384) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

统计

常用链接

留言簿

随笔档案(12)

文章档案(1)

最新随笔

搜索

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜