COS組件系統理解

COS組件系統理解

1.  Cos中的GetIf也就相當於COM中的queryinterface,可以從此cos組件支持的任意接口通過此函數獲取其它支持接口的指針。
2.  pOuter指針是用來做com中的aggregation用的比如annimalpOuter指針指向kolaa對象,使Ianimal接口可以查詢到Ikoala接口。

 

 

3.  接口原則上是不能有變量數據的,如果要實現每個接口實例要有自己的變量而且不暴露給客戶,例
暴露給用戶的ex.h               
INEW
{
GetI();
SetI();
};
內部的.h
INEWIn
{
GetI();
SetI();
Int I;
};
用戶使用INEW但在內部 轉換成 INEWIn操作;inside ole第二章 ENUMRECT例子多用了一個vtbl結構體隔離接口和實現相比上一方法更好點,但這種方法如果用c語言的client使用此組件,則取得組件接口指針後要PIntface->vtbl->func(),這樣調用,c++client則直接PIntface->func()COM中可以,cos不行見8)。
4. 每個接口有計數,cos組件本身也有計數。
5. COM中的queryinterface實際上是用把this指針強制類型static_cast轉換成其他接口的指針來實現的,而COS裏更簡單(c語言),每個接口實例都是一個全局的變量,通過匹配接口標誌就返回全局變量的指針就行。
6.C++COM中,實現是繼承接口的,在createinst時只實例化實現,而在c語言中,vtbl結構體全是函數指針,接口包含vtbl的指針,實現是另一個結構體包含了vtbl的指針並且有變量,實現被實例化,而vtbl結構體被置爲全局變量,詳見insideole 第二章ENUMRECT例子程序,cos其沒有vtbl的結構體,而是實現的結構體繼承了接口結構體(IGet,其實IGet嚴格意義上不是一個接口,其中有ref變量,爲了方便使用),cos這樣幹違背了com的二進制規範嗎??有什麼影響呢???待進一步理解com
7. 引用計數
規則:全局變量:對於保存在全局變量中的接口指針,在將其傳遞給另外一個函數前,必須調用其addref,由於此變量是全局性的,應此任何函數都可以通過調用其release來終止其生命,對於保存在成員變量中的接口指針,也應這樣,因爲對於所有成員函數來說,他是全局的。(適用於cos
8.關於COSCOM的不同之處:COS編出來的實際上是一個BIN(相當於EXE)是可執行文件,而COM編出來的是一個DLL不是可執行的,comc組件和c++組件保持二進制兼容就可以直接互調,而cos不行:cos編出來的是個bin,這個bin在頭上的固定位置有幾個固定的接口,另外的一個客戶程序要load這個binload程序就去查bin頭的這幾個接口,這幾個接口負責解析整個bin提供出來的功能接口,這樣load程序就不用自己去遵循某種協議去自己搜索bin的功能接口,所以在編程時c程序做成跟c++保持二進制兼容的在cos裏沒用,一個cosc++程序調用load去加載binc++程序的load是不去解析bin的,而是bin自己的appentry去解析自己的bin的,所以c++程序也看不到c程序的二進制兼容的結構,只有它自己的binappentry看得到。
         當時cos設計時有兩種選擇:1.就是現在的設計思路;2.不把cos編成bin而是編成類似於dllELF格式,這樣由比如說c++的客戶程序去加載此cos,然後使用(跟COM一樣),c++客戶程序去加載時,客戶的load程序就要去解析elf格式,由於elf格式有很多頭信息,解析比較麻煩,所以load要能解析elf,才能讓客戶看到c的兼容二進制功能接口,這樣比第一種複雜,在嵌入式環境裏也很複雜。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章