Pergunta

Eu estou tentando criar uma classe que implementa a interface IUnknown. Eu tenho o seguinte código no arquivo de cabeçalho:

#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);
};  

Eu incluí o uuid.lib relevante e vários outros. No entanto, quando tento compilar, eu recebo o erro:

Erro 2 Erro LNK2001: Símbolo externo não resolvido "pública: virtual longa __stdcall Vmr9Presenter :: QueryInterface (struct _GUID const &, nula * *)"(? QueryInterface @ Vmr9Presenter @@ UAGJABU_GUID @@ PAPAX @ Z) Vmr9Presenter.obj VmrPresenter

Isso me leva a acreditar que algo não está sendo puxado. Todas as sugestões sobre como se livrar deste erro?

Foi útil?

Solução

Todos os I * interfaces são apenas isso - interface de definições. Uma interface é uma classe base virtual puro em termos C ++.

Quando você diz:

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9

você está dizendo "os implementos classe Vmr9Presenter essas interfaces". Você também está dizendo "Os deriva classe Vmr9Presenter de duas classes base virtual pura nomeados IVMRImagePresenter9 e IVMRSurfaceAllocator9. Por convenção todas as interfaces derivam de uma classe base virtual puro chamado IUnknown.

Isso significa que você precisa para implementar todos os métodos nas classes base virtual pura em seu objeto. Então, você precisa implementar todos os métodos em IVMRImagePresenter9 e IVMRSurfaceAllocator9. Você também precisa implementar todos os métodos no seus classes de base, incluindo IUnknown.

IUnknown tem 3 métodos: AddRef, lançamento e QueryInterface. O erro que você está relatando diz que o vinculador foi incapaz de encontrar uma função chamada Vmr9Presenter :: QueryInterface.

Você precisa adicionar essa função para sua classe, uma vez que você fazer isso ele deve funcionar.

Normalmente, uma implementação QI parece com:

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;
    }
}

Outras dicas

Do qualquer um IVMRImagePresenter9, IVMRSurfaceAllocator9 já implementar IUnknown? Talvez você precisa:

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown

Eu acho que você também pode precisar de implementar AddRef () e Release () também de acordo com o docs para IUnknown.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top