Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций РСОИ.doc
Скачиваний:
20
Добавлен:
04.11.2018
Размер:
1.93 Mб
Скачать
  1. інтерфейси автоматизації;

  2. об’єкти автоматизації;

  3. Створення сервера автоматизації;

  4. створення контролера автоматизації;

  5. інтерфейс Word.Basic;

  6. приклади автоматизації.

2.7.1. Базові поняття

Автоматизація як технологія, заснована на COM, забезпечує надання функцій одних застосунків іншим. Базовим інтерфейсом автоматизації є IDispatch – звичайний інтерфейс COM. Інтерфейс IDispatch є спадкоємцем IUnknown, тобто успадковує всі його методи та містить власні методи.

Як і всі подібні інтерфейси, він реалізований за допомогою віртуальної таблиці вказівників на його методи. Особливість полягає в наявності спеціального методу Invoke, що забезпечує виклик інших методів. Крім зазначеного методу, IDispatch має ще три методи, розглянуті нижче.

Об’єкти автоматизації містять інтерфейси автоматизації, тобто такі інтерфейси, для яких батьківським є саме IDispatch.

Об'єкт, що працює з використанням інтерфейсу автоматизації, повинен обов'язково визначити для нього додатковий інтерфейс, який називається диспетчерським. У диспетчерському інтерфейсі не використовується віртуальна таблиця методів, в ньому містяться методи, доступні для виклику. Для кожного методу автоматично створюється унікальний ідентифікатор методу, який називається диспетчерським – DISPID. Такий ідентифікатор використовується як головний параметр методу Invoke.

Реалізація методу Invoke за суттю є оператором case, у якому на основі диспетчерського ідентифікатора просто вибирається потрібний метод.

Методи диспетчерських інтерфейсів мають деякі обмеження на типи даних параметрів. Іншою особливістю є можливість визначення властивостей через спеціалізовані методи читання і встановлення їхніх значень.

Кожен диспетчерський інтерфейс має власний унікальний ідентифікатор (як і будь-який інший інтерфейс). Він використовується у випадку, якщо в застосунку є кілька диспетчерських інтерфейсів. Оскільки інтерфейс IDispatch є спадкоємцем IUnknown, для виклику іншого диспетчерського інтерфейсу можна скористатися методом QueryInterface.

Як результат, взаємодія між застосунками автоматизації спрощується – для роботи потрібна ліше одна віртуальна таблиця для інтерфейсу IDispatch, всі інші методи викликаються описаним вище механізмом.

Але диспетчерські інтерфейси працюють трохи повільніше від стандартних, тому в застосунках автоматизації використовується ще один тип інтерфейсів – дуальні інтерфейси. Його методи можна викликати як через Invoke, так і через віртуальну таблицю. Дуальний інтерфейс обов'язково має бути спадкоємцем IDispatch. Його віртуальна таблиця включає посилання на три методи IUnknown, чотири методи IDispatch і методи відповідного диспетчерського інтерфейсу.

Застосунок, що надає свої функції за допомогою інтерфейсу IDispatch, називається сервером автоматизації. Сервер обов'язково повинен включати об'єкт автоматизації – звичайний об'єкт COM, що містить інтерфейси автоматизації.

Будь-який стандартний клієнт COM, що звертається до сервера через IDispatch, називається контролером автоматизації.

Маршалінг диспетчерських інтерфейсів також має особливість – для передавання різнотипних параметрів через метод Invoke використовується перетворення параметрів у тип variant і навпаки.

Iнтерфейс IDispatch. Найважливіший для технології автоматизації інтерфейс IDispatch інкапсульований в однойменному класі IDispatch. Методи класу відповідають методам інтерфейсу. Наведемо опис методів:

Function GetTypeInfoCount (out Count :Integer ): HResult; stdcall;

Повідомляє про те, чи може певний об'єкт повертати інформацію про тип під час виконання.

Function GetTypeInfo (Index , LocaleID :Integer;out TypeInfo): HResult; stdcall;

Повертає вказівник на інтерфейс бібліотеки типів ITypeInfo (якщо він є).

Function GetIDsOfNames (const IID: TGUID ; Names:Pointer; NameCount, Localed : Integer ; DispiDs: Pointer ): HResult;stdcall;

Повертає DISPID за заданим ім’ям методу диспетчерського інтерфейсу.

Function Invoke (DispID: Integer ; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, Exceplnfo, ArgErr: Pointer):HResult; stdcall;

Використовується для виклику всіх методів диспетчерського інтерфейсу.

Крім цього, інтерфейс успадковує методи базового інтерфейсу IUnknown.