Вопрос

Я пытаюсь создать класс, реализующий 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.По соглашению все интерфейсы происходят от чисто виртуального базового класса 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;
    }
}

Другие советы

В любом из IVMRImagePresenter9, IVMRSurfaceAllocator9 уже реализован IUnknown? Может быть, вам нужно:

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown

Я думаю, вам также может понадобиться реализовать AddRef () и Release () в соответствии с документы для IUnknown.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top