Объект OLE

From SunFlurry wiki
Revision as of 12:13, 2 January 2021 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  OLE (Объект OLE)
Статус разработки: Реализован
Создание объекта: Create

Объект OLE (Object Linking and Embedding) позволяет получить доступ к функциям операционной системы и других программ из программных модулей клиента, если эти программы поддерживают интерфейс COM (Component Object Model). Microsoft создали достаточно много терминов для OLE-объектов: OLE, COM, OCX, ActiveX, все они в каком-то роде означают один и тот же способ работы с внешними объектами. Самый большой минус такого способа работы заключается в том, что OLE-сервер не может контролировать время исполнения методов объектов. Это может привести к тому, что если в методе OLE-объекта есть ошибка, и метод зависнет или выдаст на экран модальное сообщение, OLE вызов никогда не вернет управление программе. Для визуального клиента это имеет меньшее значение, так как пользователь сможет перезапустить программу, однако, для консольных клиентов это весьма опасно, поэтому для консольных клиентов рекомендуется использовать функции сторожевого пса.

На данный момент система работает с COM интерфейсом в режиме STA (Single-Threaded Apartment). Это означает, что объект, созданный в одном потоке, не может быть доступен в других потоках. Windows позволяет вызов методов из других потоков, но это происходит с помощью стандартной очереди сообщений Windows, что идеально подходит для визуальный объектов, созданных в основном потоке системы, однако, неудобно для объектов, созданных в рабочих потоках, так как в рабочих потоках отсутствует обработчик очереди сообщений. Это ограничение можно обойти, создав OLE-объект в особом режиме. Ниже даны возможные режимы использования OLE-объектов в программных модулях или обработчиках событий:

  • Режим STA (однопоточный режим). OLE-объекты, созданные таким образом, делятся на две категории:
    • Визуальные OLE-объекты, находящиеся на формах или в электронных таблицах. Такие объекты позволяют вызовы из разных потоков, так как визуальный поток обрабатывает сообщения из очереди сообщений. Вызовы из других потоков для этой категории объектов будут обладать такими же минусами, как и вызовы к объектам, созданным в режиме "центрального потока" (см. ниже).
    • OLE-объекты, созданные программно. Методы таких объектов не могут быть вызваны из других потоков (только из потока, где эти объекты были созданы). Зачастую такие объекты создаются, чтобы выполнить определенную работу, и после этого удаляются, поэтому, это не вызывает проблем в работе.
  • Режим исполнения центрального потока. OLE-объекты создаются с помощью функции CreateThreadedOLE в специально выделенном для этого потоке, который в дальнейшем обслуживает все обращения из других потоков. Обращения происходят не с помощью использования стандартной очереди сообщений Windows, а с помощью более быстрой межпоточной синхронизации. Однако, так как все OLE-объекты, созданные в системе таким образом, обслуживает только один поток, может получиться ситуация (особенно с консольными серверами), когда выполнение вызова к объекту будет задержано, пока выполняется вызов из другого потока. В визуальных клиентах, где количество одновременно работающих потоков мало, это не будет являться реальным ограничением.
  • Режим исполнения индивидуального потока. Данный режим, который пока не создан, и необходимость в котором рассматривается, будет позволять для каждого созданного OLE-объекта иметь свой собственный поток исполнения методов. Минусами такого режима, может стать большое потребление ресурсов системы, однако, в случаях, когда объектов в системе немного, а вызовы к ним занимают продолжительное время, этот режим мог бы быть полезен.

В системе OLE-объекты могут присутствовать:

  • Объекты, созданные программно CreateOLE
  • Объекты, расположенные на формах. В этом режиме, объект добавляется на форму в момент ее создания в Студии, для таких объектов могут быть заданы визуальные события COM.
  • Объекты, внедренные в электронные таблицы. Такие объекты также можно добавлять программно или при копировании частей таблицы с помощью функций типа CopyByX.

Атрибуты и функции

Идентификатор Статус Тип Визуальная Параметры Описание
CreateOLE Реализована Функция CreateOLE(<Идентификатор объекта OLE (STRING)>):<Новый объект OLE (OLE)> Функция создает новый объект OLE (COM) по строке идентификатора
CreateThreadedOLE Реализована Функция CreateThreadedOLE(<Идентификатор объекта OLE (STRING)>):<Новый объект OLE (OLE)> Функция создает новый объект OLE (COM) по строке идентификатора. Объект может быть доступен в любом потоке, не только в том, который создал объект. Вызовы к таким объектам осуществляются несколько медленнее.
SetTimeout Планируется Функция OLE.SetTimeout(<Время ожидания исполнения команд в мс. (INT)>):<Предыдущее время ожидания исполнения команд в мс. (INT)> Функция задает или получает для объекта максимальное время ожидания исполнения команд. По умолчанию при создании объекта, это время равно 0 (не ограничено). При истечении времени ожидания система произведет отсоединение от текущего OLE-объекта и выполнявшаяся функция вызовет исключение.
SetEventHandler Планируется Функция OLE.SetEventHandler(<Имя события OLE объекта (STRING)>,<Имя функции-обработчика события (STRING)>,<Тип вызова события (INT)>=0) Функция сопоставляет локальную или глобальную функцию с событием OLE-объекта. Исполнение функции может происходить в трех режимах, в зависимости от аргумента тип вызова события: 0 (по умолчанию) -- функция будет вызвана, как прерывающее событие в контексте текущей формы (работает только для визуальных форм), 1 -- для вызова функции будет создан отдельный поток (как это происходит при вызове функции ExecuteFunctionInSeparateThread) (работает для любого контекста, но создание нового потока для часто исполняемых событий может замедлить работу системы), 2 -- событие будет помещено в очередь ожидания и будет исполнено в момент вызова функции OLESleep (работает для любого контекста).
OLESleep Планируется Функция OLE.OLESleep(<Время ожидания появления события (INT)>) Функция ожидает появления OLE события (только для событий, сопоставленных в режиме 2, см. SetEventHandler). Событие исполняется, если оно ожидает в очереди на начало вызова функции или происходит в течение времени ожидания функции. Событие будет вызвано в текущем потоке и будет иметь доступ ко всем его переменным. При задании аргумента равным нулю, событие будет исполнено, только если оно ожидает в очереди на момент вызова функции, ожидания события не будет.