對於操作原始的接口指針是比較麻煩的,需要我們自己控制引用記數、API 調用、異常處理。於是 ATL 提供了2個智能指針的模板包裝類,CComPtr<> 和 CComQIPtr<>,這兩個類都在 <atlbase.h> 中聲明。CComQIPtr<> 包含了 CComPtr<>的所有功能,因此我們可以完全用 CComQIPtr<> 來使用智能接口指針,唯一要說明的一點就是:CComQIPtr<> 由於使用了運算符的重載功能,它會自動幫我們調用QueryInterface()函數,因此 CComQIPtr<> 唯一的缺點就是不能定義 IUnknown * 指針。
// 智能指針 smart pointer,按照匈牙利命名法,一般以 sp 開頭來表示變量類型 CComPtr < IUnknown > spUnk; // 正確 // 假設 IFun 是一個接口類型 CComPtr < IFun > spFun; // 正確 CComQIPtr < IFun > spFun; // 正確 CComQIPtr < IFun, &IID_IFun > spFun; // 正確 CComQIPtr < IUnknown > spUnk; // 錯誤!CComQIPtr不能定義IUnknown指針
因爲CComQIPtr中有一個CComQIPtr(T* lp)和CComQIPtr(IUnknown* lp)所以如果T=IUnknown那麼兩個函數就重名了,所以不能查詢IUnknown,而是重新定義了一個模板實例