Задание оптимизации компилятора для проекта ATL
По умолчанию Мастер элементов управления ATL создает новые классы с помощью макроса ATL_NO_VTABLE следующим образом:
class ATL_NO_VTABLE CProjName
{
...
};
Затем библиотека ATL определяет макрос _ATL_NO_VTABLE следующим образом:
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Если макрос _ATL_DISABLE_NO_VTABLE не определен, то макрос ATL_NO_VTABLE раскрывается в модификатора declspec(novtable). Использование модификатора declspec(novtable) в объявлении класса предотвращает инициализацию указателя vtable в конструкторе и деструкторе класса. При построении проекта компоновщик исключает указатель vtable и все функции, на которые он указывает.
Необходимо использовать макрос ATL_NO_VTABLE и, следовательно, модификатор declspec(novtable) только с базовыми классами, которые нельзя создать напрямую. Нельзя использовать модификатор declspec(novtable) с производным классом, дальше всего отстоящим от базового в проекте, поскольку этот класс (обычно это CComObject, CComAggObject или CComPolyObject) инициализирует указатель vtable для проекта.
Нельзя вызывать виртуальные функции из конструктора любого объекта, использующего модификатор declspec(novtable). Необходимо перемещать эти вызовы в метод FinalConstruct.
Если точно неизвестно, должен ли использоваться модификатор declspec(novtable), то можно удалить макрос ATL_NO_VTABLE из определений всех классов, или отключить его глобально, указав:
#define _ATL_DISABLE_NO_VTABLE
В файле stdafx.h, перед включением всех других файлов заголовков ATL.
См. также
Ссылки
Fundamentals of ATL COM Objects
Конфигурации по умолчанию проекта ATL
Основные понятия
Программирование с использованием ATL и кода среды выполнения C
Другие ресурсы
Создание проектов для рабочего стола с помощью мастеров приложений