Compartilhar via


Especificando otimização de compilador para um projeto ATL

Por padrão, Assistente de controle de ATL gera novas classes com a macro de ATL_NO_VTABLE, como segue:

class ATL_NO_VTABLE CProjName
{
   ...
};

ATL então define o _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 o _ATL_DISABLE_NO_VTABLE, a macro de ATL_NO_VTABLE expande para declspec(novtable).Usar declspec(novtable)em uma declaração de classe impede que o ponteiro vtable é inicializado no construtor e o destrutor da classe.Quando você compila seu projeto, o vinculador vtable e elimina todas as funções para que os pontos vtable.

Você deve usar ATL_NO_VTABLE e, portanto declspec(novtable), com apenas classes base que não são diretamente creatable.Você não deve usar declspec(novtable) com a classe mais derivada, em seu projeto como essa classe (geralmente CComObjectCComAggObject, ou) CComPolyObjectinicializa o ponteiro vtable para seu projeto.

Você não deve chamar funções virtuais de construtor de qualquer objeto que usar declspec(novtable).Você deve mover esses chamadas para o método de FinalConstruct .

Se você não tiver certeza se você deve usar o modificador de declspec(novtable) , você pode remover a macro de ATL_NO_VTABLE de qualquer definição de classe, ou você pode desativá-lo especificando global

#define _ATL_DISABLE_NO_VTABLE

em stdafx.h, antes de quaisquer arquivos de cabeçalho restantes de ATL é incluído.

Consulte também

Tarefas

Criando projetos para desktop com Assistentes de Aplicativo

Referência

Assistente de Projeto ATL

Fundamentos de objetos COM de ATL

novtable

Configurações padrão do projeto ATL

Conceitos

Tipos de projeto do Visual C++

Programação com código de tempo de execução de ATL e de C