Spécification de l'optimisation du compilateur pour un projet ATL
Mise à jour : novembre 2007
Par défaut, l'Assistant Contrôle ATL génère les nouvelles classes avec la macro ATL_NO_VTABLE, comme indiqué ci-après :
class ATL_NO_VTABLE CProjName
{
...
};
ATL définit ensuite _ATL_NO_VTABLE de la manière suivante :
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Si vous ne définissez pas _ATL_DISABLE_NO_VTABLE, la macro ATL_NO_VTABLE s'exécute jusqu'à declspec(novtable). L'utilisation de declspec(novtable)dans une déclaration de classe empêche que le pointeur vtable ne soit initialisé dans le constructeur et le destructeur de la classe. Lors de la génération de votre projet, l'éditeur de liens enlève le pointeur vtable et toutes les fonctions vers lesquelles il pointe.
Vous ne devez utiliser ATL_NO_VTABLE, et donc declspec(novtable), que pour des classes de base qui ne peuvent pas être créées directement. Vous ne devez pas utiliser declspec(novtable) avec la classe la plus dérivée dans votre projet, car cette classe (généralement CComObject, CComAggObject ou CComPolyObject) initialise le pointeur vtable pour votre projet.
Vous ne devez pas non plus appeler des fonctions virtuelles à partir du constructeur d'un objet qui utilise declspec(novtable). Transférez ces appels à la méthode FinalConstruct.
Si vous ne savez pas si vous devez ou non utiliser le modificateur declspec(novtable), vous pouvez supprimer la macro ATL_NO_VTABLE dans une définition de classe ou bien désactiver cette macro de façon globale en spécifiant la ligne de code
#define _ATL_DISABLE_NO_VTABLE
dans le fichier stdafx.h, avant l'ajout de tous les autres fichiers d'en-tête ATL.
Voir aussi
Tâches
Création de projets avec les Assistants Application
Concepts
Programming with ATL and C Run-Time Code