- •Розподілені системи обробки інформації
- •Передмова
- •Розділ 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.3. Використання dll у Delphi (імпорт)
Для організації імпорту, тобто доступу до функцій, експортованих з DLL, Delphi надає стандартні засоби.
Статичний (неявний) виклик
У секції програми, що викликає DLL, необхідно оголосити функції, імпортовані з DLL у такий спосіб:
{ імпорт за специфікованим іменем }
procedure <ім’я_процедури>; external '<шлях_до_DLL>' name '<ім’я_за_експортом>';
Наприклад:
procedure ImpProc1; external 'MYDLL' name 'MYEXPORTPROC';
{ імпорт за індексом }
procedure <ім’я_процедури>; external '<шлях_до_DLL>' index <індекс_за_експортом>;
Наприклад:
procedure ImpProc1; external 'MYDLL' index 10;
{ імпорт за оригінальним іменем }
procedure <ім’я_процедури>; external '<шлях_до_DLL>';
Наприклад:
procedure MyExportFunc1; external 'MYDLL';
Аналогічно здійснюється імпорт функцій.
Далі в програмі відбувається звичайне звертання до імпортованих методів. Цей спосіб також називається статичним імпортом.
Динамічний (явний) виклик
Розширення файла, що містить DLL, не вказується − за замовчуванням маються на увазі файли *.DLL і *.ЕХЕ. Якщо файл має інше розширення (наприклад, як COMPLIB.DCL у Delphi), або якщо потрібне динамічне визначення DLL і імпортованих функцій, використовують динамічне підключення DLL.
Нижче наведено фрагмент програмного модуля з демонстрацією динамічного підключення DLL.
uses
WinTypes, WinProcs, ... ;
Type
// оголошення процедурного типу, що співпадає з прототипом
//оголошеного в DLL методу
TMyProc = procedure() ;
var
Handler : THandle; // оголошення дескриптора бібліотеки
MyImportProc : TMyProc; // оголошення змінної процедурного типу
begin
// пошук та завантаження DLL
Handler:=LoadLibrary('MYDLL');
if Handler>=32 then { if <=32 - error ! }
begin
// формування вказівника на імпортований метод
MyImportProc:=GetProcAddress(Handler,'MYEXPORTPROC');
if @MyImportProc<>nil then
...... {using imported procedure}
end;
FreeLibrary(Handler); // звільнення бібліотеки
end;
Далі в програмі виконується звичайне звертання до імпортованих методів.
DLL, що використовує об’єкти VCL для роботи з формами
Форми в DLL необхідно створювати “вручну”, наприклад:
Procedure ShowForm(AOwner:TComponent);
begin
DemoForm := TDemoForm.Create(Aowner);
DemoForm.ShowModal;
DemoForm.Free;
end;
Параметр AOwner є вказівником на батьківське вікно форми (батьківський застосунок).
Програма-користувач DLL має:
1) оголосити таку процедуру
Procedure ShowForm(AOwner:TComponent); external ’mydll.dll’;
2) розробити процедуру звертання до неї за деякою подією, наприклад:
Procedure Form1.Button1Click(Sender:TObject);
begin
ShowForm(Application);
end;
DLL, що використовує динамічні змінні
Якщо DLL використовує змінні або функції, які приводять до необхідності динамічного використання оперативної пам’яті (довгі рядки, або динамічні масиви, або функції GetMemo), вони повинні обов’язково використовувати модуль SHAREMEM. Модуль має вказуватися двічі: в самій DLL наведеним першим у списку модулів секції uses, а також у файлі проекту клієнта.
DLL, що використовує об’єкти VCL для роботи з базами даних
При створенні своєї динамічної бібліотеки можна використовувати виклики функцій з інших DLL. Приклад такої DLL є в інсталяційному пакеті Delphi (X:\Delphi\DEMOS\BD\BDEDLL). Ця DLL містить форму, що відображає дані з таблиці і використовує для доступу до неї об’єкти VCL (ТТable, TDBGrid, ТSession), які, у свою чергу, викликають функції BDE. Для такої DLL існує обмеження: її не можуть одночасно використовувати кілька задач. Це пояснюється тим, що об’єкт Session, який створюється автоматично при підключенні модуля DB, ініціюється для модуля, а не для задачі. Якщо спробувати завантажити цю DLL удруге з іншого застосунка, то виникне помилка. Для запобігання одночасного завантаження DLL декількома задачами необхідно здійснити деякі дії. Наприклад, розробити процедуру перевірки того, чи використовується DLL у цей момент іншою задачею.
Виняткові ситуації в DLL
Виникнення виняткової ситуації в DLL, створеної в Delphi, призведе до припинення виконання всього застосунка, якщо ця ситуація не була оброблена всередині DLL. Тому бажано передбачити всі можливі неприємності на момент розробки DLL. Можна порекомендувати повертати результат виконання імпортованої функції у вигляді рядка або числа і, при необхідності, наново викликати виняткову ситуацію в програмі.
//Код у DLL, що дозволяє обробляти виняткові ситуації
function MyFunc : string;
begin
try {код функції}
except
on EResult: Exception do
Result:=Format(DllErrorViewingTable, [EResult.Message]);
else
Result := Format(DllErrorViewingTable, ['Unknown error']);
end;
end;
// Відповідний код у програмі-користувачі DLL:
StrResult:=MyFunc;
if StrResult <> ’’ then
//Якщо в DLL виникла виняткова ситуація
raise Exception.Create(StrResult);