我有興趣比較兩個IDirect3DDevice9
COM指針,它們繼承IUnknown
以實現相等性。基於一個similar topic,我明白你可以爲QI
IUnknown
兩個指針,並比較結果的平等。然而,我很好奇,如果我們可以通過一個IsEqual
方法完成同樣的事情,直接使用兩個IUnknown
指針,讓繼承確定相關的指針IUnknown
,並將其用於相等性檢查。根據我的實驗,這似乎工作,並不需要QI
和release
操作(或者可能隱式完成)。如果有任何警告,保證此建議無效,請讓我知道。通過QI或繼承的IUnknown相等之間的區別
BOOL IsEqual(IUnknown *pA, IUnknown *pB)
{
return (pA == pB);
}
BOOL IsEqual (IDirect3DDevice9 *pDevice1, IDirect3DDevice9 *pDevice2)
{
IUnknown *u1, *u2;
pDevice1->QueryInterface(IID_IUnknown, &u1);
pDevice2->QueryInterface(IID_IUnknown, &u2);
BOOL areSame = u1 == u2;
u1->Release();
u2->Release();
return areSame;
}
實際上,我認爲這些情況更多,我認爲第一次IsEqual檢查並不能保證按預期工作,因爲傳入方法的IUnknown指針僅代表相同的IDirect3DDevice9指針。因此,如果兩個指針的開頭不同,那麼相等性檢查就會失敗。 – lancery
不,您的編譯器不知道如何調用QueryInterface()。它會假定指針已經兼容,因爲IUnknown是基本接口,並且不會嘗試轉換它。哪個產生錯誤的結果,需要QI。您可以使用C++中的CComQIPtr類來處理QI調用和Release()調用。 –
如果所有COM組件都作爲C++類實現並且不存在多重繼承和聚合,那麼* *可能會工作,但事實並非如此。實際上,* COM Tutorial Samples *推薦在嵌套類中實現接口,這使得聚合支持更容易。這使得查詢IUnknown是強制性的。 – Medinoc