- •Розподілені системи обробки інформації
- •Передмова
- •Розділ 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.9.4. Створення клієнта автоматизації
Розглянемо процес розробки клієнтського застосунка, який буде автоматизувати серверний застосунок – носій СОМ-об’єкту.
У більшості випадків, коли бажано використовувати сервер автоматизації, у вас немає програмного коду інтерфейсів цього сервера. Розглянемо, як імпортувати бібліотеку типів у середовище Delphi і в такий спосіб автоматично відтворити необхідний програмний код.
Створіть у Delphi новий проект (application). Активізуйте діалогове вікно імпорту бібліотеки типів (в меню Project Import Type Library). У списку знайдіть рядок MemoSrv (Version 1,0). Якщо необхідної бібліотеки у списку не виявиться, натисніть на кнопку Add, і виділіть файл MemoSrv.ехе в тім каталозі, де він розміщений на вашому комп'ютері.
Виділіть у списку рядок MemoSrv (Version 1.0) і натисніть на кнопку ОК. Delphi сформує бібліотеку під ім'ям MemoSrv_TLB.pas для сервера автоматизації MemoSrv. За замовчуванням файл буде вміщений у каталог Imports. Якщо на комп'ютері середовище Delphi установлене з параметрами, запропонованими за замовчуванням, повне ім'я каталогу буде C:\Program Files\Borland\Delphi\Imports. Тут Delphi відповідає номеру версії Delphi (Delphi6, Delphi7 тощо). У лістингу наведена частина програмного коду імпортованої бібліотеки типів MemoSrv_TLB.
unit MemoSrv;
interface
uses Windows, ActiveX, Classes, Graphics, OleCtrls, StdVCL;
//GUIDS declared in the TypeLibrary. Following prefixes are used:
//Type Libraries : LIBID XXXX
//CoClasses : CLASS xxxx
//DISPInterfaces : DIID XXXX
//Non-DISP interfaces: IID XXXX
const
LIBID MemoSrv:TGUID='{A1E420C7-F75F-11D2-B3B9-0040F67455FE}';
IID IMemoIntf:TGUID='{A1E420C8-F75F-11D2-B3B9-0040F67455FE}';
CLASS_MemoIntf:TGUID='{A1E420CA-F75F-11D2-B3B9-0040F67455FE}';
type
// Оголошення інтерфейсів, визначених у бібліотеці типів
IMemoIntf = interface;
IMemoIntfDisp = dispinterface;
//Оголошення сполучених класів, визначених у бібліотеці типів
MemoIntf = IMemoIntf;
IMemoIntf = interface(IDispatch);
['{A1E42QC8-F75F-11D2-B3B9-0040F67455FE}']
function Get_Color: OLE_COLOR; safecall;
procedure Set_Color(Value: OLE_COLOR); safecall;
function Get_Font: IFontDisp; safecall;
procedure Set_Font(const Value: IFontDisp); safecall;
function Get_Text: IStrings; safecall;
procedure Set_Text(const Value: IStrings); safecall;
property Color: OLE_COLOR read Get_Color write Set_Color;
property Font: IFontDisp read Get_Font write Set_Font;
property Text: IStrings read Get_Text write Set_Text;
end;
// DispIntf: ImemoIntDisp
// Flags: (4416) Dual OleAutomation
// GUID: {A1E420C8-F75F-11D2-B3B9-0040F67455FE}
IMemoIntfDisp = dispinterface
['{A1E420C8-F75F-11D2-B3B9-0040F67455FE}']
property Color: OLE_COLOR dispid 2;
property Font: IFontDisp dispid 1;
property Text: IStrings dispid 3;
end;
CoMemoIntf = class
class function Create: IMemoIntf;
class function CreateRemote (const MachineName: string): IMemoIntf;
end;
implementation
uses ComObj;
...
end.
Додайте ім'я файлу MemoSrv_TLB.pas у директиву uses модуля головної форми застосунка і скомпілюйте його, щоб переконатися, що Delphi знаходить імпортований модуль.
Розглянемо фрагменти програми, що відповідальні за взаємодію із сервером автоматизації.
procedure TForm1.btnConnectClick(sender: TObject);
begin
FMemo := CoMemoIntf.Create;
end;
procedure TForm1.btnDisconnectClick(sender: TObject);
begin
FMemo := nil;
end;
Додамо також у головну форму три кнопки для керування шрифтом, кольором і текстом. Як підкреслювалося раніше, Delphi забезпечує підтримку маршалінгу типів даних, що містять шрифти, списки рядків і зображення. Відповідні фрагменти програми виглядають тривіально.
procedure TForm1.btnSetFontClick(Sender: TObject);
var FontDisp: IFontDisp;
begin
if FontDialog1.Execute then
begin
Memo1.Font.Assign(FontDialog1.Font);
GetOleFont(FontDialog1.Font, FontDisp);
FMemo.Set_Font(FontDisp);
end;
end;
Повний текст програми клієнтського застосунка MemoCli:
unit MainForm;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MemoSrv_TLB;
type
TForm1 = class(TForm)
btnSetColor: TButton;
btnConnect: TButton;
btnSetFont: TButton;
btnSetText: TButton;
btnGetColor: TButton;
btnGetFont: TButton;
btnGetText: TButton;
Memo1: TMemo;
FontDialogls: TFontDialog;
ColorDialogl: TColorDialog;
procedure btnConnectClick(Sender: TObject);
procedure btnDisconnectClick(Sender: TObject);
procedure btnSetColorClick(Sender: TObject);
procedure btnSetFontClick(Sender: TObject);
procedure btnSetTextClick(Sender: TObject);
procedure btnGetColorClick(Sender: TObject);
procedure btnGetFontClick(Sender: TObject);
procedure btnGetTextClick(Sender: TObject);
private
{ Оголошення закритих членів}
FMemo: IMemoIntf;
public
{ Оголошення загальнодоступних членів }
end;
var
Form1: TForm1;
implementation
uses ActiveX, AXCtrls, StdVCL;
{$R *,DFM}
procedure TForm1.btnConnectClick(Sender: TObject);
begin
FMemo := CoMemoIntf.Create;
end;
procedure TForm1.btnDisconnectClick{Sender; TObject);
begin
FMemo := nil;
end;
procedure TForm1.btnSetColorClick(Sender; TObject);
begin
if ColorDialog1.Execute then
begin
Memo1.Color := ColorDialog1.Color;
FMemo.Set_Color(ColorToRGB(ColorDialog1.Color));
end;
end;
procedure TForm1.btnSetFontClick(Sender: TObject);
var
FontDisp: IFontDisp;
begin
if FontDialog1.Execute then
begin
Memo1.Font.Assign(FontDialog1.Font);
GetOleFont(FontDialog1.Font,FontDisp);
Fmemo.Set_Font(FontDisp);
end;
end;
procedure TForm1.btnSetTextClick(Sender: TObject);
var
Strings: IStrings;
begin
GetOleStrings(Memo1.Lines, Strings);
FMemo.Set_Fext(Strings);
end;
procedure TForm1.BtnGetColorClick(Sender: TObject);
begin
Memol.Color := FMemo.Get_Color;
end;
procedure TForm1.btnGetFontClick(Sender: TObject);
var
FontDisp: IFontDisp;
begin
FontDisp :=FMemo.Get Font;
SetOleFont(Memo1.Font, FontDisp);
end;
procedure TForm1.btnGetTextClick(Sender: TObject);
var
Strings: IStrings;
begin
Strings := FMemo.Get_Text;
SetOleStrings(Memo1.Lines, Strings);
end;
end.
Отже, основні операції, що знадобилися нам для створення клієнта автоматизації:
-
створити новий проект (application);
-
імпортувати бібліотеку типів сервера автоматизації;
-
звернутися до СОМ-об’єкту і отримати вказівник на інтерфейс;
-
сформувати методи для викликання функцій сервера.
Контрольні запитання та завдання:
-
Як працює зовнішній сервер автоматизації?
-
Дайте опис засобів створення зовнішнього сервера автоматизації та методів інтерфейсу автоматизації.
-
Наведіть опис побудови клієнта зовнішнього сервера.
-
В чому полягає проблема маршалінгу і як вона вирішується?
-
Яким чином Delphi забезпечує підтримку маршалінгу типів даних, що містять шрифти, списки рядків і зображення?