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