Microsoft OLE Automation
OLE Automation — технология компании Microsoft, позволяющая обращаться к COM-объектам из интерпретаторов скриптовых языков, таких, как VBScript (на настоящий момент поддержка обращений к OA-объектам есть в Windows-версиях всех[источник не указан 1389 дней] популярных скриптовых языков).
История
Впервые появилась примерно в 1993 году как замена устаревшей возможности DDE_EXECUTE.
Среда программирования Visual Basic была практически полностью основана на OLE Automation, с такими типами данных, как String и Variant.
Практическая важность
Объектами OLE Automation являются все элементы управления ActiveX (OCX-контролы). Свойства, методы и события этих компонент реализованы с помощью OLE Automation.
Также объектами OLE Automation являются многие популярные приложения, такие, как компоненты Microsoft Office. Это дает возможность запустить и управлять данным приложением (например, в Excel программно сформировать таблицу, заполнить в ней ячейки и сохранить в файл) из скрипта, написанного на скриптовом языке.
Также объектами OLE Automation являются все теги Dynamic HTML (при использовании Microsoft Trident или же Apple WebKit[нужно проверить] или Google Chrome[нужно проверить]).
Также на этой технологии основана WMI (её слой, отвечающий за общение с клиентскими программами) и ряд административных утилит Windows, например, управление веб-сервером IIS.
Особенности
Технология определяет те COM интерфейсы, через которые интерпретатор языка будет общаться с объектом.
Технология поддерживает:
- свойства, методы и события
- свойство или метод по умолчанию
- необязательные и именованные аргументы методов
- аргументы методов «по значению» и «по ссылке».
Типы данных OLE Automation (могут использоваться в свойствах, методах и событиях):
- целые
- плавающая точка
- дата/время DATE — дробное (с плавающей точкой) число дней с 30.12.1899.
- строка BSTR. Строка UTF-16 с завершающим нулем, память, выделенная в oleaut32.dll, освобождается вызовом SysFreeString.
- указатель IUnknown на объект OLE Automation
- массив SAFEARRAY. Может быть многомерным. Выделяется и освобождается семейством вызовов SafeArrayXxx в oleaut32.dll, можно получить на него указатель как на массив Си.
- вариант VARIANT. Union с полем, указывающим тип — один из указанных выше, или другой VARIANT, или ссылка на один из этих типов (используется в аргументах «по ссылке»)
Другие типы данных (структуры, указатели не на COM объект, другие представления массивов и строк) технологией не поддерживаются.
Также технология поддерживает type libraries — информацию о типах свойств/методов/аргументов, доступную во время выполнения (нечто вроде Reflection в .NET).
Обычно технология разрешает имена свойств и методов при исполнении, никак не проверяя их на этапе разбора, и возбуждая ошибку «объект не поддерживает свойство или метод» только при исполнении (позднее связывание). Однако, если у объекта есть type library, зарегистрированная на машине, то в некоторых средах разработки можно объявить его так, что имена будут проверяться на этапе разбора. В Visual Basic это делалось операторами Dim o As Object (только позднее связывание) или же Dim o As Excel.Application (раннее связывание, но требуется установка Excel на машину построения и добавление Excel к списку использованных в проекте компонент).
На уровне языков Си/Си++ вызов OLE Automation выглядит как вызов IDispatch::Invoke, куда передаются преобразованные в константы строковые имена метода/свойства/аргументов, и значения аргументов, преобразованных в типы OLE Automation. Это крайне неудобно и вызывает расходы производительности, потому у многих объектов реализованы т. н. дуальные интерфейсы — потомки IDispatch, реализующие и Invoke (используется скриптами и в случае объявления As Object), ровно ту же функциональность через обычные COM методы (используется C++ и теми интерпретаторами, что понимают дуальные интерфейсы, как Visual Basic). При этом сохраняется ограничение на типы данных, приведенное выше. Библиотека ATL содержит в себе фреймворк поддержки дуальных интерфейсов.
Компилятор Microsoft C++ поддерживает директиву #import — включение type library (.tlb или же исполняемого файла, в который она вшита). При этом из исходного файла генерируются автоматически заголовки Си++, использующие средства comdef.h (смарт-пойнтеры на COM объекты и т. д.).
Цикл разработки объектов:
- проектирование интерфейсов, с учетом ограничения на типы данных (нет структур и т. д.).
- написание IDL файла (вручную или же с помощью визардов из Visual Studio).
- написание классов, реализующих интерфейсы, объявленные в IDL.
Цикл построения объектов:
- midl.exe компилирует IDL, создавая бинарный файл .tlb (type library, интерфейсы для извлечения информации из неё предоставлены oleaut32.dll), заголовок Си/Си++ и .c файл, в котором объявлены все GUIDы из IDL
- .c файл с GUIDами строится вместе с проектом
- заголовок включается в .c/.cpp файлы, содержащие реализацию класса
- link.exe может вшить .tlb в создаваемый исполняемый файл (как ресурс 1 TYPELIB)