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