2009-07-17 3 views
1

Ich habe eine nicht verwaltete C++ - Klasse, die eine com-Karte enthält. EX:nicht aufgelöstes externes Symbol ... QueryInterface

BEGIN_COM_MAP 
(MyClass) 
    COM_INTERFACE_ENTRY(...) 
END_COM_MAP 

Aber jetzt innerhalb der Klasse, wenn ich this-> Query-Interface versuche Aufruf ich die folgende Fehlermeldung erhalten:

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])

Aber jetzt, wenn ich versuche, und eine Interface Methode implementieren I erhalten folgende Fehlermeldung:

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

Was mache ich falsch?

Antwort

1

Danke für die Antworten, aber das Problem scheint am Ende zu sein, dass ich versuchte, QueryInterface vom Konstruktor. Sobald ich es zu einer separaten Methode bewegt hat, hat alles gut funktioniert.

Hat jemand irgendwelche Dokumente, warum Sie QueryInterface nicht von einem Konstruktor aufrufen können?

+0

Unabhängig davon, ob Sie * QueryInterface aufrufen können, es handelt sich um eine virtuelle Funktion, daher gilt der Standard-Hinweis * gegen *, der virtuelle Methoden von Konstruktoren aufruft. –

+1

QueryInterface (alias QI) wird im Allgemeinen nicht von Konstruktoren aufgerufen, da es darauf angewiesen ist, dass das Objekt vollständig erstellt wurde. Objekte werden aus der Basisklasse out erstellt, und wenn die COM-Unterstützung als Wrapper um eine Basisklasse hinzugefügt wird, funktioniert QI von keinem Konstruktor entlang der Vererbungskette. Also diese Sachen werden normalerweise in einer FinalConstruct oder einer Initialize Methode gemacht. –

+0

Vielen Dank für die Antworten Jungs. Das waren großartige Erklärungen. – Kyle

0

Das Problem ist, dass Sie nicht ordnungsgemäß mit den ATL-lib-Dateien verknüpfen. Überprüfen Sie Ihre Projektoptionen in Visual Studio und stellen Sie sicher, dass Sie statisch mit ATL verknüpfen.

+0

CTest :: QueryInterface (struct _GUID const &, void * *) wird kein Export der ATL-Bibliotheksdateien wird es sein? –