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

ATL Project Wizard

Fundamentals of ATL COM Objects

novtable

Configurações padrão de projeto do ATL

Conceitos

Visual projetos C++

Programming with ATL and C Run-Time Code