COM聚合的實現

聚合指的是COM對象轉接客戶端對某個接口的請求。

某COM對象B並不實現ISomeInterface接口,但是可以通過調用某個內部COM對象A來支持該接口。意思是指,當客戶端調用B所支持的接口IOtherInterface查詢ISomeInterface時,直接將對象A的ISomeInterface接口指針傳出去。

實現聚合的關鍵是COM對象在被聚合時的QueryInterface的處理。按照COM規範,通過接口查詢到的IUnknown接口必須唯一。所以即便B對象不實現ISomeInterface接口,但是調用該接口查詢到的IUnknown接口應當跟通過IOtherInterface查詢到的一樣。但因爲實際上ISomeInterface是內部對象A的接口,所以爲了符合規範,必須對A被聚合的情況進行特殊處理。

內部對象可以在外部對象初始化時通過CoCreateInstance函數創建,該函數的聲明爲:

       STDAPI CoCreateInstance(
  REFCLSID rclsid,
  LPUNKNOWN pUnkOuter,
  DWORD dwClsContext,
  REFIID riid,
  LPVOID * ppv
);

其中pUnkOuter指針用於指明該組件被聚合,並將外部對象的IUnknown接口指針傳進來。這樣,在內部對象進行查詢的時候,以及AddRef,Release時,可以先判斷外部IUnknown指針是否爲空,若不爲空,就要通過外部IUnknown指針調用QueryInterface,以及AddRef和Release。

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