Festlegen der Compileroptimierung für ein ATL-Projekt

Standardmäßig generiert der ATL-Steuerelement-Assistent neue Klassen mit dem makro ATL_NO_VTABLE wie folgt:

class ATL_NO_VTABLE CProjName
{
...
};

ATL definiert dann _ATL_NO_VTABLE wie folgt:

#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 auf declspec(novtable). Die Verwendung declspec(novtable)in einer Klassendeklaration verhindert, dass der vtable-Zeiger im Klassenkonstruktor und Destruktor initialisiert wird. Wenn Sie Ihr Projekt erstellen, beseitigt der Linker die vtable und alle Funktionen, auf die die vtable verweist.

Sie müssen ATL_NO_VTABLE und folglich declspec(novtable)nur mit Basisklassen verwenden, die nicht direkt bestellbar sind. Sie dürfen nicht mit der am häufigsten abgeleiteten Klasse in Ihrem Projekt verwendet werden declspec(novtable) , da diese Klasse (in der Regel CComObject, CComAggObject oder CComPolyObject) den vtable-Zeiger für Ihr Projekt initialisiert.

Sie dürfen keine virtuellen Funktionen aus dem Konstruktor eines Objekts aufrufen, das verwendet declspec(novtable)wird. Sie sollten diese Aufrufe an 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 Sie können es global deaktivieren, indem Sie folgendes angeben:

#define _ATL_DISABLE_NO_VTABLE

in pch.h (stdafx.h in Visual Studio 2017 und früher), bevor alle anderen ATL-Headerdateien enthalten sind.

Siehe auch

ATL-Projekt-Assistent
C++-Projektvorlagen
Programmieren mit ATL- und C-Laufzeitcode
Grundlagen von ARL COM-Objekten
novtable
Standardmäßige ATL-Projektkonfigurationen