Otimização do compilador

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.

Index