ATL / WTL все еще требует использования глобальной переменной _Module?
Вопрос
Я только запускаю новый проект ATL / WTL, и мне было интересно, по-прежнему ли требуется глобальная переменная _Module? Р>
Несколько лет назад, когда я начал работать с WTL, требовалось (по крайней мере, для ATL 3.0) определить глобальную переменную, например:
CAppModule _Module;
Чтобы ATL работал правильно. Но недавно я где-то читал, что это больше не требуется (хотя сгенерированный мастером код все еще использует его). Кроме того, я выполнил поиск по каталогам включения Visual C ++, и он обнаружил _Module только в нескольких местах, особенно в реестре ATL COM.
Итак, мне все еще нужно определить глобальную переменную для использования ATL в наши дни?
Решение
Технически вам не нужен глобальный экземпляр _Module
начиная с версии 7. ATL / WTL. Ранее код ATL / WTL ссылался на _Module
под этим конкретным именем и ожидал, что вы объявите один экземпляр этого объекта. С тех пор он был заменен одним объектом экземпляра с именем _AtlBaseModule
, который автоматически объявляется для вас в atlcore.h.
Тем не менее, некоторые из лучших функций WTL содержатся в CAppModule и его базовом классе CComModule. Автоматическая регистрация COM, обработка цикла сообщений и т. Д. Таким образом, большинству нетривиальных приложений на основе WTL по-прежнему требуется единичный экземпляр базового класса CComModule. Однако его не нужно называть _Module
.
Другие советы
В примерах проектов последней версии WTL это все еще используется.
В stdafx.h:
extern CAppModule _Module;
В файлах реализации:
CAppModule _Module;