在C++中,QueryInterface函數主要用于實現COM接口的查詢功能。它通常用于在一個對象中查詢指定的接口是否存在,并獲取該接口的指針。
接口的定義類似于以下形式:
class IInterface
{
public:
virtual HRESULT queryInterface(REFIID riid, void** ppv) = 0;
// 其他接口方法...
};
其中,queryInterface函數需要傳入一個REFIID參數,表示要查詢的接口的唯一標識符。另外,還需要傳入一個void** ppv參數,表示用于接收查詢到的接口指針的地址。
在類的實現中,queryInterface函數實現如下:
HRESULT MyClass::queryInterface(REFIID riid, void** ppv)
{
if (riid == IID_IInterface) // IID_IInterface為待查詢接口的唯一標識符
{
*ppv = static_cast<IInterface*>(this);
AddRef(); // 如果查詢成功,需要增加引用計數
return S_OK; // 返回成功標志
}
else
{
*ppv = nullptr; // 如果查詢失敗,將接口指針置為空
return E_NOINTERFACE; // 返回接口不存在的錯誤代碼
}
}
在使用QueryInterface函數時,可以通過類的指針調用該函數,并傳入待查詢接口的唯一標識符和接收接口指針的地址。如果查詢成功,QueryInterface函數會返回S_OK,同時將接口指針賦值給ppv所指向的地址;如果查詢失敗,QueryInterface函數會返回E_NOINTERFACE,并將接口指針置為空。
示例代碼如下:
IInterface* pInterface = nullptr;
HRESULT hr = myObject->queryInterface(IID_IInterface, reinterpret_cast<void**>(&pInterface));
if (SUCCEEDED(hr))
{
// 成功獲取接口指針,可以使用pInterface調用接口方法
}
else
{
// 查詢接口失敗
}