По-прежнему ли ATL/WTL требует использования глобальной переменной _Module?

#c #atl #wtl

Вопрос:

Я только начинаю новый проект ATL/WTL, и мне было интересно, по-прежнему ли требуется глобальная переменная _Module?

Несколько лет назад, когда я начал работать с WTL, требовалось (по крайней мере, для ATL 3.0), чтобы вы определили глобальную переменную, такую как:

 CAppModule _Module;
 

Чтобы заставить ATL работать правильно. Но недавно я где-то читал, что это может больше не потребоваться (тем не менее, созданный мастером код все еще использует его). Кроме того, я провел поиск в каталогах Visual C include, и он обнаружил _Module только в нескольких местах — в первую очередь в реестре ATL COM.

Так нужно ли мне все еще определять глобальную переменную для использования ATL в наши дни?

Ответ №1:

Технически вам не нужен глобальный _Module экземпляр, начиная с ATL/WTL версии 7. Более ранний код ATL/WTL, на который ссылается _Module это конкретное имя, ожидал, что вы объявите один экземпляр этого объекта. С тех пор это было заменено одним экземпляром объекта с именем _AtlBaseModule , который автоматически объявляется для вас в atlcore.h.

Сказав это, тем не менее, некоторые из лучших функций WTL содержатся в CAppModule и его базовом классе CComModule. Автоматическая регистрация COM, обработка цикла сообщений и т.д. Таким образом, большинству нетривиальных приложений на основе WTL все равно потребуется одноэлементный экземпляр базового класса CComModule. Однако его не нужно называть _Module .

Ответ №2:

В примерах проектов последней версии WTL это все еще используется.

В stdafx.h:

 extern CAppModule _Module;
 

В файлах реализации:

 CAppModule _Module;
 

Комментарии:

1. Я уже упоминал, что последний сгенерированный мастером код все еще использует его, то же самое касается образцов. Однако это все еще не отвечает на мой вопрос.

2. Поскольку вы не упомянули образцы WTL, которые более интересны, чем те, что находятся в папках VS, я подумал, что было бы вполне уместно упомянуть.