Все интерфейсы I * - это только определения интерфейсов. Интерфейс - это чисто виртуальный базовый класс в терминах C ++.
Когда вы говорите:
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9
вы говорите "класс Vmr9Presenter реализует эти интерфейсы". Вы также говорите: «Класс Vmr9Presenter происходит от двух чисто виртуальных базовых классов с именами IVMRImagePresenter9 и IVMRSurfaceAllocator9. По соглашению все интерфейсы наследуются от чисто виртуального базового класса с именем IUnknown.
Это означает, что вам нужно реализовать все методы в чисто виртуальных базовых классах вашего объекта. Поэтому вам нужно реализовать все методы для IVMRImagePresenter9 и IVMRSurfaceAllocator9. Вам также необходимо реализовать все методы их базовых классов, включая IUnknown.
IUnknown имеет 3 метода: AddRef, Release и QueryInterface. В сообщении об ошибке говорится, что компоновщику не удалось найти функцию с именем 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;
}
}