前不久看完了《Inside Com》。書(shū)寫(xiě)得非常棒,有了這個(gè)基礎(chǔ),打算繼續(xù)研究《Com 本質(zhì)論》。下面是我看完此書(shū)記錄下來(lái)的一些東西:
1. CoCreateInstance 的調(diào)用過(guò)程(這里的組件位于 DLL 中):
圖片說(shuō)明了一切。對(duì)比一下 CoCreateInstance 的聲明:
WINOLEAPI CoCreateInstance(__in REFCLSID rclsid,
__in_opt LPUNKNOWN pUnkOuter,
__in DWORD dwClsContext,
__in REFIID riid,
__deref_out LPVOID FAR* ppv);
值得一提的是 CoGetClassObject 調(diào)用了 Dll 的導(dǎo)出函數(shù) DllGetClassObject ,Regsvr32 /s /u 當(dāng)然是使用了對(duì)應(yīng)的 DllRegisterServer / DllUnregisterServer 導(dǎo)出函數(shù)。如果使用 ATL,這一切繁雜的工作都省卻了,但反注冊(cè)還需手動(dòng)操作……
2. 獲取聚合組件接口的過(guò)程:
理解組件聚合技術(shù)是一次痛苦的經(jīng)歷。前后三天,苦苦思索,我終于在那個(gè)陰冷的下午獲得了“安東尼達(dá)斯”的垂青。如果他早一點(diǎn)給我一瓶智力藥水,何至如此呢!看圖說(shuō)話:
其中,兩個(gè)InUnk都是非代理IUnknown。
這樣一來(lái),對(duì)于外部組件來(lái)說(shuō):
|
IX |
Outer->QueryInterface |
獲取 |
|
|
|
IY |
InUnkO->QueryInterface |
對(duì)于內(nèi)部組件來(lái)說(shuō):
|
IX |
OutUnk->QueryInterface->InUnkO->QueryInterface |
獲取 |
|
|
|
IY |
OutUnk->QueryInterface |
所有的 QueryInterface 動(dòng)作都直接或間接的由外部組件執(zhí)行。
這讓我想起了《變形金剛2》。假如我一進(jìn)電影院就睡著了,等到天火和擎天柱組合之后我才醒來(lái)。那么對(duì)于我來(lái)說(shuō),擎天柱就是外部組件,IX為跑。天火為內(nèi)部組件,IY為飛。此時(shí)我不知道有天火的存在。當(dāng)我問(wèn)擎天柱你會(huì)飛嗎的時(shí)候,他知道他不會(huì)飛(沒(méi)有IY接口),于是他問(wèn)天火你會(huì)不會(huì)飛,天火就返回IY(飛)接口,于是擎天柱告訴我他會(huì)飛。當(dāng)他飛著的時(shí)候(我想通過(guò)IY來(lái)查詢IX),我問(wèn)他會(huì)跑么,這句話只有天火聽(tīng)得見(jiàn)(因?yàn)槲矣玫氖荌Y接口),天火不會(huì)跑,他就問(wèn)擎天柱,擎天柱知道自己會(huì)跑(有IX接口),于是就給我一個(gè)IX接口。整個(gè)過(guò)程中,我只知道擎天柱,并不知道天火的存在,于是擎天柱聚合了天火。
但我怎么可能進(jìn)去就睡著了呢!
內(nèi)部組件的代理接口只是簡(jiǎn)單的調(diào)用外部的QueryInterface,是個(gè)轉(zhuǎn)發(fā)站,一切工作交由外部組件統(tǒng)籌。關(guān)于具體實(shí)現(xiàn),《COM本質(zhì)論》中給出的 "impunk.h" 頭文件中有很好的實(shí)現(xiàn)。我非常喜歡其中關(guān)于接口查找表的實(shí)現(xiàn),那個(gè)offset獲取偏移地址的方法讓我這個(gè)C語(yǔ)言功力薄弱的人感到十分慚愧。
過(guò)兩天再把套間線程和自由線程整理出來(lái)。
posted on 2009-12-05 20:16
崇文 閱讀(1223)
評(píng)論(3) 編輯 收藏 引用