atl приложения что это
Основные понятия активной библиотеки шаблонных классов (ATL)
Библиотека шаблонных классов ATL — это набор классов C++, которые позволяют создавать небольшие и быстрые объекты модели COM. Он имеет специальную поддержку для основных компонентов модели COM, включая стандартные реализации, сдвоенные интерфейсы, стандартные интерфейсы перечислителя COM, точки подключения, перемещаемые интерфейсы и элементы управления ActiveX.
в этом разделе
Введение в модель COM и ATL
Объясняет основные понятия модели COM. В этой статье также приводится краткое описание библиотеки ATL и вариантов ее использования.
Основы COM-объектов ATL
Описание отношений между различными классами ATL и реализации этих классов.
Сдвоенные интерфейсы и ATL
Описание сдвоенных интерфейсов с точки зрения ATL.
Коллекции и перечислители ATL
Описание реализации и создания коллекций и перечислителей в ATL.
Основные сведения о составном элементе управления
Содержит пошаговые инструкции для создания составного элемента управления. Составной элемент управления — это тип элемента управления ActiveX, который может содержать другие элементы управления ActiveX или элементы управления Windows.
Вложение элемента управления ATL: вопросы и ответы
Рассматриваются основные вопросы, связанные с размещением элементов управления с помощью ATL.
Страницы свойств ATL COM
Описывается, как указывать и реализовывать страницы свойств COM.
Поддержка ATL для элементов управления DHTML
Содержит пошаговые инструкции для создания элемента управления DHTML.
Точки подключения ATL
Описание точек подключения и их реализации библиотекой ATL.
Обработка событий и ATL
Описание действий, которые необходимо выполнить для обработки событий COM с помощью классов библиотеки ATL IDispEventImpl и IDispEventSimpleImpl.
ATL и бесплатный потоковый модуль упаковки
Содержит сведения о параметре мастера простых объектов ATL, который позволяет классу вычислять упаковщик в режиме свободного потока (FTM).
Указание потоковой модели проекта
Описывает макросы, доступные для контроля производительности в среде выполнения в связи с потоками в проекте.
Классы модулей ATL
Описывает новые классы модуля в ATL 7.0. Классы модуля реализуют базовые возможности, необходимые для библиотеки ATL.
Службы ATL
Описывает последовательность событий, возникающих при реализации службы. Также рассказывает о некоторых понятиях, связанных с разработкой службы.
Классы окон ATL
Описывает способы создания и настройки суперкласса и подкласса окон в ATL. Классы окон ATL не совпадают с классами COM.
Классы коллекций ATL
Описывает, как использовать массивы и схемы в ATL.
Компонент реестра ATL (регистратор)
Описывает синтаксис и заменяемые параметры в скрипте ATL. Также описывает настройку статической ссылки на регистратор.
Программирование с помощью ATL и кода Run-Time C
Описывает преимущества статического или динамического связывания в библиотеке среды выполнения C (CRT).
Справочник по кодировке
Описывает функции и макросы, которые поддерживают кодирование в различных распространенных стандартах Интернета, например uuencode, шестнадцатеричная кодировка и UTF8 в atlenc.h.
Справочник по служебным программам
Предоставляет код для управления путями и URL-адресами в форме CPathT и CUrl. Пул потоков CThreadPool можно использовать в собственных приложениях. Этот код можно найти в файлах atlpath.h и atlutil.h.
Связанные разделы
Учебник по ATL
Описывает создание элементов управления и демонстрирует некоторые основные сведения об ATL в процессе.
Примеры ATL
Предоставляет описания и ссылки на примеры программ ATL.
Создание проекта ATL
Содержит сведения о мастере проектов ATL.
Атрибутивное программирование
Общие сведения об использовании атрибутов для упрощения программирования с моделью COM, а также ссылки на более подробные разделы.
Общие сведения о классе ATL
Предоставляет справочные сведения и ссылки на классы ATL.
Создание проекта (учебник ATL, часть 1)
в этом руководстве описывается пошаговое руководство по проекту ATL без атрибута, который создает объект ActiveX, отображающий многоугольник. Объект включает параметры, позволяющие пользователю изменить число сторон, образующих многоугольник, и код для обновления экрана.
В этом руководстве создается тот же исходный код, что и в примере многоугольника. Если вы не хотите вводить исходный код вручную, можно скачать его с помощью примера «многоугольник». Затем можно ссылаться на исходный код многоугольника по мере работы с руководством или использовать его для проверки ошибок в вашем проекте. для компиляции откройте pch. h (stdafx. h в Visual Studio 2017 и более ранних версиях) и замените:
Компилятор по-прежнему будет сообщать о regsvr32 неправильном выходе, но все равно следует иметь встроенную и доступную библиотеку DLL элемента управления.
создание исходного проекта ATL с помощью мастера Project atl
в Visual Studio 2017 и более ранних версий: файл > New > Project. Откройте вкладку Visual C++ и выберите MFC/ATL. Выберите Project ATL.
в Visual Studio 2019: выберите файл > создать > Project, введите «atl» в поле поиска и выберите atl Project.
Расположение исходного кода обычно будет по умолчанию \Users \ \саурце\репос, а новая папка будет создана автоматически.
В Обозреватель решений щелкните правой кнопкой мыши Polygon проект.
В контекстном меню выберите пункт Свойства.
Щелкните Компоновщик. Измените значение параметра per-усерредиректион на Да.
Нажмите кнопку ОК.
На следующем шаге в проект будет добавлен элемент управления.
Руководство по созданию ActiveX-контролов на C++ с помощью ATL
В интернете существует множество учебников по использованию ATL, и в частности, по созданию COM-компонентов с его помощью, в том числе и ActiveX/OLE контролов, но большинство из них почему-то описывают процесс тыкания мышкой в разные интересные места Visual Studio, использование графических инструментов последней, и мало какой из них затрагивает нутро сгенерированного средой разработки кода в достаточно глубоком объеме. В русскоязычном сегменте интернета ситуация и того хуже — материалов по ATL крайне мало, практически нет(да и не только по ATL, а и по созданию COM-компонентов вообще), поэтому я решил этот недостаток компенсировать.
Ну, начать следует, наверное, с краткого описания того, что из себя представляют ActiveX-компоненты и что такое ATL.
ActiveX это ребрендинг аббревиатуры OLE, «Object Linking and Embedding», технологии от Microsoft, основанной на COM, Component Object Model — языконезависимой компонентной модели, придуманной MS. OLE позволяет встраивать отдельные контролы, документы, да или просто компоненты в разные программы, написанные на разных языках программирования, работающие под Windows. ActiveX-контролы, в частности, известны тем, что их можно «вклеивать» в веб-браузер Internet Explorer, и одним из самых известных таких компонентов для IE является, к примеру, модуль Adobe Flash.
Интерфейс ActiveX-компонента поставляют с собой многие известные и популярные программы для Windows, как от самой Microsoft(Windows Media Player, или, например, программы из Microsoft Office, в частности Word, Excel и т.п.), так и от сторонних компаний(уже вышеупомянутый флеш, Adobe Reader, плюс многие другие программы того же Adobe — например Photoshop, если я правильно помню).
Есть мнение, что технология устаревает, или уже устарела, но тем не менее, я лично считаю, что она просто вытесняется в область низкоуровневого программирования и системных сервисов, и пока ядро Windows пишется на Си, а многие компоненты системы используют COM, и основаны на COM-интерфейсах, она уж точно никуда не денется.
Теперь про то, что такое ATL. ATL, Active Template Library — известная библиотека от Microsoft, которая упрощает работу с Winapi на C++. В ATL входят классы/шаблоны не только для работы с COM/OLE/ActiveX, но и классы для, к примеру, построения и управления GUI и т.п.
ATL обычно поставляется с полноценными версиями Microsoft Visual Studio, но если у вас ее нет, то можете взять эту библиотеку из Windows DDK.
Так вот, в данной статье я опишу процесс создания простенького компонента, который будет у нас средствами DirectX 11 рисовать крутящуюся растеризованную в wireframe сферу, и у которого будет два метода — Run — запустить вращение сферы, и Stop — остановить вращение.
Для начала нам нужно придумать интерфейс нашего модуля, придумать GUID для библиотеки, интерфейсов и класса компонента, и записать все это, как водится, в MIDL, Microsoft Interface Definition Language.
Сохраним это дело в файл, и назовем MyActiveX.idl
Как видно, мы записали определение двух интерфейсов, а также описание COM-класса, который реализует наши интерфейсы. Первый, IMyControl, у нас представляет собой собственно интерфейс компонента, а второй нужен для оповещения внешнего мира о событиях, которые случаются с нашим контролом. Событий у нас не записано, и мы их делать в нашем примере не будем, поэтому этот интерфейс у нас пустой.
Интерфейс, реализуемый нашим классом, относится к так называемым dual-интерфейсам. Это значит, что его можно использовать не только из языков, способных на общение с native-кодом, а соответственно, и способных общаться с COM-компонентами через таблицы виртуальных методов, но и из скриптовых языков, посредством интерфейса IDispatch.
Далее нам нужно записать определения IMyControl и _IMyControlEvents в заголовочном файле для C++ — MyControl.hpp
Макрос MIDL_INTERFACE раскрывается во что-то вроде «struct __declspec(novtable) __declspec(uuid(строка GUID для интерфейса))». Microsoft довольно удобно интегрировали COM в свой компилятор C++, и это позволяет(и дальше это будет видно особенно хорошо) нам работать с интерфейсами и компонентами COM из MSVC++, как с более-менее обычными классами и структурами C++.
Макрос DEFINE_GUID же, в свою очередь, раскрывается в зависимости от определения макроса INITGUID — в случае отсутствия оного, он декларирует extern-переменную типа GUID с определенным названием. В случае INITGUID, он ее еще и инициализирует.
Теперь следует определить переменную _Module, которая принадлежит классу CComModule из ATL.
Запишем декларацию переменной в отдельный заголовочный файл, скажем MyActiveX.hpp
CComModule это класс, реализующий функциональность COM-модуля, в частности регистрацию классов компонентов, инициализацию COM-сервера и прочие подобные вещи.
Для регистрации COM-серверов в реестре(а COM работает именно через реестр) мы могли бы написать reg-файл, или вручную создать в реестре соответствующие записи, но также мы можем использовать программу regsvr32.exe, входящую в состав Windows, и позволяющую проводить автоматическую регистрацию, средствами самого компонента. Для этого необходимо, чтобы наша библиотека экспортировала некоторые функции, и в частности DllRegisterServer и DllUnregisterServer.
CComModule упрощает весь процесс автоматической регистрации, и позволяет сводить ее к вызову соответствующих методов в вышеупомянутых экспортируемых функциях библиотеки, но ему требуется, чтобы в секции ресурсов dll, реализующего компонент, находился скрипт регистрации. Назовем файл, который мы позже добавим в ресурсы, MyControl.rgs, и добавим туда такой текст:
Наиболее значимые части скрипта регистрации — CLSID, то есть GUID класса нашего компонента, ProgID, т.е. человекочитаемое представление CLSID, и ThreadingModel — модель многопоточности нашего компонента, которая в данном случае устанавливается в Apartment, что значит что напрямую к нашему контролу можно обращаться только из того потока, в котором он был создан, а все внешние вызовы, в том числе извне процесса(или даже с другого компьютера — через DCOM) будут сериализоваться и синхронизироваться средствами рантайма COM.
Кстати, о сериализации, то есть, вернее сказать, о маршалинге. В теории, для того чтобы сериализовать вызовы методов нашего компонента и указатели на его интерфейсы, мы должны поставить параллельно с ним отдельную библиотеку, так называемую прокси-dll, которая будет подгружаться как в клиентское приложение(если оно на другом компьютере), так и к процессу, куда загружен наш COM-компонент.
Компилятор MIDL от Microsoft мог бы генерировать код для прокси-библиотеки, или как она в данном случае называлась бы, proxy/stub, но в нашем случае можно поступить проще — так как типы данных у нас более-менее стандартные, мы может использовать встроенный маршалинг рантайма OLE. Для данного дела нам нужно из нашего IDL-файла, опять же средствами компилятора MIDL, midl.exe(входит в состав как Windows SDK, так и VS), скомпилировать так называемую библиотеку типов(type library, tlb), и поставить с нашим компонентом ее. Более того, мы можем еще дальше упростить все это дело, и включить скомпилированную библиотеку типов в секцию ресурсов DLL, что мы и сделаем.
Заголовочный файл для ресурсов нашего модуля:
IDR_MYCONTROL — id ресурса скрипта регистрации.
IDB_MAIN_ICON — иконка 16×16 для нашего компонента, в формате BMP. Я лично для этого файла взял иконку DirectX из MS DirectX SDK.
IDS_SHADER и SHADER_RESOURCE — id ресурса и типа ресурса, содержащего код шейдеров для отрисовки сферы.
Сам файл ресурсов, MyActiveX.rc, такой:
Теперь перейдем непосредственно к реализации нашего контрола.
Назовем класс CMyControl, и создадим заголовочный файл CMyControl.hpp
Как видно, определение класса получилось довольно большим.
Для реализации ActiveX-контрола наш класс, на самом деле, должен реализовать крайне немаленькое количество разнообразных COM-интерфейсов, начиная от IDispatch, но так как мы используем ATL, процесс очень сильно упрощается, благодаря наследованию от специальных классов, названия которых оканчиваются на «Impl», которые собственно говоря, и реализуют необходимую для интерфейсов функциональность в стандартном виде.
Три наиболее важных базовых класса нашего CMyControl — CComObjectRootEx, управляющий, в частности, подсчетом ссылок объектов нашего класса, CComCoClass, реализующий фабрику класса(IClassFactory), и CComControl, в свою очередь наследующийся от CWindowImpl(класс, обертывающий HWND, то есть дескриптор окна), и реализующий большую часть необходимой для встроенных ActiveX-контролов фунциональности.
Наиболее значимые макросы в теле класса:
DECLARE_REGISTRY_RESOURCEID — указывает id ресурса, в котором находится скрипт регистрации компонента.
BEGIN_COM_MAP + END_COM_MAP — реализуют метод QueryInterface интерфейса IUnknown(который является вершиной иерархии интерфейсов COM), который позволяет получать ссылки на разные интерфейсы объекта(и каждая из COM_INTERFACE_ENTRY указывает один из вариантов).
BEGIN_CONNECTION_POINT_MAP и соответствующий END — необходимы для реализации интерфейсов, связанных с оповещениями о событиях контрола.
BEGIN_MSG_MAP, MESSAGE_HANDLER и END_MSG_MAP — реализуют отображение сообщений Windows-окна на методы C++ классов.
Метод OnDraw у нас будет вызываться каждый раз, когда контрол будет получать от системы сообщение о необходимости перерисовки. Кроме этого, перерисовка контрола у нас будет вызываться по таймеру.
Вся функциональность нашего компонента, и, в частности, работа с Direct3D, реализуется приватным классом CMyControlImpl, согласно паттерну pimpl, в файле CMyControl.cpp. Я не буду в деталях его описывать, отмечу только то, что в конструкторе самого CMyControl необходимо выставить внутреннее свойство m_bWindowOnly в TRUE — это будет означать, что наш компонент поддерживает встраивание исключительно в графические приложение.
Также, стоит отметить что в реализации компонента для управления подсчетом ссылок на COM-интерфейсы активно используется шаблонный класс умного указателя CComPtr из ATL, очень похожий на intrusive_ptr из boost.
Теперь создадим файл MyActiveX.cpp, в котором у нас будет определены GUID класса и интерфейсов, переменная _Module, а также реализована точка входа DLL и необходимые для ActiveX-модуля экспортируемые функции:
Прежде чем скомпилировать dll, определим, какие функции наш модуль экспортирует, в def-файле:
Весь исходный код проекта, включая Makefile для сборки с помощью Windows SDK, приведен на github, по ссылке в конце статьи. Но сначала несколько примеров встраивания компонента:
Компоненты ATL COM Desktop
Справочник по библиотеке ATL — это набор классов C++, основанных на шаблонах, которые упрощают программирование объектов модели COM. COM — это двоичная спецификация для создания и использования программных компонентов на Windows. Чтобы полностью воспользоваться преимуществами ATL, настоятельно рекомендуется ознакомиться с работой с COM. Дополнительные сведения о модели COM см. в разделе компонентная объектная модель (com).
в этом разделе
Общие сведения о классе ATL
Содержит ссылки на и краткое описание классов ATL, упорядоченных по категориям.
Классы и структуры ATL
Содержит справочные материалы по классам и структурам, упорядоченным в алфавитном порядке.
Функции ATL
Справочные материалы по глобальным функциям, организованным в алфавитном порядке. Включает разделы, в которых функции упорядочиваются по категориям.
Глобальные переменные ATL
Справочные материалы по глобальным переменным, организованным в алфавитном порядке.
Макросы ATL
Справочные материалы по макросам, упорядоченным в алфавитном порядке. Включает разделы, которые упорядочивают макросы по категориям.
Определения типов ATL
Справочные материалы по определениям типов, упорядоченным в алфавитном порядке
Архетипа рабочей роли
Ссылки на архетипа рабочей роли ATL.
Связанные разделы
ATL
Содержит разделы, посвященные программированию с помощью библиотеки активных шаблонов (ATL).
Учебник по ATL
Описывает создание элементов управления и демонстрирует некоторые основные сведения об ATL в процессе.
Примеры ATL
Пример кода, демонстрирующий использование ATL для записи COM-объектов.
Шаблоны OLE DB
Предоставляет справочные материалы по шаблонам клиента и поставщика OLE DB, набор классов, реализующих многие часто используемые интерфейсы OLE DB.
Повторное распространение приложения ATL
Начиная с версии Visual Studio 2012 в библиотеку Active Template Library (ATL) входят только заголовки. Проекты ATL не имеют динамической компоновки с ATL. Распространяемая библиотека ATL не требуется.
При распространении исполняемого приложения ATL необходимо зарегистрировать файл EXE (и все элементы управления внутри него), выполнив следующую команду:
где filename — это имя исполняемого файла.
В Visual Studio 2010 проект ATL можно собирать для конфигурации MinDependency или MinSize. Конфигурация MinDependency возникает, когда свойству Использование AT L на странице свойств Общие присваивается значение Статическая компоновка с ATL, а свойству Библиотека среды выполнения на странице свойств Создание кода (папка C/C++) — значение Многопоточная (/MT).
Конфигурация MinSize возникает, когда свойству Использование ATL на странице свойств Общие присваивается значение Динамическая компоновка с ATL, а свойству Библиотека среды выполнения на странице свойств Создание кода (папка C/C++) — значение Многопоточная DLL (/MD).
Конфигурация MinSize позволяет создать выходной файл минимального возможного размера, но требует библиотеки ATL100.dll и Msvcr100.dll, если на целевом компьютере выбран параметр Многопоточная DLL (/MD). Для работы всех функции ATL библиотека ATL100.dll должна быть зарегистрирована на целевом компьютере. Библиотека ATL100.dll содержит экспортированные данные в формате ANSI и Юникод.
При создании шаблона проекта ATL или OLE DB для целевого объекта MinDependency установка и регистрация библиотеки ATL100.dll на целевом компьютере не требуются, но позволяют увеличить образ программы.
При распространении исполняемого приложения ATL необходимо зарегистрировать файл EXE (и все элементы управления внутри него), выполнив следующую команду: