Модель программирования Component Object Model. Разработка COM-сервера, страница 22

Пользуясь Help, вы, наверное, видели, что многие "оконные" методы реализованы не только в классе CWnd, но и в классе CWindow. Последний является классом из иерархии библиотеки ATL и именно он является главной фигурой при разработке окон COM-объектов.

Создайте новый проект типа ATL Project под именем ATLGL. В окне мастера выберите тип сервера Dynamic Link Library (DLL), а остальные флажки оставьте в выключенном состояни (это важно). Создаваемый модуль DLL будет содержать в себе элемент управления, который внедряется в окно клиентского приложения, поэтому в проект следует добавить заготовку нового COM-класса, обладающего функциональностью элемента типа ATL Control. Сделать это вручную достаточно сложно, поэтому воспользуйтесь услугами еще одного мастера студии.

1.  Дайте команду Add4Add Class и выберите тип объекта ATL Control.

2.  В окне следующего мастера (ATL Control Wizard) задаются атрибуты ко-класса. Найдите поле Short Name и введите в него псевдоним COM-объекта — OpenGL. Убедитесь, что автоматически генерируется имя класса (COpenGL) и имя первого интерфейса (IOpenGL).

3.  Перейдите на другую страницу (Options) мастера и и установите следующие значания переключателей и флажков: Control type: Standard control, Threading Model: Apartment, Interface: Dual, Aggregation: Yes, Support: Connection Points.

4.  На вкладке Appearance поднимите флажок Insertable и Windowed only.

5.  На вкладке Stock Properties найдите и добавьте свойство Fill Color, нажав кнопку >.

6.  Нажмите кнопку Finish.

Просмотрите результаты работы мастера. Самым крупным его произведением является файл OpenGL.h, который содержит объявление и одновременно коды класса COpenGL (традиция MFC разделения объявлений и кодов нарушена). Для ATL-проектов характерно то, что создаваемые ко-классы наследуют данные и методы от многих родителей, в число которых входят как COM-классы, так и интерфейсы. Другой характерной чертой является сосредоточение значительной части функциональности в h-файле. Напрашивается вывод, что некоторые принципы и идеи, отстаиваемые Microsoft в MFC, были инвертированы (зеркально отражены) в ATL. Сколько полемического задора было растрачено в критике множественного наследования (намек на Borland OWL) на страницах документации по MFC, и вот теперь мы видим вновь созданный класс (COpenGL), который имеет 18 родителей, среди которых 5 классов и 13 интерфейсов.

Здесь у вас должна закружиться голова, но не сдавйтесь. Важно не выпускать главную нить. Резон таков: мастера настрочили уйму кода, который пока непонятен (возможно, и всегда будет таким), но этот код уже работает и нам нужно где-то встроиться в него, чтобы почувствовать возможность управлять общей логикой внедряемого элемента ActiveX. Имея под рукой мастера (ATL Wizards), можно сделать это, оставаясь в некотором неведении относительно деталей работы интерфейсов COM. Вам не придется вручную реализовывать ни одного интерфейса. Вы можете сосредоточиться только на алгоритме работы самого элемента, то есть на том, что вы должны продемонстрировать пользователю вашего объекта.

Запустите приложение (Ctrl+F5) и выберите стандартный тестовый контейнер в качестве клиента. Он должен запуститься. Дайте команду Edit4Insert New Control. После некоторой паузы, в течение которой контейнер собирает информацию из реестра обо всех элементах OLE Controls, вы увидите диалог с длинным списком элементов, о которых есть информация в реестре.

Это совсем не означает, что все элементы живы и здоровы. На мой взгляд, ситуация вырастает в серьезную проблему. В систему следует ввести эффективные средства корректировки реестра, потому что совсем неинтересно проводить часы драгоценного времени, копаясь в реестре или инструменте типа OLE/COM Object Viewer и выясняя жив элемент или его давно нет. Может быть, как говорят политики, я не владею информацией, но реестр RegEdit32.exe, используемый в Windows 2000 не умеет сам себя очищать. Реестр RegEdit.exe, которым вы пользовались в Windows 98, видимо, умел очищать себя, сначала записывая информацию в REG-файл, а затем используя ее для регистрации. (Для этого надо было последовательно выполнить две команды: RegEdit.exe /е MyReg.reg и RegEdit.exe /c MyReg.reg). В Windows 2000 мне не удалось обнаружить аналога для RegEdit32.exe. Другие же программки (типа CleanRegistry) либо опасны, либо бесполезны.