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

2.2.3. Бібліотека сом

Для забезпечення виконання загальних функцій і базових інтерфейсів в операційній системі встановлюється спеціальна бібліотека СОМ (конкретна реалізація може бути різною). Доступ до функцій бібліотеки здійснюється стандартним способом, а не через інтерфейс. Згідно зі специфікацією, імена всіх бібліотечних функцій починаються з префікса “Co".

При встановленні застосунку, що використовує СОМ, відбувається реєстрація СОМ, тобто в системний реєстр записується інформація про всі СОМ-об'єкти, що містяться у цьому застосунку, а саме:

  • ідентифікатор класу (Class Identifier, CLSID), який однозначно визначає клас об’єкту;

  • тип сервера: внутрішній, локальний або віддалений;

  • для локальних і внутрішніх серверів зберігається повне ім'я DLL-бібліотеки або EXE-файла;

  • для віддалених серверів записується повна мережева адреса.

У разі, коли клієнт намагається використати деякий об'єкт СОМ перший раз, він звертається до бібліотеки СОМ і викликає метод CoCreateInstance, передаючи йому параметр CLSID потрібного класу, IID інтерфейсу і необхідний тип сервера.

Бібліотека за допомогою диспетчера керування службами (Service Control Manager, SCM) звертається до системного реєстру, за ідентифікатором класу знаходить інформацію про сервер і запускає його. Сервер створює примірник класу, тобто СОМ-об'єкт, і повертає бібліотеці вказівник на запитаний інтерфейс.

Бібліотека СОМ передає вказівник клієнту, який надалі може звертатися безпосередньо до об'єкту.

Фабрика класу. Для створення примірника класу, тобто СОМ-об’єкту, використовується спеціальний інтерфейс IСlassFactory. У ньому реалізовано усього два методи:

  • CoCreateInstance − створює новий примірник класу; всі необхідні параметри, крім IID, метод отримує від фабрики класу; у цьому його відмінність від однойменного загального методу бібліотеки;

  • LockServer – залишає сервер функціонувати після створення об'єкту.

Об’єкт, який включає інтерфейс IСlassFactory, називається фабрикою класу.

Для виклику фабрики класу існує спеціальний загальний метод CoGetClassObject. Як параметр йому передається CLSID потрібного класу й IID інтерфейсу (IClassFactory). Метод шукає необхідну фабрику і повертає вказівник на інтерфейс. За його допомогою і використовуючи метод CoCreateInstance, клієнт примушує фабрику класу створити об'єкт (рис.2.3).

2.2.4. Бібліотека типів

Щоб документувати інтерфейси об'єкту для користувачів, розробник створює інформацію про типи об'єкту. Для цього використовується мова IDL. Вся інформація об'єднується у спеціальній бібліотеці типів. Вона може описувати властивості і методи (а також їх параметри) інтерфейсів і містити відомості про необхідні заглушки і заступників. Інформація про окремий інтерфейс оформляється у вигляді об’єкту всередині бібліотеки.

Для створення бібліотеки типів, описаної за допомогою операторів IDL, використовуються спеціальні компілятори. Доступ до бібліотеки здійснюється за CLSID класу об’єкту. Крім того, бібліотека має власний GUID, який зберігається в системному реєстрі при реєстрації об’єкту. Для доступу до бібліотеки за GUID використовується загальний метод LoadRegTypeLib. Якщо клієнту відоме ім'я файла бібліотеки, то можна скористатися методом LoadTypeLib.

Кожна бібліотека типів має інтерфейс ITypeLib, який працює з нею, як єдиним об'єктом. Для доступу до інформації про окремий інтерфейс використовується інтерфейс ITypeInfo.

Контрольні запитання та завдання:

  1. Дайте визначення технології СОМ?

  2. Що таке інтерфейс?

  3. Що таке СОМ-об’єкт?

  4. Що таке СОМ-сервер?

  5. Який склад інтерфейса IUnknown?

  6. Опишіть механізм викликання методу об’єкту СОМ клієнтом.

  7. Що таке бібліотека СОМ і для чого використовуються її функції?

  8. Що таке бібліотека типів?

  9. Для чого використовується мова IDL?

2.3. СОМ у Delphi

2.3.1. Об'єкт СОМ у Delphi

Об'єкт СОМ описується звичайним класом TComObject, який породжений безпосередньо від TObject. Всі властивості і методи, що реалізують призначення об’єкту, оголошуються і описуються в його оголошенні. Тому сам клас нового об’єкту СОМ принципово ні чим не відрізняється від будь-якого іншого.

При створенні об’єкту СОМ з ним зв'язується ще один клас, який описує всі інтерфейси. Цей клас має загальну назву CoClass, а ім’я Co-класу для реального об’єкту створюється з імені класу, визначеного розробником СОМ-об’єкту, з додаванням префіксу Co. CoClass об'єднує всю інформацію про типи. Ця інформація подана в бібліотеці типів Co-класу. CoClass є надбудовою або оболонкою цього коду, він забезпечує представлення примірника об’єкту відповідно до специфікації СОМ і гарантує, що звернення клієнта до об’єкту буде оброблене коректно.

Клас TComObject в сукупності з екземпляром CoClass, що створюється для кожного об’єкту, повністю відображають СОМ-об'єкт. Він може підтримувати довільне число інтерфейсів і включає інтерфейс IUnknown.

Крім цього базового інтерфейсу визначені численні інтерфейси, які забезпечують функціонування інших технологій на основі СОМ (наприклад, IDispatch для технології Automation) і полегшують працю розробників.

Для забезпечення роботи об’єкту СОМ з бібліотекою типів від базового класу TComObject породжений новий клас TTypedComObject. Додатково він має ще один інтерфейс − IProvideClassInfo. Якщо цей інтерфейс має доступ до бібліотеки типів, то для отримання нової інформації про об'єкт досить знати його ідентифікатор класу. Цей клас використовується для створення об'єктів з використанням бібліотеки типів.

При створенні об'єктів СОМ у Delphi розробник не повинен піклуватися про створення фабрики класу для кожного об’єкту, тому що спільно з об'єктом створює не тільки CoClass, але і фабрику класу – спеціалізований об'єкт СОМ, який володіє інтерфейсом IClassFactory і використовується для створення об'єктів СОМ.

Клас TСomObjectFactory інкапсулює функції універсальної фабрики класу для об'єктів СОМ, що створюються як примірники класу TComObject. Конструктор фабрики описується в секції ініціалізації модуля, що включає відповідний сервер.

Дерево класів, які забезпечують роботу з СОМ-об’єктом у Delphi, наведене на рис. 2.4.