Especificación de optimización del compilador para un proyecto ATL
De forma predeterminada, el Asistente para controles ATL genera nuevas clases con la macro ATL_NO_VTABLE, como se indica a continuación:
class ATL_NO_VTABLE CProjName
{
...
};
A continuación, ATL define _ATL_NO_VTABLE de la siguiente manera:
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Si no define _ATL_DISABLE_NO_VTABLE, la macro ATL_NO_VTABLE se expande a declspec(novtable)
. El uso de declspec(novtable)
en una declaración de clase impide que el puntero de vtable se inicialice en el constructor de clase y el destructor. Cuando se compila el proyecto, el enlazador elimina la vtable y todas las funciones a las que apunta la vtable.
Debe usar ATL_NO_VTABLE y, por consiguiente declspec(novtable)
, solo con clases base que no sean directamente creables. No debe usar declspec(novtable)
con la clase más derivada del proyecto, ya que esta clase (normalmente CComObject, CComAggObject o CComPolyObject) inicializa el puntero vtable del proyecto.
No debe llamar a funciones virtuales desde el constructor de ningún objeto que use declspec(novtable)
. Debe mover esas llamadas al método FinalConstruct.
Si no está seguro de si debe usar el modificador declspec(novtable)
, puede quitar la macro ATL_NO_VTABLE de cualquier definición de clase, o bien puede deshabilitarla globalmente especificando
#define _ATL_DISABLE_NO_VTABLE
en pch.h (stdafx.h en Visual Studio 2017 y versiones anteriores), antes de que se incluyan todos los demás archivos de encabezado ATL.
Consulte también
Asistente para proyectos ATL
Tipos de proyectos de C++ en Visual Studio
Programar con ATL y código en tiempo de ejecución de C
Aspectos básicos de los objetos ATL COM
novtable
Configuraciones de proyecto ATL predeterminadas