IUnknown、未解決の外部シンボルの実装
-
06-07-2019 - |
質問
IUnknown
インターフェースを実装するクラスを作成しようとしています。ヘッダーファイルに次のコードがあります:
#pragma once
#include "stdafx.h"
#include "Unknwn.h"
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9
{
public:
Vmr9Presenter(void);
HRESULT Initialize(void);
~Vmr9Presenter(void);
STDMETHODIMP QueryInterface(const IID &riid, void **ppvObject);
};
関連する uuid.lib
および他のいくつかを含めました。ただし、コンパイルしようとすると、次のエラーが表示されます。
エラー2エラーLNK2001:未解決の外部シンボル" public:virtual long __stdcall Vmr9Presenter :: QueryInterface(struct _GUID const&、void * *)" (?QueryInterface @ Vmr9Presenter @@ UAGJABU_GUID @@ PAPAX @ Z)Vmr9Presenter.obj VmrPresenter
これにより、何かが引き込まれていないと思うようになります。このエラーを取り除く方法に関する提案はありますか?
解決
すべてのI *インターフェースは、インターフェース定義です。インターフェイスは、C ++の用語では純粋な仮想ベースクラスです。
あなたが言うとき:
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9
「Vmr9Presenterクラスはこれらのインターフェースを実装しています」と言っています。 " Vmr9Presenterクラスは、IVMRImagePresenter9およびIVMRSurfaceAllocator9という名前の2つの純粋な仮想基本クラスから派生しているとも言っています。慣例により、すべてのインターフェイスは、IUnknownと呼ばれる純粋な仮想基本クラスから派生します。
これは、オブジェクトの純粋仮想ベースクラスにすべてのメソッドを実装する必要があることを意味します。したがって、IVMRImagePresenter9およびIVMRSurfaceAllocator9ですべてのメソッドを実装する必要があります。また、IUnknownを含むすべてのメソッドを their ベースクラスに実装する必要があります。
IUnknownには、AddRef、Release、QueryInterfaceの3つのメソッドがあります。報告しているエラーは、リンカがVmr9Presenter :: QueryInterfaceという名前の関数を見つけられなかったことを示しています。
そのような関数をクラスに追加する必要があります。追加したら、機能するはずです。
通常、QI実装は次のようになります。
HRESULT IVmr9Presenter::QueryInterface(REFIID iid, PVOID *pvInterface)
{
if (pvInterface == NULL)
{
return E_POINTER;
}
*pvInterface = NULL;
if (iid == IID_IUnknown)
{
*pvInterface = static_cast<PVOID>(static_cast<IUnknown *>(this));
return S_OK;
}
if (iid == IID_IVMRSurfaceAllocator9)
{
*pvInterface = static_cast<PVOID>(static_cast<IVMRSurfaceAllocator9*>(this));
return S_OK;
}
:
else
{
return E_NOINTERFACE;
}
}
他のヒント
IVMRImagePresenter9、IVMRSurfaceAllocator9のいずれかがすでにIUnknownを実装していますか?たぶん必要です:
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown
ドキュメント IUnknown。