- •Розподілені системи обробки інформації
- •Передмова
- •Розділ 1. Огляд компонентних технологій створення розподілених програмних систем
- •1.1. Узагальнена архітектура і механізм функціонування об'єктних розподілених систем
- •1.2. Основні приклади технологій створення розподілених систем
- •1.3. Переваги використання розподілених технологій
- •Розділ 2. Розроблення розподілених систем на основі модели com/dcom у Delphi
- •2.1. Використання dll у Delphi
- •2.1.1. Поняття dll
- •2.1.2. Створення dll у середовищі Delphi (експорт)
- •2.1.3. Використання dll у Delphi (імпорт)
- •2.1.4. Створення динамічних бібліотек для редагування ресурсів
- •2.2. Основи сом-технології
- •2.2.1. Загальний опис
- •2.2.2. Базові поняття
- •2.2.3. Бібліотека сом
- •2.2.4. Бібліотека типів
- •2.3.2. Сервер сом у Delphi
- •2.3.3. Бібліотека типів у delphі
- •2.4. Створення системи клієнт-сервер на основі базового com-об’єкту у складі внутрішнього сервера
- •2.4.1. Створення сом-сервера
- •2.4.2. Створення сом-клієнта
- •2.4.3. Використання сом-об’єкту в клієнтській програмі
- •2.5. Механізм міжпроцесного обміну
- •2.6. Створення систем клієнт-сервер на основі зовнішнього базового сом-об’єкту
- •2.6.1. Основні поняття
- •2.6.2. Засоби організації потокової взаємодії клієнта і сервера
- •2.6.3. Методи формування екземпляра сом-об’єкту
- •2.6.4. Формування екземпляра зовнішнього сом-об’єкту
- •2.6.5. Створення сом-сервера
- •2.6.6. Створення сом-клієнта
- •2.7. Автоматизація
- •Створення сервера автоматизації;
- •2.7.1. Базові поняття
- •2.7.2. Сервер автоматизації
- •2.7.3. Контролер автоматизації
- •2.8. Створення системи клієнт-сервер на основі внутрішнього сервера автоматизації
- •2.8.1. Об'єкт автоматизації. Клас tAutoObject
- •2.8.2. Вбудований сервер автоматизації
- •2.8.3. Створення клієнта автоматизації
- •2.9. Зовнішній сервер автоматизації
- •2.9.1. Основні визначення
- •2.9.2. Виконання маршалінгу з рядками, шрифтами і зображеннями
- •2.9.3. Перетворення наявного застосунка в сом-сервер автоматизації
- •2.9.4. Створення клієнта автоматизації
- •2.10. Події в сом і зворотні виклики на основі інтерфейсів диспетчирування
- •2.10.1. Створення сервера автоматизації
- •3. Формування бібліотеки типів
- •4. Формування методів
- •5. Реєстрація сервера
- •2.10.2. Створення клієнтського застосунка
- •2.10.3. Підключення множини клієнтів до сервера
- •2.11. Інтерфейси зі зворотним викликом
- •2.11.1. Створення сервера
- •2.11.2. Створення клієнтського застосунка
- •2.12. Технологія ActiveХ
- •2.12.1. Використання готових елементів АctiveХ
- •2.12.2. Розроблення власних елементів АctiveХ
- •2.12.3. Поширення елементів керування ActiveХ і форм ActiveХForm у Web-середовище
- •2.14. Dcom технологія
- •2.14.1. Загальна схема взаємодії сом-клієнта і сом-сервера
- •2.14.2. Розроблення системи «клієнт-віддалений сом-сервер»
- •Розділ 3. Проектування розподілених систем на платформі Microsoft .Net
- •3.1.1. Здійсненя викликань з типів .Net до типів сом
- •3.1.2. Звернення клієнта сом до збірки .Net
- •3.2. Об’єктно-орієнтована архітектура .Net Remotіng – основа створення розподілених систем Mіcrosoft .Net.
- •3.2.1. Створення системи клієнт-сервер на основі технології Remoting
- •Розділ 4. Створення системи "клієнт - сервер" на основі технології corba
- •4.1. Загальні теоретичні відомості
- •4.2. Створення серверного застосунка
- •1. Створення файла опису інтерфейсу
- •Викликання конструктора створення corba сервера
- •Формуємо модуль Unit1
- •Формуємо реалізацію методу
- •4.3. Створення клієнтського застосунка
- •Викликання конструктора corba-клієнта
- •2. Формування форми
- •3. Запуск застосунка
- •Приклад програмних кодів сервера
- •4.4. Порівняльний аналіз технологій сом і соrва
- •4.4.1. Основні принципи об'єктних моделей
- •4.4.2. Об'єктні моделі
- •4.4.3. Підтримка операційних систем
- •4.4.4. Формальний опис архітектури і проблеми реалізації
- •4.4.5. Підсумки порівняння
- •Літературні джерела
2.1.2. Створення dll у середовищі Delphi (експорт)
Ланцюжок File->New-> DLL Wizard приводить до створення нового проекту для DLL за таким шаблоном:
Library MyDLL;
uses
Sysutils, Classes, <модулі, що використовуються>;
<оголошення й описи функцій >
exports
<експортовані функції >
begin
<ініціалізаційна частина>
end.
Ім’я файла проекту для DLL має співпадати з назвою бібліотеки (в наведеному вище прикладі це ім’я має бути MyDLL.dpr).
Як і в програмі, у DLL є присутнім розділ uses. Він міcтить перелік модулів, які використовує сама DLL.
За розділом uses наводяться оголошення та реалізація функції або процедур, які складають DLL.
Загальний формат оголошення та реалізації методу, що експортується має такий вигляд:
Function ім’я_функції(параметри_функції):тип_функції; директива_виклику;
або
Procedure ім’я _процедури(параметри_процедури); директива_виклику;
Директива виклику визначає алгоритм за яким здійснюється передавання параметрів та режим використання стеку головної програми, а саме:
-
Директива виклику
Передавання параметрів
Режим очищення стеку
Register
(За замовчуванням)
1,2,3
Той, хто викликає
Pascal
1,2,3
Той, кого викликають
Stdcall
1,2,3
Той, хто викликає
Сdecl
3,2,1
Той, хто викликає
safecall ( СОМ технологія)
3,2,1
Той, хто викликає
У розділі exports перелічуються функції або процедури, доступ до яких здійснюється із зовнішніх застосунків.
Експортування функцій (і процедур) може виконуватися декількома способами:
-
за номером (індексом);
-
за іменем.
Залежно від цього використовується різний синтаксис:
exports
{експорт за індексом}
ExpFunc1 index 10;
{експорт за іменем}
ExpProc1 name 'MYEXPORTPROC';
{ім'я для експорту може не збігатися з ім'ям функції !}
Якщо в секції exports функції оголошуються в такий спосіб:
exports
MyExportFunc1,
MyExportFunc2;
то індексування експортованих функцій буде зроблене Delphi автоматично, а такий експорт буде вважатися експортом за іменем, що збігається з ім’ям функції. Тоді оголошення імпортованої функції у застосунку має збігатися з оголошенням функції в DLL, тобто мати те саме ім’я.
Завдяки тому, що у Windows існує поняття «резидентних функцій» DLL, тобто тих функцій, що перебувають в пам’яті протягом усього часу існування DLL у пам’яті, у Delphi існують засоби для організації і такого роду експорту:
exports
ExportByName name 'MYEXPORTPROC' resident;
Відзначимо той факт, що пошук функцій, експортованих за індексом, виконується швидше, ніж при експорті за іменем. З іншого боку, експорт за іменем зручніший, особливо якщо набір експортованих з DLL функцій періодично доповнюється, тому що не потребує стеження за дотриманням унікальності і відповідності індексів.
Секція ініціалізації (begin... end) є необов’язковою та містить код, який виконується першим при звертанні до DLL.
Створення процедури зворотного виклику. Під час завантаження DLL завжди викликається системна процедура _InitDll, яка зберігає стан регістрів, завантажує DLL, отримує зі стеку парамери та перевіряє системну змінну процедурного типу DLLProc. Реалізацію такої процедури виконує (за бажанням) розробник DLL. Процедура має один параметр із значенням:
DLL_PROCESS_DETACH = 0 − відключення,
DLL_PROCESS_ATTACH = 1 − перше підключення,
DLL_THREAD_ATTACH = 2 − підключення в новому потоці,
DLL_THREAD_DETACH = 3 − відключення в наявному потоці.
Приклад використання процедури
Library
//Функції для користувача
exports
//таблиця експорту
procedure DLLEntryPoint(reason:Integer);
begin
case reason of
1:Sowmessage('DLL завантажується вперше ');
1:Sowmessage('DLL виключається ');
2:Sowmessage('Створено новий потік');
3:Sowmessage('Знищено потік');
end;
end;
begin
// ініціалізація процедури зворотного виклику
DLLProc:= DllEntryPoint;
end.
Наведена процедура зветься процедурою зворотного виклику системного рівня.