Implementazione del simbolo esterno IUnnown non risolto
-
06-07-2019 - |
Domanda
Sto cercando di creare una classe che implementa l'interfaccia IUnknown
. Ho il seguente codice nel file di intestazione:
#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);
};
Ho incluso il uuid.lib
pertinente e molti altri. Tuttavia, quando provo a compilare, ottengo l'errore:
Errore 2 errore LNK2001: simbolo esterno non risolto " pubblico: virtuale long __stdcall Vmr9Presenter :: QueryInterface (struct _GUID const & amp;, void * *) " (? QueryInterface @ Vmr9Presenter @@ UAGJABU_GUID @@ PAPAX @ Z) Vmr9Presenter.obj VmrPresenter
Questo mi porta a credere che qualcosa non viene tirato dentro. Qualche suggerimento su come sbarazzarsi di questo errore?
Soluzione
Tutte le interfacce I * sono proprio questo: definizioni di interfaccia. Un'interfaccia è una pura classe di base virtuale in termini di C ++.
Quando dici:
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9
stai dicendo " la classe Vmr9Presenter implementa queste interfacce " ;. Stai anche dicendo " La classe Vmr9Presenter deriva da due classi di base virtuali pure denominate IVMRImagePresenter9 e IVMRSurfaceAllocator9. Per convenzione, tutte le interfacce derivano da una pura classe di base virtuale chiamata IUnknown.
Ciò significa che è necessario implementare tutti i metodi nelle classi di base virtuali pure nel proprio oggetto. Quindi è necessario implementare tutti i metodi su IVMRImagePresenter9 e IVMRSurfaceAllocator9. È inoltre necessario implementare tutti i metodi sulle loro classi base, incluso IUnknown.
IUnknown ha 3 metodi: AddRef, Release e QueryInterface. L'errore che stai segnalando afferma che il linker non è stato in grado di trovare una funzione chiamata Vmr9Presenter :: QueryInterface.
Devi aggiungere una tale funzione alla tua classe, una volta fatto dovrebbe funzionare.
In genere un'implementazione QI assomiglia a:
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;
}
}
Altri suggerimenti
IVMRImagePresenter9, IVMRSurfaceAllocator9 implementa già IUnnown? Forse hai bisogno di:
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown
Immagino che potresti anche dover implementare AddRef () e Release () anche in base a docs per IUnknown.