Технологія COM

Технологія COM (Component Object Model – компонентна модель об’єктів) надає можливість одній програмі (клієнту) працювати з об’єктом іншої програми (сервера). СОМ – це модель об’єкта, яка передбачає повну сумісність у взаємодії між компонентами, написаними різними компаніями та різними мовами. При цьому не важливо, де виконуються програми: в одному потоці, в різних потоках, різних комп’ютерах.

З точки зору СОМ – додаток містить кілька об’єктів (в окремому випадку може бути один об’єкт). Кожен об’єкт має один або декілька інтерфейсів. В інтерфейсі описані методи об’єкта, яких можуть отримати доступ зовнішні програми. Якщо інтерфейсів кілька, кожен з них експонує деяку підмножину методів, які виконують однорідні функції.

Об’єкт є частиною сервера СОМ. Сервером може бути файл або бібліотека DLL. При встановленні сервера в Windows до системного реєстру заноситься інформація про всі його об’єкти. Ця інформація включає ідентифікатор класу CLSID (Class Identifier), однозначно визначальний клас об’єкта. Заноситься інформація про тип сервера: внутрішній (in-process – усередині процесу) – DLL, що підключається до клієнта, локальний (local) – працюючий окремим процесом на комп’ютері клієнта, віддалений (remote) – працюючий на віддаленому комп’ютері. Для внутрішніх та локальних серверів до реєстру заноситься повне ім’я файлу, а для віддалених – повна мережна адреса. Таким чином, в системі зберігається вся інформація про сервер СОМ, необхідна для його виклику в потрібний момент.

Внутрішнім сервером є DLL (бібліотека, що динамічно приєднується), яка експортує автоматні об’єкти. Оскільки автоматні об’єкти постачаються з DLL, а не з інших програм, вони є частиною програми клієнта. Це позбавляє великих накладних витрат, що супроводжують кожний виклик автоматного сервера.

Локальний або віддалений сервер – це автономний файл, що виконується, експортує автоматні об’єкти. Прикладом цього може бути Microsoft Word. Word має кілька об’єктів, які він експонує як автоматні.

Зовнішні програми, які звертаються до об’єкта СОМ, є клієнтами СОМ. Клієнт отримує покажчик на інтерфейс об’єкта, що його цікавить, і через цей покажчик може викликати методи об’єкта. Специфікація СОМ забороняє змінювати одного разу оголошений інтерфейс. Це забезпечує нормальну роботу клієнта за будь-яких модифікацій сервера.

Таким чином, клієнту достатньо знати інтерфейси об’єкта та надані ними методи. Про решту подбає система. У потрібний момент вона запустить сервер СОМ, якщо він ще не був запущений, сервер створить об’єкт, об’єкт завантажить всі необхідні дані і клієнту повернуться покажчики на об’єкт і його інтерфейси, з якими він може працювати. Система подбає також про те, щоб забезпечити роботу об’єкта одразу з кількома клієнтами. І тому вона веде облік кількості посилань на об’єкт. При видачі клієнту покажчика на інтерфейс кількість посилань збільшується на 1. А по закінченні роботи клієнта з об’єктом кількість посилань на 1 зменшується. Якщо число посилань дорівнювало нулю, система знищує об’єкт, з яким на даний час не працює жоден клієнт.

Все добре, але звідки розробник клієнтської програми може отримати інформацію про об’єкти СОМ, їх інтерфейси, властивості, методи, параметри методів? Вся ця інформація міститься в бібліотеці типів, яка створюється розробником об’єкта СОМ і розповсюджується разом із об’єктом. Бібліотека створюється за допомогою мови опису інтерфейсу IDL (Interface Definition Language).

Кожен інтерфейс має ім’я, що починається із символу «I», та GUID – глобальний унікальний ідентифікатор (Globally Unique Identifier). Подібні GUID створюються та використовуються не тільки для інтерфейсів. Для інтерфейсів GUID називається IID. Кожен об’єкт СОМ має інтерфейс IUnknown. Цей інтерфейс має лише три методи: Querylnterface – отримання покажчика на інтерфейс, AddRef і Release – збільшення та зменшення на 1 числа посилань на об’єкт. Метод Querylnterface повертає покажчик на інтерфейс із заданим IID. Метод Release повинен викликатися після закінчення роботи з інтерфейсом, щоб повідомити об’єкт, що даний клієнт його більше не потребує. Ці два методи використовуються завжди під час роботи з об’єктом СОМ. Ще один метод – AddRef використовується тільки у випадках, коли один клієнт передав іншому посилання на інтерфейс. Оскільки при цьому метод AddRef, що автоматично збільшує кількість посилань, не викликається, клієнт, якому передано посилання, повинен викликати AddRef, щоб доповісти об’єкту, що він також працює з ним.

Технологія СОМ реалізується спеціальними бібліотеками, включаючи OLE32.dll та OLEAut32.dll. Вони містять стандартні інтерфейси API з функціями, що забезпечують створення об’єктів СОМ та управління ними.

Оскільки технологія СОМ залежить від мови, у ній використовуються типи, відмінні з інших мов. Насамперед, це стосується рядків, які в різних мовах описуються по-різному. У СОМ використовується свій рядковий тип – BSTR (Basic STRing). Він описує рядок, на початку якого вказано його довжину. Оскільки довжина рядка відома, завершального нульового символу не потрібно.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *