Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Observação
A Active Template Library (ATL) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.
Por defeito, o ATL Control Wizard gera novas classes com a macro ATL_NO_VTABLE, da seguinte forma:
class ATL_NO_VTABLE CProjName
{
...
};
A ATL define então _ATL_NO_VTABLE da seguinte forma:
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Se não definires _ATL_DISABLE_NO_VTABLE, a macro ATL_NO_VTABLE expande-se para declspec(novtable). Usar declspec(novtable)em uma declaração de classe impede que o ponteiro vtable seja inicializado no construtor e destruidor de classes. Quando constróis o teu projeto, o linker elimina o vtable e todas as funções para as quais o vtable aponta.
Deves usar ATL_NO_VTABLE e, consequentemente declspec(novtable), com apenas classes base que não são diretamente criáveis. Não deve usar declspec(novtable) com a classe mais derivada no seu projeto, porque esta classe (normalmente CComObject, CComAggObject ou CComPolyObject) inicializa o ponteiro vtable do seu projeto.
Não deve chamar funções virtuais a partir do construtor de qualquer objeto que use declspec(novtable). Deves mover essas chamadas para o método FinalConstruct .
Se não tiver a certeza se deve usar o declspec(novtable) modificador, pode remover a macro ATL_NO_VTABLE de qualquer definição de classe, ou pode desativá-la globalmente especificando
#define _ATL_DISABLE_NO_VTABLE
em pch.h (stdafx.h no Visual Studio 2017 e anteriores), antes de todos os outros ficheiros de cabeçalho ATL serem incluídos.
Consulte também
Assistente de projeto ATL
Tipos de projeto C++ no Visual Studio
Programação com ATL e C Run-Time Code
Fundamentos dos ATL COM Objects
Novtable
Configurações padrão do projeto ATL