Question

J'essaie de créer une classe qui implémente l'interface IUnknown . J'ai le code suivant dans le fichier d'en-tête:

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

J'ai inclus le uuid.lib approprié et plusieurs autres. Cependant, lorsque je tente de compiler, j'obtiens le message d'erreur suivant:

  

Erreur 2 erreur LNK2001: symbole externe non résolu & public; virtuel:   __stdcall long Vmr9Presenter :: QueryInterface (struct _GUID const & amp;, void   * *) " (? QueryInterface @ Vmr9Presenter @@ UAGJABU_GUID @@ PAPAX @ Z) Vmr9Presenter.obj VmrPresenter

Cela me porte à croire que quelque chose ne va pas arriver. Des suggestions sur la façon de se débarrasser de cette erreur?

Était-ce utile?

La solution

Toutes les interfaces I * ne sont que cela - des définitions d’interface. Une interface est une classe de base virtuelle pure en termes C ++.

Quand vous dites:

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9

vous dites que "la classe Vmr9Presenter implémente ces interfaces". Vous dites également que la classe Vmr9Presenter dérive de deux classes de base virtuelles pures nommées IVMRImagePresenter9 et IVMRSurfaceAllocator9. Par convention, toutes les interfaces proviennent d'une classe de base virtuelle pure appelée IUnknown.

Cela signifie que vous devez implémenter toutes les méthodes des classes de base virtuelle pure de votre objet. Vous devez donc implémenter toutes les méthodes sur IVMRImagePresenter9 et IVMRSurfaceAllocator9. Vous devez ÉGALEMENT implémenter toutes les méthodes sur leurs classes de base, y compris IUnknown.

IUnknown dispose de 3 méthodes: AddRef, Release et QueryInterface. L'erreur que vous signalez indique que l'éditeur de liens n'a pas pu trouver une fonction nommée Vmr9Presenter :: QueryInterface.

Vous devez ajouter une telle fonction à votre classe. Une fois que cela sera fait, cela devrait fonctionner.

En règle générale, une implémentation QI se présente comme suit:

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

Autres conseils

Est-ce que l'un des IVMRImagePresenter9, IVMRSurfaceAllocator9 implémente déjà IUnknown? Peut-être avez-vous besoin de:

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown

Je suppose que vous devrez peut-être aussi implémenter AddRef () et Release () aussi selon docs pour IUnknown.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top