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

2.1.4. Створення динамічних бібліотек для редагування ресурсів

Динамічні бібліотеки ресурсів – це спеціальні DLL, які створюються для готових проектів (застосунків). Вони містять ресурси застосунків (текстові рядки, повідомлення, назви кнопок та інше). Бібліотеки ресурсів використовуються для локалізації застосунків, тобто для формування текстів інтерфейсу користувача для різних мов спілкування. Для створення такої бібліотеки необхідно:

1) створити або відкрити проект для локалізації;

2) зберегти його;

3) викликати відповідний візард з репозітарію Delphi ланцюжком File-> New-> DLL resourse wizard, та відповісти на запитання візарда. Під час роботи з візардом формуються локальні мовні еквіваленти для ресурсів проекту.

Для зв'язування основного проекту з проектом локалізації достатньо вказати для проекту локалізації вхідний параметр host project – ім'я основного проекту.

Як результат, створюється пакет проектів, готовий до виконання в різних мовах. Відповідно до обраного проекту та можливостей ОС можна обрати потрібну локалізацію.

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

  1. Що таке DLL - бібліотека?

  2. Опишіть алгоритм створення DLL у Delphi.

  3. Розкажіть про способи використання DLL у Delphi.

  4. В чому полягає особливість створення DLL, що використовує об’єкти VCL для роботи з даними?

  5. Як здійснити обробку виняткової ситуації в DLL?

Вправи для самостійного опрацювання:

  1. Спроектувати cклад DLL за власним вибором множини функцій.

  2. Створити DLL та виконати реалізацію функцій, в тому числі функцію з демонстрацією створення форми.

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

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

2.2. Основи сом-технології

2.2.1. Загальний опис

Технологія Component Object Model (COM- Багатокомпонентна Модель Об'єктів) пропонує засоби вирішення загальної проблеми: як навчити різні програми надавати одна одній власні функції (служби) і як навчити їх правильно використовувати ці функції. Одна частина програмного забезпечення (сервер) надає для використання власні служби, а інша (клієнт) отримує до них доступ. При цьому абсолютно не важливо, де розташовані ці частини в одному процесі, в різних процесах на одному комп'ютері або на різних комп'ютерах. Для створення на основі специфікації COM застосунків також не важливо, яка мова програмування використовувалася при розробці, якщо стандарт COM додержаний, взаємодія здійснюється без перешкод. Додаткові можливості розробникам розподілених застосунків на основі COM дає модифікація базової технології − розподілена модель COM (Distributed COM, DCOM).

Delphi надає розробнику набір інструментів для створення повноцінних застосунків COM. У складі Delphi працюють дві динамічні бібліотеки OLE32.DLL та OLEAUT32.DLL, які містять базові інтерфейси і загальні функції COM.

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

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

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

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

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

Припустимо, що об'єкт COM вбудований в електронну таблицю і забезпечує доступ до математичних операцій. Буде логічно розділити математичні функції на групи за типами і створити для кожної групи власний інтерфейс. Наприклад, можна виділити лінійні, тригонометричні, агрегатні функції і т. ін.

На рис. 2.1 зображено об'єкт, розташований всередині сервера, та його інтерфейси. Інтерфейси позначені маленькими кружечками, зв'язаними з об'єктом. Нехай інтерфейс лінійних функцій називається ILinear, а інтерфейс агрегатних функцій IAggregate.

Об'єкт. Центральним елементом COM є об'єкт. Застосунки - сервери, що підтримують COM, мають в своєму складі один або декілька об'єктів COM. Кожний об'єкт являє собою примірник відповідного класу і містить один або декілька інтерфейсів.

Будь-який об'єкт є примірником деякого класу, тобто являє собою змінну об'єктного типу, тому об'єкт має набір властивостей і методів, які працюють з цими властивостями. До об'єктів застосовні три основні характеристики: інкапсуляція, успадкування і поліморфізм. Об'єкти COM всім цим вимогам задовольняють (існують особливості успадкування). Об'єкт COM може мати будь-яку кількість інтерфейсів (якщо ця кількість більша від нуля), причому кожний інтерфейс визначається власним вказівником.

Отже, об'єкт СОМ з погляду об’єктно-орієнтованого програмування безсумнівно є об'єктом. Однак, як ключовий елемент технології СОМ, він має ряд особливостей реалізації базових механізмів:

  • об'єкти СОМ підтримують тільки успадкування інтерфейсу, а не реалізації;

  • об'єкти СОМ використовують механізм включення, тобто при необхідності нащадок викликає потрібний метод батька;

  • застосовується механізм агрегування, коли один або декілька інтерфейсів одного об’єкту на деякий час включаються в інший об'єкт шляхом передавання вказівників.

Інтерфейс. Інтерфейс є тим засобом, який дозволяє клієнту правильно звернутися до об'єкту COM, а об'єкту відповісти так, щоб клієнт його зрозумів.

Для ідентифікації кожний інтерфейс має два атрибути. По-перше, це його ім'я, що складається із символів відповідно до правил мови програмування, яка використовується. Кожне ім'я має починатися із символу “I". Це ім'я використовується в програмному коді. По-друге, це глобальний унікальний ідентифікатор (Globally Unique IDentifier, GUID), який являє собою унікальне поєднання символів, що практично не повторюється на жодному комп'ютері у світі. Для інтерфейсів такий ідентифікатор має назву IID (Interface Identifier).

Клієнт може не знати, які інтерфейси є у об'єкта. Для отримання їх переліку та доступу до них використовується базовий інтерфейс IUnknown, який входить до складу будь-якого об'єкту COM. Для надання клієнту інформації про методи інтерфейсу розробник повинен розповсюджувати опис методів інтерфейсів разом з об'єктом. Для вирішення цієї проблеми використовується бібліотека типів та мова IDL (Interface Definition Language). Ії синтаксис дуже схожий на С++.

У COM передбачена реалізація інтерфейсу на основі стандартного двійкового формату. Це забезпечує незалежність від мови програмування.

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

Інтерфейс IUnknown. Кожний СОМ-інтерфейс є нащадком базового інтерфейсу СОМ-технології – інтерфейсу IUnknown. Цей інтерфейс містить усього три методи. Оголошення інтерфейсу IUnknown наведено нижче:

IUnknown = interface

['{00000000-0000-0000-C000-000000000046}']

function _AddRef: Integer; stdcall;

function _Release: Integer; stdcall;

function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;

end;

Метод AddRef інкрементує лічильник посилань.

Метод Release зменшує лічильник посилань на одиницю. Після обнуління лічильника об'єкт знищує себе.

Метод QueryInterface використовується для доступу до будь-яких інтерфейсів СОМ-об’єкту. Перший параметр − ідентифікатор інтерфейсу, на який бажано отримати вказівник (символьний або GUID). Другий параметр –це ім’я змінної користувача, якій присвоюється бажаний вказівник. Якщо такого інтерфейсу об'єкт не має, метод повертає NULL.

Зазвичай при першому зверненні до об'єкту клієнт отримує вказівник на перший або базовий інтерфейс. Оскільки будь-який інтерфейс є нащадком IUnknown, то будь-який інтерфейс має і метод QueryInterface. Тому в загальному випадку не важливо, який саме інтерфейс може використати клієнт для отримання доступ до будь-якого інтерфейсу об’єкту.

При передаванні назовні чергового вказівника на інтерфейс об'єкт збільшує спеціальний лічильник посилань на одиницю. Для цього використовується метод _AddRef.

При завершенні роботи з інтерфейсом клієнт зобов'язаний викликати метод _Release. Цей метод зменшує лічильник посилань на одиницю. Після обнуління лічильника об'єкт знищує себе.

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

  • внутрішній сервер (inprocess server) реалізується динамічними бібліотеками (*.DLL), які підключаються до клієнта і працюють в одному адресному просторі;

  • локальний зовнішний сервер (local server) створюється окремим процесом (*.EXE), який працює на одному комп'ютері з клієнтом;

  • віддалений сервер (remote server) створюється окремим процесом (*.exe), який працює на іншому комп'ютері по відношенню до клієнта.