GET_OBJECT


Библиотека

V32.EXE

Синтаксис

GET_OBJECT([ FileOrURL: STRING[] ];
           [ ProgID: STRING[] ];
           [ OnTerminalClient: SCAL[2] ]
          ): OBJECT;

Описание

Функция возвращает ссылку на активный объект COM автоматизации, либо загружает объект автоматизации из файла или задаваемого при помощи URL ресурса. Хотя бы один из параметров: FileOrURL или ProgID должен быть указан, иначе функция выбросит исключение 156. Вместо ProgID разрешается указывать CLSID, заключенный в фигурные скобки. На самом деле, первое, что выполнит функция - получит CLSID из ProgID по информации из системного реестра, для чего выполняется поиск ProgID в разделе реестра HKCR.

Необязательный флаговый параметр OnTerminalClient имеет значение только для терминального клиента ASB. По умолчанию флаг поднят, т.е. объект будет получен на стороне терминального клиента. При сброшенном флаге объект будет получен на стороне сервера приложений ASB, что небезопасно, поскольку сервер автоматизации будет выполняться на невидимом рабочем столе. Получая и используя объект COM автоматизации на стороне сервера приложений ASB программист должен быть уверен, что  сервер автоматизации не станет ожидать реакции пользователя.

Windows хранит таблицу COM-объектов, зарегистрированных на локальном компьютере как запущенные, т.н. Running Object Table (ROT). Регистрация объектов в ROT - дело добровольное; запущенное приложение не обязано это делать, даже если является COM-сервером, но может таким способом разрешить управлять своей функциональностью. Для просмотра ROT можно использовать утилиту IROTView из Microsoft Visual Studio. Каждый элемент ROT-таблицы характеризуется именем и типом моникера, который можно использовать, чтобы связаться с объектом. Для коклассов приложений в качестве имени элемента таблицы обычно используется CLSID класса, а в качестве моникера - простой моникер элемента (item moniker). Для коклассов документов имя элемента - это путь к файлу/ресурсу, соответственно используется моникер файла (file moniker) или моникер URL (URL moniker).

Когда задан только параметр ProgID, нужный объект выбирается из зарегистрированных в ROT объектов коклассов приложений по идентификатору кокласса (CLSID). После связывания объект может исчезнуть из таблицы ROT или остаться в ней в зависимости от реализации кокласса. В системе может быть зарегистрировано несколько объектов-приложений одного кокласса; функция вернет ссылку на один из них. Если же в системе не существует ни одного активного объекта заданного кокласса приложений, функция выбросит исключение 157.

Когда задан только параметр FileOrURL, нужный объект определяется по пути к файлу или URL, из которого был загружен объект. Если параметр FileOrURL содержит имя файла, а не URL ресурса, имя дополняется до полного пути по информации из RED-файла. Если в ROT уже зарегистрирован объект кокласса документа с заданным именем, функция вернет ссылку на него. Если же нужный объект отсутствует в ROT, функция попытается загрузить его при помощи моникера. Разумеется, загрузка может и не удаться (например из-за отсутствия требуемого ресурса), тогда функция выбросит исключение класса Exc_Object.

Если указать одновременно и FileOrURL и ProgID, функция не будет искать уже существующий объект в ROT. Сначала будет создан новый объект кокласса документа аналогично тому, как это делает CREATE_OBJECT. Затем функция попытается загрузить в него файл, заданный параметром FileOrURL, пользуясь интерфейсом IPersistFile для чтения из файла. Если кокласс объекта не поддерживает интерфейс IPersistFile, функция выбросит исключение 158. А если в процессе загрузки произойдет ошибка, функция выбросит исключение класса Exc_Object.

В отличие от CREATE_OBJECT, функция не может работать с удаленными объектами, поскольку таблица ROT доступна только в локальной системе.

До версии 14.136.020 процедура называлась GetOBJECT. В настоящее время допустимы оба варианта имени.

Поведение данной функции идентично поведению функции GetObject в Visual Basic, за исключением того, разумеется, что поддерживаются только объекты COM автоматизации. Если объект не поддерживает интерфейс COM автоматизации IDispatch, функция выбросит исключение 141.

Исключительные ситуации

Не найдена одна из OLE-библиотек Исключение 164
Не удалось загрузить OLE-библиотеки Исключение 138
Одна из нужных точек входа в OLE-библиотеках не найдена Исключение 165
Не удалось инициализировать OLE-библиотеки Исключение 139
ProgID или CLSID не найден в реестре Исключение 140
Кокласс не поддерживает интерфейс COM автоматизации IDispatch Исключение 141
Не удалось создание объекта COM автоматизации Исключение 142
Не указано ни одного параметра Исключение 156
Существующий объект автоматизации не найден Исключение 157
Класс автоматизации не поддерживает интерфейс IPersistFile Исключение 158
Ошибка компонента Исключение класса Exc_Object

См. также

Пример 1

VAR
 objXL: OBJECT;
BEGIN
 objXL := GET_OBJECT(, "Excel.Application");
 (* Получили объект кокласса Excel.Application (первый попавшийся) *)
END.

Пример 2

VAR
 objXL: OBJECT;
BEGIN
 objXL := GET_OBJECT("c:\Test.xls");
 (* Получили ссылку на объект кокласса Excel.Workbook, *)
 (* загруженный из c:\Test.xls *)
 (* .................................................. *)
END.