2009-07-17 9 views
1

J'ai une classe C++ non gérée qui a une carte com à l'intérieur. EX:symbole externe non résolu ... QueryInterface

BEGIN_COM_MAP 
(MyClass) 
    COM_INTERFACE_ENTRY(...) 
END_COM_MAP 

Mais maintenant, à partir de la classe si j'essayer d'appeler this-> QueryInterface je reçois l'erreur suivante:

unresolved external symbol "public: virtual long __stdcall CTest::QueryInterface(struct _GUID const &,void * *)" ([email protected]@@[email protected]@[email protected]) referenced in function "public: __thiscall CTest::CTest(void)" ([email protected]@[email protected])

Mais maintenant, si je tente de mettre en œuvre une méthode QueryInterface I obtenir l'erreur suivante:

 
error C2535: 'HRESULT CTest::QueryInterface(const IID &,void **) throw()' : member function already defined or declared 

Qu'est-ce que je fais mal?

Répondre

1

Merci pour les réponses, mais le problème à la fin semble être que j'essayais de QueryInterface du constructeur. Une fois que je l'ai déplacé vers une méthode séparée tout a bien fonctionné.

Quelqu'un at-il des documents sur pourquoi vous ne pouvez pas appeler QueryInterface à partir d'un constructeur?

+0

Indépendamment du fait que vous puissiez * appeler * QueryInterface, il s'agit d'une fonction virtuelle, donc le conseil standard * contre * l'appel des méthodes virtuelles des constructeurs s'applique. –

+1

QueryInterface (alias QI) n'est généralement pas appelé par les constructeurs car il repose sur le fait que l'objet a été entièrement construit pour fonctionner. Les objets sont construits à partir de la classe de base, et si le support COM est ajouté en tant que wrapper autour d'une classe de base, QI ne fonctionnera jamais à partir de n'importe quel constructeur le long de la chaîne d'héritage. Ainsi, cette opération est généralement effectuée dans une méthode FinalConstruct ou Initialize. –

+0

Merci pour les réponses les gars. Ce furent de belles explications. – Kyle

0

Le problème est que vous n'êtes pas lié correctement aux fichiers lib ATL. Vérifiez vos options de projet dans Visual Studio et assurez-vous que vous liez statiquement à ATL.

+0

CTest :: QueryInterface (struct _GUID const &, void * *) ne sera-t-il pas une exportation des fichiers de la bibliothèque ATL? –

Questions connexes