温馨提示×

C++中QueryInterface函数怎么用

c++
小亿
97
2023-11-13 20:49:31
栏目: 编程语言

在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
{
    // 查询接口失败
}

0