聚合指的是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。