Ole automation, типи даних ole і dispatch-інтерфейси

1. OLE Automation

Автоматизація OLE - це здатність керувати OLE іншої програми програмним шляхом.

Додатки можуть забезпечити доступ до своїх сервісів через інтерфейси СОМ. Після цього такими сервісами зможе скористатися будь-який фрагмент коду, здатний викликати методи СОМ-об'єкту. У СОМ такий стандартний спосіб забезпечення програмованість називається автоматизацією (Automation). Часто для створення програм, які керують іншими додатками, використовуються прості мовні інструменти типу Visual Basic. Створювані ними програми називають також і сценаріями (script).

Таким чином, мета програмованість - дозволити додатком-серверу забезпечити доступ до своїх сервісів з боку зовнішніх програм, щоб сценарій міг робити все, що і звичайний користувач. Для цього можна скористатися інтерфейсами СОМ. Однак, проблема в тому, що розглянуті нами раніше інтерфейси не зовсім відповідають можливості середовищ типу Visual Basic. Виявилося, що Visual Basic, будучи відносно простою мовою, не зовсім підходить для того, щоб скористатися можливість програмування. Є проблеми при роботі з покажчиками і маршалинга.

Для вирішення цієї проблеми група Visual Basic розробила стандартний СОМ інтерфейс - IDispatch.

2. DISPATCH-інтерфейси

Об'єкт, чий клас реалізує інтерфейс IDispatch, оголошений в модулі System Delphi, - є об'єкт Automation. Інтерфейс типу IDispatch, визначає методи і властивості, які об'єкт Automation здійснює через інтерфейс IDispatch.

Як і будь-який звичайний інтерфейс, він реалізований за допомогою віртуальної таблиці покажчиків на методи. VMT інтерфейсу IDispatch починається з трьох добре відомих методів IUnknown, за якими слідують методи GetlDsOfNames, GetTypelnfo, GetTypelnfoCount і Invoke.
• Invoke (метод часу виконання) - використовується для виклику інших методів Щоб це було можливим, розробник об'єкта, що реалізує IDispatch повинен визначити, які в точності методи будуть доступні. Це досягається визначенням додаткового диспетчерського інтерфейсу (dispatch interface), який часто називають діспінтерфейсом (dispinterface). Для його реалізації VMT не використовується. Кожному методу діспінтерфейса ставиться у відповідність ціле число - диспетчерський ідентифікатор (Dispatch IDentifier - DispID), no якому і здійснюється виклик. Фактично реалізація об'єктом методу Invoke є великим оператором Case.

• GetIDsOfNames - дозволяє вказувати в якості параметра текстове назву цікавить методу. Якщо IDispatch знаходить на сервері метод з вказаною назвою, то повертає його ідентифікатор DispID, який далі використовується методом Invoke Фактично перетворює ім'я методу в його DispID.

• GetTypelnfo - повертає покажчик інтерфейсу ITypelnfo об'єкта - дані про тип, якщо в об'єкта є бібліотека типу. Отже, можна дізнатися все про виклик методів і упаковці параметрів.

• GetTypelnfoCount - повертає дані про те, чи буде виклик GetTypelnfo повертати корисну інформацію, тобто чи є у об'єкта бібліотека типів (1 \ 0 -Так \ Немає).

3. Методика створення об'єктів автоматизації

Delphi дозволяє створювати об'єкти автоматизації в складі зовнішніх і внутрішніх серверів автоматизації.
а) Для створення зовнішнього сервера автоматизації слід:
• Створити новий додаток, що буде грати роль сервера, виконавши команди:
File \ New Application
Після створення збережемо файл-unit під ім'ям Unitl.pas, а файл-проект під ім'ям OLEXE.DPR

• Для створення об'єкта автоматизації слід виконати команди.
File \ New
Automation Object. Буде запущений майстер зі створення об'єкта.

Спочатку в вікні Automation Object Wizard необхідно вказати Class Name (Sum), Instancing (Multiple Instance), Threading Model (Single).

OLE-об'єкт визначається як CoClass, що включає зазвичай два методу (класові функції): один для створення локального, інший - віддаленого об'єкта:

CoSum = Class
Class Function Create (): ISum;
Class Function CreateRemote (Const MachineName: String): ISum; End;

Після закриття бібліотеки типів і збереження створеного файлу-unit під ім'ям Sum.pas, необхідно в цьому файлі реалізувати методи оголошеного інтерфейсу, наприклад, наступним чином:
б) Для створення внутрішнього сервера автоматизації слід:
• ActiveX Library.
• Для створення об'єкта автоматизації слід виконати команди: File \ New Automation Object
File \ New
в) Експоновані методи і властивості, в принципі сервер автоматизації може містити будь-які властивості і методи. Однак існує специфікація Microsoft на сервери автоматизації, якої слід керуватися при їх створенні. До властивостей, які доцільно вказувати, відносяться: FullName, Help, Left, Top і цілий ряд інших.

У реєстрі по GUID
У секції LocalServer32 буде вказано шлях до OLEXE.EXE.
У секції ProglD зазначено: «OLEXE.Sum»
У секції TypeLib зазначено: «
У секції Version зазначено: «1.0»