Freigeben über


Festlegen der Compileroptimierung für ein ATL-Projekt

Der ATL-Steuerelement-Assistent erstellt standardmäßig neue Klassen mit dem ATL_NO_VTABLE-Makro. Beispiel:

class ATL_NO_VTABLE CProjName
{
   ...
};

_ATL_NO_VTABLE wird von ATL anschließend wie folgt definiert:

#ifdef _ATL_DISABLE_NO_VTABLE
   #define ATL_NO_VTABLE
#else
   #define ATL_NO_VTABLE __declspec(novtable)
#endif

Wenn Sie _ATL_DISABLE_NO_VTABLE nicht definieren, wird das ATL_NO_VTABLE-Makro zu declspec(novtable) erweitert. Durch die Verwendung von declspec(novtable)in einer Klassendeklaration wird verhindert, dass der vtable-Zeiger im Klassenkonstruktor und -destruktor initialisiert wird. Wenn Sie das Projekt erstellen, werden vtable und sämtliche Funktionen, auf die von vtable verwiesen wird, vom Linker entfernt.

ATL_NO_VTABLE und folglich auch declspec(novtable) dürfen nur mit Basisklassen verwendet werden, die nicht direkt erstellbar sind. declspec(novtable) darf nicht mit der am meisten abgeleiteten Klasse im Projekt verwendet werden, da diese Klasse (normalerweise CComObject, CComAggObject oder CComPolyObject) den vtable-Zeiger für das Projekt initialisiert.

Virtuelle Funktionen dürfen nicht vom Konstruktor eines Objekts aufgerufen werden, das declspec(novtable) verwendet. Sie sollten diese Aufrufe in die FinalConstruct-Methode verschieben.

Wenn Sie nicht sicher sind, ob Sie den declspec(novtable)-Modifizierer verwenden sollten, können Sie das ATL_NO_VTABLE-Makro aus einer beliebigen Klassendefinition entfernen oder es global durch die Codezeichenfolge

#define _ATL_DISABLE_NO_VTABLE

in stdafx.h deaktivieren, bevor alle anderen ATL-Headerdateien einbezogen werden.

Siehe auch

Aufgaben

Erstellen von Projekten mit Anwendungs-Assistenten

Referenz

ATL-Projekt-Assistent

Fundamentals of ATL COM Objects

novtable

Standardmäßige ATL-Projektkonfigurationen

Konzepte

Visual C++-Projekte

Programming with ATL and C Run-Time Code