Проект
на основе ATL
Библиотеки
шаблонов, такие как ATL (Active Template Library), отличаются от обычных библиотек
классов C++ тем, что они представляют собой множество шаблонов (templates),
которые могут и не иметь иерархической структуры. При использовании обычной
библиотеки мы создаем класс, производный от какого-то класса из библиотеки и
тем самым наследуем всю его функциональность, а значит, и функциональность его
предков. С библиотекой шаблонов поступают по-другому. Выбрав шаблон, обращаются
к нему для создания нового, класса, .скроенного по образу и подобию шаблона,
получая тем самым его общую функциональность. Специфика определяется путем реализации
некоторых методов шаблона. Новый класс кроится по шаблону, настраиваемому параметром,
который передается в угловых скобках шаблона.
Использование
библиотеки ATL полностью снимает с вас заботу о реализации методов ILJnknown,
о получении уникальных идентификаторов и регистрации их в системе, а также многие
другие рутинные проблемы, связанные с поддержкой технологии СОМ. Вы теперь сможете
оценить эти преимущества, так как попробовали создать СОМ-объект с помощью сырых
(raw) COM API. У нас нет времени более подробно заниматься технологией СОМ,
так как общая направленность книги — использование передовых технологий, а не
детальное их изучение. Для получения фундаментальных знаний о технологии мы
отсылаем читателя к книгам, перечисленным ранее. Отметим, что текст книги Inside
OLE целиком (1200 страниц) помещен в MSDN (см. раздел Books).
Далее рассмотрим,
как создать СОМ-объект, обладающий возможностями DLL-сервера (inproc server),
Мы создадим новый проект, а в нем остов СОМ DLL-сервера и добавим необходимый
нам код, учитывающий специфику СОМ-объекта.
- На странице VS Home Page
выберите гиперссылку Create New Project.
- В окне диалога New Project
выберите тип проекта: Win32 Projects, в окне Templates выберите ATL Project,
задайте имя проекта ATLGL и нажмите ОК.
- В окне мастера ATL Project
Wizard выберите вкладку Application Settings и установите переключатель Server
Type в положение Dynamic Link Library (сокращенно DLL). Остальные флажки должны
быть выключены.
- Нажмите кнопку Finish.
Итак, СОМ DLL-сервер
или дом для ко-классов готов. Теперь можно начать процесс начинки его
классами (или одним классом), которые, в свою очередь, будут являться домами
для экспонируемых интерфейсов. Говорят, что ко-класс реализовывает или экспонирует
интерфейсы (или один интерфейс). Просмотрите результаты работы мастера. В файле
ATLGL.cpp, здесь уже нарушена традиция MFC разделять объявление и реализацию
класса, объявлен класс CATLGLModule, скроенный по шаблону и одновременно производный
от класса CAtlDllModuleT. К сожалению, документация по ATL содержит весьма краткие
сведения о своих классах. Из нее мы можем, однако, узнать, что шаблон классов
CAtlDllModuleT поддерживает функциональность DLL-модуля, который умеет регистрировать
себя в качестве такового. Он происходит от класса CAtiModule, у которого есть
симметричный потомок CAtlExeModuleT, поддерживающий функциональность ЕХЕ-модуля
приложения, и умеет обрабатывать параметры командной строки. Иначе такой модуль
называется out-of-proc-сервером (локальным или удаленным сервером). Он выполняется
в пространстве собственного процесса, а не клиентского, как в случае in-proc-сервера.
Аналогично
MFC-проекту, в котором есть объект theApp, здесь объявлен глобальный объект
_AtlModule класса CATLGLModule, унаследованные методы которого позволяют зарегистрировать
(DllRegisterServer) в системном реестре наличие нового сервера COM DLL. Но это
только начало. Немного позже мы создадим и зарегистрируем СОМ-объект, все его
интерфейсы и библиотеку (typelib) упреждающего описания новых объектов COM (coclass,
interface, dispinterface, module, typedef). Да, каждый СОМ-объект вносит довольно
много записей в системный реестр, поэтому так важно правильно производить обратную
процедуру (DllUnregisterServer), иначе реестр превращается в кладбище записей,
внесенных объектами, которые уже не существуют в операционной системе.