COM學習筆記三--聚合

在開發過程中,當一個COM B需要調用另一個COM A時,這時有兩種方法來實現該操作:包含,聚合。前一種直接保存A的對象指針,所有的操作均在B中進行封裝,涉及到A操作方法,利用A對象指針完成調用;而聚合在初始化期間保存對象A的指針,在運行過程中,所有涉及到A操作的方法無需封裝,直接調用A的方法,將對象A的指針直接暴露給用戶,讓用戶自己調用。

包含則只暴露給用戶B對象的指針,聚合同時暴露給用戶對象A和B的兩個指針,由於COM文檔規定,同一個COM只能獲取一個指針,那麼A和B就需要滿足指針的一致性,這樣在實現過程中就需要針對對象A分別做聚合與非聚合之分,當聚合時,接口之間的查詢必須過渡到對象B,讓對象B去負責接口查詢,非聚合則保持不變;在涉及到接口的計數操作時,聚合操作均需要對象B去實現,對象A則無需處理。在析構函數時,由於對象A包含對象B的指針,對象B包含對象A的指針,在對象B中,對象A的析構在B析構函數中完成,在對象A中,所有的增加,自減引用計數均由對象B負責,通過調用對象B的對象AddRef,Release方法完成。

總而言之,聚合對象A需要將所有操作交由對象B完成,對象B中只需負責對象A的釋放。那麼對象A中需要實現兩種操作:聚合與非聚合的情形。判斷聚合與否,通過CoCreateInstance方法中的第二個參數來確定,傳遞對象B的指針保存在對象A中。


具體源碼見這裏

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