Compartir vía


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