2009-09-12 8 views
0

J'essaie de créer une classe qui implémente l'interface IUnknown. Je le code suivant dans le fichier d'en-tête:Implémentation du symbole externe IUnknown, non résolu

#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 les uuid.lib pertinents et plusieurs autres. Cependant, lorsque je tente de compiler, je reçois l'erreur.

Error 2 error LNK2001: unresolved external symbol "public: virtual long __stdcall Vmr9Presenter::QueryInterface(struct _GUID const &,void * *)" ([email protected]@@[email protected]@[email protected]) Vmr9Presenter.obj VmrPresenter

Cela me porte à croire que quelque chose ne se tiré dans Toutes les suggestions sur la façon de se débarrasser de cette erreur?

Répondre

4

Toutes les interfaces I * ne sont que 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 "la classe Vmr9Presenter implémente ces interfaces". Vous dites aussi "La classe Vmr9Presenter dérive de deux classes de base virtuelles pures appelées IVMRImagePresenter9 et IVMRSurfaceAllocator 9. Par convention toutes les interfaces dérivent d'une classe de base virtuelle pure appelée IUnknown

Cela signifie que vous devez implémenter toutes les méthodes dans .. les classes de base virtuelles pures dans votre objet vous avez donc besoin de mettre en œuvre toutes les méthodes sur IVMRImagePresenter9 et IVMRSurfaceAllocator9 vous devez également mettre en œuvre 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 vous faites cela, cela devrait fonctionner.

Généralement, une mise en œuvre de QI ressemble:

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

Votre explication est parfaitement logique. Cependant, dans le code que vous avez publié, static_cast (this) est signalé par le compilateur comme une référence ambiguë. Je suppose que c'est parce que IVMRSurfaceAllocator9 et IVMRImagePresenter9 dérivent de IUnknown? Cette distribution semble toutefois fonctionner. static_cast (static_cast (static_cast (this))) Je suppose que c'est parce que le compilateur ne peut pas, lui-même, choisir la mise en œuvre de IUnknown à utiliser? Ou suis-je complètement hors de la base et cela ne fera pas ce que je pense qu'il fait? – Alex

+0

Vous avez totalement raison, j'étais paresseux. Désolé pour ça.Votre solution est exactement exacte. –

0

Est-ce que IVMRImagePresenter9, IVMRSurfaceAllocator9 est déjà implémenté par IUnknown? Peut-être que vous avez besoin:

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown 

Je suppose que vous devrez peut-être mettre en œuvre AddRef() et Release() aussi selon la docs pour IUnknown.

+0

Sur la base de votre commentaire, si l'outil ne IUnknown, pourrais-je faire juste un reinterpret_cast (ce) et appelez QueryInterface? – Alex

+0

Comme l'a dit Larry, vous devez créer une implémentation des fonctions exposées sur chaque interface. Vous devez ensuite dire ce que je ne sais pas utiliser. –

Questions connexes