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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top