我沒有看過任何的COM書籍,以下總結(jié)均是我個人在ATL框架下的實驗所得,如有錯誤望指正。目前的實驗都是單進程中的,至于跨進程的實驗還未進行。
Apartment:
這是一個抽象的概念,我簡單的將其理解為作用域(COM對象的生存空間)。可以分為Single-Threaded Apartment(STA)和Multi-Threaded Apartment(MTA),至于Neutral Apartment, Thread Neutral Apartment, Neutral Threaded Apartment(NA, TNA, NTA)還沒接觸過。一個進程中可以存在多個STA,但只能存在一個MTA。創(chuàng)建COM對象所需要的Apartment類型不存在的時候,系統(tǒng)會自行創(chuàng)建。
主STA:
在進程中沒有任何STA的情況下,第一個初始化的STA(包括之前存在STA但已經(jīng)退出的情況)稱為主STA。在獲取(創(chuàng)建)單線程COM對象時,如果在沒有主STA的情況下(哪怕存在STA,但主STA退出了),系統(tǒng)會向RPC申請一個線程來創(chuàng)建一個主STA,換句話說就是STA是無法改變自身的主從屬性的,主從屬性從初始化的時刻其就決定了。系統(tǒng)進行同步的STA至少需要一個消息循環(huán),否則代理對象會被阻塞(系統(tǒng)創(chuàng)建的STA會自帶一個消息循環(huán))。
單線程COM:
只能存在于主STA,在非主STA中系統(tǒng)會使用代理對象進行訪問并利用窗口消息進行同步,也就是說只有主STA得到的是原始指針,其他的Apartment得到的均為代理指針。如果我們想將某個COM對象約束在某個線程中,那么這個模型是很適合的。只要這個線程初始化關(guān)聯(lián)主STA,那么這個模型的COM對象都會存在于這個線程了(因為一個STA作用域是不能跨線程的)。
單元COM:
存在于STA,在非所屬STA中系統(tǒng)會使用代理對象進行訪問并利用窗口消息進行同步,也就是說只有在STA中創(chuàng)建得到的是原始指針,Marshal得到的都是代理指針,MTA中創(chuàng)建得到的也是代理指針。
兩者COM:
STA和MTA創(chuàng)建均得到原始指針。在與對象的創(chuàng)建不同的Apartment中得到的將是代理指針(可以指定得到原始指針,但這會失去系統(tǒng)對STA對象的訪問同步),若創(chuàng)建的是STA對象,那么系統(tǒng)會利用窗口消息進行同步;若創(chuàng)建的是MTA對象,系統(tǒng)不會進行同步。
自由COM:
只存在于MTA,在STA中創(chuàng)建或者Marshal得到的都是代理指針,但系統(tǒng)不會進行同步。在MTA中創(chuàng)建和Marshal得到的都是原始指針。
中性COM:
STA和MTA創(chuàng)建均得到代理指針。Marshal得到的代理指針均為同一個指針,系統(tǒng)不會進行同步。只能得到代理指針可能是因為其只存在于NA中的緣故吧。

作者: Evil.Ghost 發(fā)表于 2011-03-11 11:12 原文鏈接
評論: 0 查看評論 發(fā)表評論
最新新聞:
· 蘋果iPad 2通過3C認證 最晚5月國內(nèi)上市(2011-04-10 09:18)
· 盲目依賴iPhone等工具導航 英國驢友迷路多(2011-04-10 09:14)
· 趣談:想擔任CEO的話,最好是去蘋果工作,其次是微軟,再才是Google(2011-04-10 08:26)
· 騰訊將建立新數(shù)據(jù)中心,規(guī)模為蘋果的兩倍(2011-04-10 08:25)
· 輕量化的微型博客Tumblr(2011-04-10 08:03)
編輯推薦:非戰(zhàn)之罪,從永中Office談起
網(wǎng)站導航:博客園首頁 我的園子 新聞 閃存 小組 博問 知識庫