C++のQueryInterface関数はどのように使いますか。

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