2.1 ATL foi otimizado para o compilador do Visual C++ 5.0. Em particular, você deve estar ciente de que muitas classes ATL são declarados com o ATL_NO_VTABLE macro:
classe CComControl ATL_&NO_VTABLE
{
nbsp; ...
}
ATL define ATL_NO_VTABLE como segue:
# ifdef _ATL_DISABLE_&NO_VTABLE
nbsp; # Definir ATL_NO_VTABLE
# else
# define __declspec(novtable) ATL_NO_VTABLE
# endif
Se _ATL_DISABLE_NO_VTABLE não estiver definido, o ATL_NO_VTABLE macro se expande para declspec(novtable) . Quando declspec(novtable) é usado em uma declaração de classe, ele impede que o ponteiro vtable sendo inicializada no Construtor da classe e do destruidor. O vinculador pode assim eliminar o vtable e todas as funções apontada pelo vtable, desde a classe mais derivado (geralmente de CComObject, CComAggObjectou CComPolyObject)não usa declspec(novtable) e assim irá inicializar o ponteiro vtable corretamente.
Por padrão, o Assistente de objeto ATL irá gerar novas classes com o ATL_NO_VTABLE macro. Conforme descrito anteriormente, o declspec(novtable) atributo só deve ser usado com classes de base que não são diretamente creatable. Além disso, não é seguro para chamar funções virtuais do Construtor de qualquer objeto que usa declspec(novtable) . Você deve mover qualquer essas chamadas para o método FinalConstruct.
Se você não tiver certeza se você deve usar o declspec(novtable) atributo, você pode remover o ATL_NO_VTABLE macro de qualquer definição de classe ou você globalmente desativá-lo, especificando #define _ATL_DISABLE_NO_VTABLE em stdafx. h, antes de todos os outro ATL arquivos de cabeçalho são incluídos.