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
Fundamentos de objetos COM de ATL
Configurações padrão do projeto ATL