ATL 2.1 a été optimisé pour le compilateur Visual C++ 5.0. En particulier, vous devez être conscient que plusieurs classes ATL sont déclarés avec le ATL_NO_VTABLE macro:
classe ATL_&NO_VTABLE CComControl
{
nbsp ; ...
}
ATL définit ATL_NO_VTABLE comme suit:
# ifdef _ATL_DISABLE_&NO_VTABLE
nbsp ; # define ATL_NO_VTABLE
# else
# define ATL_NO_VTABLE __declspec(novtable)
# endif
Si _ATL_DISABLE_NO_VTABLE n'est pas défini, la ATL_NO_VTABLE macro se développe pour declspec(novtable) . Lorsque declspec(novtable) est utilisé dans une déclaration de classe, elle empêche le pointeur vtable d'être initialisé dans le constructeur et le destructeur de la classe. L'éditeur de liens peut ainsi éliminer de la vtable et toutes les fonctions indiqué par la vtable, pourvu que la classe la plus dérivée (généralement CComObject, CComAggObjectou CComPolyObject) n'utilise pas declspec(novtable) et sera donc initialiser le pointeur vtable correctement.
Par défaut, l'Assistant objet ATL va générer de nouvelles classes avec la ATL_NO_VTABLE macro. Comme décrit précédemment, la declspec(novtable) attribut ne doit être utilisée avec les classes de base qui ne sont pas être créées directement. En outre, il est dangereux pour appeler des fonctions virtuelles dans le constructeur de tout objet qui utilise declspec(novtable) . Vous devez passer tous ces appels à la méthode FinalConstruct.
Si vous ne savez pas si vous devez utiliser le declspec(novtable) attribut, vous pouvez supprimer la ATL_NO_VTABLE macro d'une définition de classe ou vous le désactiver à l'échelle mondiale en spécifiant #define _ATL_DISABLE_NO_VTABLE dans le fichier stdafx.h, avant tous les autre ATL fichiers d'en-tête sont inclus.