C++中QueryInterface函數(shù)怎么用

c++
小億
104
2023-11-13 20:49:31

在C++中,QueryInterface函數(shù)主要用于實(shí)現(xiàn)COM接口的查詢功能。它通常用于在一個(gè)對(duì)象中查詢指定的接口是否存在,并獲取該接口的指針。

接口的定義類似于以下形式:

class IInterface
{
public:
    virtual HRESULT queryInterface(REFIID riid, void** ppv) = 0;
    // 其他接口方法...
};

其中,queryInterface函數(shù)需要傳入一個(gè)REFIID參數(shù),表示要查詢的接口的唯一標(biāo)識(shí)符。另外,還需要傳入一個(gè)void** ppv參數(shù),表示用于接收查詢到的接口指針的地址。

在類的實(shí)現(xiàn)中,queryInterface函數(shù)實(shí)現(xiàn)如下:

HRESULT MyClass::queryInterface(REFIID riid, void** ppv)
{
    if (riid == IID_IInterface) // IID_IInterface為待查詢接口的唯一標(biāo)識(shí)符
    {
        *ppv = static_cast<IInterface*>(this);
        AddRef(); // 如果查詢成功,需要增加引用計(jì)數(shù)
        return S_OK; // 返回成功標(biāo)志
    }
    else
    {
        *ppv = nullptr; // 如果查詢失敗,將接口指針置為空
        return E_NOINTERFACE; // 返回接口不存在的錯(cuò)誤代碼
    }
}

在使用QueryInterface函數(shù)時(shí),可以通過類的指針調(diào)用該函數(shù),并傳入待查詢接口的唯一標(biāo)識(shí)符和接收接口指針的地址。如果查詢成功,QueryInterface函數(shù)會(huì)返回S_OK,同時(shí)將接口指針賦值給ppv所指向的地址;如果查詢失敗,QueryInterface函數(shù)會(huì)返回E_NOINTERFACE,并將接口指針置為空。

示例代碼如下:

IInterface* pInterface = nullptr;
HRESULT hr = myObject->queryInterface(IID_IInterface, reinterpret_cast<void**>(&pInterface));
if (SUCCEEDED(hr))
{
    // 成功獲取接口指針,可以使用pInterface調(diào)用接口方法
}
else
{
    // 查詢接口失敗
}

0