Especificando o otimização de compilador para um projeto do ATL
Por padrão, o Assistente de controle ATL gera novas classes com a macro ATL_NO_VTABLE, da seguinte maneira:
class ATL_NO_VTABLE CProjName
{
...
};
Em seguida, ATL define _ATL_NO_VTABLE como segue:
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Se você não definir a _ATL_DISABLE_NO_VTABLE, a macro ATL_NO_VTABLE se expande para declspec(novtable). Usando declspec(novtable)em uma declaração de classe impede que o ponteiro vtable de sendo inicializado no construtor de classe e destruidor. Quando você compila seu projeto, o vinculador elimina o vtable e todas as funções para o qual o vtable aponta.
Você deve usar o ATL_NO_VTABLE e conseqüentemente declspec(novtable), com apenas classes base que não são diretamente pode ser criadas. Você não deve usar declspec(novtable) com a classe derivada de maioria em seu projeto, porque essa classe (geralmente CComObject, CComAggObject, ou CComPolyObject) inicializa o ponteiro vtable para seu projeto.
Você não deve chamar funções virtuais do construtor de qualquer objeto que usa declspec(novtable). Você deve mover essas chamadas para o FinalConstruct método.
Se você não tiver certeza se deve usar o declspec(novtable) modificador, você pode remover a macro ATL_NO_VTABLE de qualquer definição de classe, ou você pode desativá-lo globalmente, especificando
#define _ATL_DISABLE_NO_VTABLE
no stdafx. h, antes de todos os outro ATL arquivos de cabeçalho são incluídos.
Consulte também
Tarefas
Criar projetos usando os assistentes de aplicativo
Referência
Fundamentals of ATL COM Objects
Configurações padrão de projeto do ATL