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

2.3.2. Сервер сом у Delphi

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

При включенні модуля ComServ у модуль об’єкту автоматично створюється примірник класу TComServer, вказівник на який присвоюється змінній ComServ. Використовуючи цю змінну, можна отримувати інформацію від сервера.

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

2.3.3. Бібліотека типів у delphі

Бібліотеки типів застосовуються в Delphi під час розроблення застосунків, які використовують технології, засновані на СОМ. Бібліотеки типів забезпечують зберігання інформації про об'єкти, інтерфейси, функції тощо. Традиційно для бібліотек типів використовується мова опису інтерфейсів IDL (Interface Description Language). У Delphi для опису інтерфейсів застосовується синтаксис і оператори мови Object Pascal. Однак завжди можна експортувати цей код у формат IDL, забезпечивши тим самим застосування власних об'єктів у будь-якій програмі Windows.

Бібліотека типів може використовуватися клієнтами при звертанні до об’єкту для отримання початкової інформації про доступні ідентифікатори, інтерфейси, методи. Зазвичай у проекті використовується варіант бібліотеки мовою Object Pascal, а при поширенні об'єктів бібліотеки типів експортується у формат IDL. Варіант бібліотеки типів мовою Object Pascal зберігається у файлі з розширенням PAS і закінченням _TLB в назві.

У Delphi код бібліотеки типів генерується автоматично при створенні об’єкту. Для роботи з бібліотекою використовується спеціальний Редактор бібліотеки типів. Всі операції, що виконуються в ньому модифікують початковий код бібліотеки типів та відповідних об'єктів і інтерфейсів, тому розробнику немає необхідності досконально вивчати особливості побудови коду бібліотеки.

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

  1. Які класи використовуються для роботи з СОМ у Delphi?

  2. Опишіть особливості роботи СОМ-сервера у Delphi?

  3. Як і для чого застосовуються бібліотеки типів в Delphi?

2.4. Створення системи клієнт-сервер на основі базового com-об’єкту у складі внутрішнього сервера

2.4.1. Створення сом-сервера

Крок 1. Підготовка Delphi до створення СОМ-об’єкту

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

Tools-> Environment Options->Type Library->Language=Pascal.

Крок 2. Створення DLL бібліотеки – контейнера COM-об’єкту

Ланцюжок : File->New->ActiveX->ActiveX Library.

У підсумку створюється новий проект, в рамках якого створюється DLL-бібліотека - контейнер COM-об’єкту. Цей проект варто зберегти під новим ім'ям, наприклад, InProcCom.

Крок 3. Додавання до проекту COM-об’єкту

Ланцюжок: File->New->ActiveX->СOMObject.

Далі заповнюється вікно конструктора COM-об’єкту для визначення його параметрів. Встановлюються такі параметри:

ClassName – ім’я створюємого СОМ-об’єкту (наприклад SimpleCOM);

іnstancing – cпосіб створення об’єкту (за замовчуванням - Multiple Instancing); використовується для зовнішніх СОМ-серверів;

Threading Model - cпосіб взаємодії об’єкту і клієнта; використовується зазвичай для внутрішніх СОМ-серверів.

Нижче подано можливі значення Threading Model.

Single (однопотокова). Сервер не забезпечує підтримку потоків, він серіалізує запити клієнта, щоб СОМ-застосунок виконував один запит за одне звернення. Іншими словами клієнт створює єдиний потік, у якому формує свої запити. У СОМ створюється також один потік, у якому ці запити обробляються. Це фіксується при реєстрації прапорами:

для DLL – не встановлення прапора ThreadingModel;

для EXE - не встановлення прапора IsMultiThread.

Така модель звичайна для внутрішніх серверів.

Apartment (секціонована), встановлюється за замовчуванням. COM-об’єкти можуть оброблювати запити тільки від тих клієнтів, які їх створили.

Free (вільна). Об'єкти можуть одержати виклики від будь-якої кількісті потоків у будь-який час.

Both. Підтримуються обидві моделі. Як і вільна модель, крім вихідних викликів (наприклад, повернення), потребує гарантованого виконання в одному потоці.

Для включення у проект бібліотеки типів (*.TLB) необхідно включити прапорець Include Type Library та включити прапорець MarkOleAutomation.

Як результат, конструктором виконуються такі дії:

1. Створення СОМ-об’єкту, тобто:

а) до проекту додається новий модуль – Со-клас для об’єкту

TSimpleCOM = Class(TCOMObject);

б) генерується TGUID – унікальний ID COM-сервера;

с) формується виклик фабрики класу для створення COM-об’єкту

TCOMObjectFactory.Create(…) – параметри беруться з вікна майстра створення COM, цей модуль варто зберегти під іменем COM-сервера, у нашому випадку SimpleCOM;

2) створення бібліотеки типів.

До проекту також додається модуль InProcCOM_TLB, у якому міститься створений автоматично первісний текст бібліотеки типів, а також активізується (по F12 ) діалоговий редактор бібліотеки типів, який дозволяє формувати склад TLB, тобто склад СОМ-об’єкту.

Отже, до складу проекту входять:

  • головний модуль бібліотеки, що експортує основні функції роботи із СОМ-об’єктом:

  • DLLGetClassObject − доступ до фабрики класів;

  • DLLCanUnloadNow − вивантаження сервера з пам’яті по завершенні роботи;

  • DllRegisterServer – реєстрація, тобто запис до системного реєстру;

  • DLLUnregisterServer – дереєстрація, тобто видалення його з системного реєстру;

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

  • модуль бібліотеки типів, що містить опис СОМ-об’єктів, їхніх інтерфейсів, функцій та властивостей.

Примітка 1. Автоматично до складу СОМ-об’єкту (SimpleCOM) включається один інтерфейс з іменем ”I”+ім’я_СОМ-об’єкту (ІSimpleCOM), для якого батьківським є інтерфейс ІUnknown. Однак цей інтерфейс ще не містить жодного методу.

Примітка 2. Якщо у вікні майстра не був включений прапорець бібліотеки типів, то її можна включити до складу проекту пізніше ланцюжком:

File->New->ActiveX->TypeLibrary.

Крок 4. Створення методів інтерфейсу

У вікні формування TLB виділяємо інтерфейс ІSimpleCOM, вибираємо іконку Method на панелі інструментів. При цьому до інтерфейсу додається новий метод Method1 (перейменуємо його в Linear2X.) і відкривається вікно опису характеристик методу:

  • вкладка Attributes – задання атрибутів;

  • вкладка Parametrs − можна задати тип результату, що повертається, (у нашому випадку Іnteger) і типи параметрів обумовленого методу;

  • вкладка Flags – додаткові атрибути методу;

  • вкладка Text – містить текст методу мовою IDL.

У такий спосіб можна додати декілька методів (наприклад, Linear5X).

Крок 5. Створення ще одного інтерфейсу і методу до нього

Послідовність дій:

  • вибираємо іконку Interface на панелі інструментів і задаємо характеристики нового інтерфейсу: ім’я (наприклад, ISimpleCom2) і батьківський інтерфейс; як батьківський інтерфейс для простого СОМ-об’єкту вибирають інтерфейс IUnknown;

  • прив’язуємо новий інтерфейс (він наразі незалежний) до СОМ-об’єкту; для цього виділяємо рядок СоClass і на закладці Implements за контекстним меню викликаємо команду Insert Interface, вибираємо необхідний інтерфейс (той що додається, в нашому випадку ISimpleCom2) зі списку інтерфейсів;

  • формуємо методи цього інтерфейсу, наприклад, методи SquareX, CubeX.

Крок 6. Генерування шаблону коду для методів, визначених розроблювачем

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

Крок 7. Заповнення тіл методів, визначених в інтерфейсі

Відкрити модуль СОМ-об’єкту (модуль Co-класу) і внести реалізацію відповідних методів.

Крок 8. Компіляція проекту

Ланцюжок: Project -> Compile.

Крок 9. Реєстрація СОМ-сервера

Ланцюжок: Run->Register Active Server.

На цьому створення СОМ-сервера закінчено.