Программирование: Использование COM-объектов

Pascal-код сценария может обращаться к методам и свойствам COM (также известным как OLE или ActiveX) посредством поддержки объектов автоматизации COM. Это позволяет получить доступ, например, к стандартным COM-серверам Windows, пользовательским COM-серверам, DLL-библиотекам Visual Basic ActiveX и сборкам .NET, используя технологию COM Interop.

Интерфейс IDispatch

Существует две поддерживаемые функции для инициализации объектов автоматизации COM на базе интерфейса IDispatch: CreateOleObject и GetActiveOleObject.

Функция CreateOleObject используется для создания нового COM-объекта с указанным именем класса. В случае успеха возвращает переменную типа Variant, иначе вызывает исключение.

Функция GetActiveOleObject используется для подключения к существующему COM-объекту с указанным именем класса. В случае успеха возвращает переменную типа Variant, иначе вызывает исключение. Для некоторых программ такой результат можно использовать в качестве признака их выполнения (работает или нет).

Значение, возвращаемое функцией CreateOleObject или GetActiveOleObject затем можно использовать для доступа к свойствам и методам COM-объекта. Доступ осуществляется посредством "позднего связывания", который означает, что вызов запрашиваемых методов или свойств невозможен до момента выполнения программы установки.

Для получения доступа к свойству или методу, имя которого является зарезервированным словом, используйте функцию IDispatchInvoke.

В качестве примера обратитесь к файлу сценария "CodeAutomation.iss", который находится в папке "Examples" каталога установки Inno Setup. В нём рассматривается использование объектов автоматизации COM на базе интерфейса IDispatch.

Если используется .NET COM-объект и его загрузка не удаётся, начиная с Inno Setup 5.5.9, попробуйте в сценарии перед созданием COM-объекта поместить следующую строку: LoadDLL(ExpandConstant('{sys}\mscoree.dll'), ErrorCode); и добавьте переменную ErrorCode с типом Integer.

Интерфейс IUnknown

Если интерфейс IDispatch не реализуется объектом, то можно воспользоваться интерфейсом IUnknown.

Для инициализации объектов автоматизации COM на базе интерфейса IUnknown используйте функцию CreateComObject.

Значение, возвращаемое функцией CreateComObject, можно использовать для доступа к методам COM-объекта после приведения к желаемому интерфейсу. Доступ осуществляется посредством "раннего связывания", который означает, что необходимый интерфейс должен быть определён ещё в сценарии, т.е. до компиляции, в отличии от интерфейса IDispatch.

Используйте функцию StringToGUID для преобразования строкового значения GUID в "реальный" GUID. А функцию OleCheck для проверки возвращаемых значений вызываемых методов.

Если вы копируете определение интерфейса из существующего исходного кода Delphi, удалите скобки вокруг строки с интерфейсом GUID. Также удалите все соглашения о вызовах, поскольку Inno Setup принимает только "stdcall". Если интерфейс содержит какие-либо функции, которые вы не собираетесь использовать, замените их фиктивными, чтобы избежать необходимости объявления каких-либо специальных типов, задействованных ими.

В качестве примера обратитесь к файлу сценария "CodeAutomation2.iss", который находится в папке "Examples" каталога установки Inno Setup. В нём рассматривается использование объектов автоматизации COM на базе интерфейса IUnknown.

Общие положения

СОМ-объекты освобождаются автоматически, когда выходят из области видимости. Не существует никаких функций для их "уничтожения" или "освобождения".

Если библиотека автоматизации COM извлекается во временный каталог, а затем, после использования, нуждается в удалении, убедитесь, что к этим библиотекам нет больше ссылок, затем вызовите функцию CoFreeUnusedLibraries. Эта функция попытается выгрузить библиотеку, чтобы её можно было безопасно удалить.