Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тотосько 31-45.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
678.4 Кб
Скачать

Крім імені інтерфейсу, на вкладці Атрибути можуть бути змінені і деякі інші параметри інтерфейсу.

□ Поле GUID містить унікальний ідентифікатор інтерфейсу, який генерується автоматично. Змінювати його не слід.

□ Поле Version дозволяє задати номер версії.

□ Список, що розкривається Parent Interface використовується для вибору батьківського інтерфейсу. У нашому випадку тут слід вибрати інтерфейс IUnknown.

На вкладці Flags багатосторінкового «блокнота» налаштування інтерфейсу виконується установка деяких додаткових параметрів за допомогою прапорців. При створенні простого COM-об'єкта все прапорці на цій сторінці повинні бути скинуті. Після створення другого інтерфейсу задамо для кожного з існуючих інтерфейсів необхідні методи.

1. Виберіть потрібний інтерфейс в ієрархічному списку.

2. Клацніть на кнопці Новий метод панелі інструментів.

3. Задайте параметри створеного методу.

Зупинимося на останньому кроці більш докладно. Параметри методу задаються на вкладках багатосторінкового «блокнота». При виборі в ієрархічному списку одного з методів інтерфейсу праворуч відображаються чотири вкладки. Найбільший інтерес з них представляють дві - Attributes і Parameters. Найважливішим на вкладці Attributes є зміна імені методу. Для цього використовується поле Name. На вкладці Parameters вказується тип результату, що повертається методом (метод інтерфейсу обов'язково є функцією), а також параметри, передані в метод при виклику (параметри виклику функції). Тип результату задається за допомогою випадаючого списку Return Туре (рис. 18.4).

Рис. 18.4. Зміна типу результату, що повертається методом

Для завдання параметрів виклику методу використовуються список і кнопки, розташовані в нижній частині вкладки Parameters. При натисканні на кнопці Add до списку заноситься новий параметр. Після включення параметра в список можна змінювати його властивості (рис. 18,5):

□ в стовпці Name задається ім'я параметра:

□ в стовпці Туре вказується тип параметра;

□ в стовпці Modifier вказуються деякі додаткові властивості, в тому числі вхідний параметр або вихідний, обов'язковий чи ні і т. п. (може бути також вказано значення параметра за замовчуванням).

Рис. 18.5. Налаштування параметрів виклику методу

Для нашого прикладу необхідно створити по два методи для кожного інтерфейсу. Функції інтерфейсу ITestCom назвемо Avg (для обчислення математичного очікування) і Variance (для обчислення дисперсії). Методам інтерфейсу IMinMax присвоїм імена Min (для обчислення мінімальної величини) і Мах (для обчисленьня максимальної величини).

Тип результатів, що повертаються всіма методами, повинен бути дійсним. Тому для всіх функцій слід вибрати в списку Return Туре пункт float. Параметри виклику всіх методів також однакові - при виклику передається масив, який містить значення випадкової величини. У списку типів, які можна задавати параметрами, тип масиву відсутній. Однак для передачі масиву можна використовувати варіантний тип. Тому для всіх методів вкажіть по одному параметру типу Variant. Ніякий інший настройки методів в нашому прикладі робити не потрібно.

Після створення додаткових інтерфейсів і завдання параметрів методів необхідно виконати прив'язку новостворених інтерфейсів до COM-об'єкту. Для

цього в ієрархічному списку слід вибрати складовий клас (у нашому прикладі це об'єкт TestCom). Потім на вкладці Implements багатосторінкового «блокнота» за допомогою команди Insert Interface контекстного меню треба додати необхідний інтерфейс (у нашому випадку це інтерфейс IMinMax).

Залишилося тільки оновити вихідний код бібліотеки типів для внесення до нього всіх виконаних нами змін. Для цього клацніть на кнопці Refresh панелі інструментів редактора бібліотеки типів.

Розглянемо, які зміни відбулися в коді бібліотеки типів в результаті наших дій:

unit TestComServer_TLB:

{STYPEDADDRESS OFF} interface

uses Windows, ActiveX. Classes. Graphics, OleServer.

OleCtrls. StdVCL;

const

TestComServerMajorVersion = 1;

TestComServerMinorVersion = 0;

LIBIDJestComServer: TGUID - ’{05084EE0-A534-11D4- A8C1-0060518799BE}':

11D_ITestCom: TGUID = ' {05084EE1-A534-11D4-A8C1- 0060518799BE}':

IIDJMinMax: TGUID = '{1AD49218-A5FB-11D4-A8C1- 0060518799BE}':

CLASSJestCom: TGUID» '{05084EE3-A534-11D4-A8C1- 0060518799BE}';

type

ITestCom - interface:

IMinMax - interface:

TestCom = ITestCom:

ITestCom = interface(IUnknown)

[' {05084EE1-A534-11D4-A8C1-0060520799BE}' ] function Avg(Paraml: OleVariant): Single: stdcall: function Variance(Paraml: OleVariant): Single: stdcall: end;

IMinMax = interface(IUnknown)

['{1AD49220-A5FB-11D4-A8C1-0060520799BE}'] function Min(Paraml: OleVariant): Single: stdcall; function Max(Paraml: OleVariant): Single; stdcall: end:

CoTestCom = class

class function Create: ITestCom:

class function CreateRemotetconst MachineName:

string): ITestCom;

end;

implementation

uses ComObj;

class function CoTestCom.Create: ITestCom;

begin

Result := CreateComObject(CLASS_TestCom) as ITestCom: end:

class function CoTestCom.CreateRemotetconst MachineName: string): ITestCom; begin

Result := CreateRemoteComObjecttMachineName,

CL'ASS_TestCom) as ITestCom:

end;

end.

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

При оновленні вихідного коду шляхом клацання на кнопці Refresh в редакторі бібліотеки типів зміни вносяться не тільки в вихідний код бібліотеки (файл TestComServer_TLB.pas), але і в вихідний код модуля СОМ-об'єкту:

unit TestCOM:

interface

uses

Windows. ActiveX, Classes. ComObj, TestComServer_TLB. StdVcl: type

TTestCom = classtTTypedComObject. ITestCom. IMinMax) protected

function AvgtParaml: OleVariant): Single: stdcall; function VariancetParaml: OleVariant): Single; stdcall;

function Max(Paraml: OleVariant): Single; stdcall: function Min(Paraml: OleVariant): Single; stdcall;

{Declare ITestCom methods here} end;

implementation

uses ComServ;

function TTestCom.AvgtParaml: OleVariant): Single: begi n

end;

function TTestCom.yariance(Paraml: 01eVariant): Single: begin

end;

function TTestCom.Max(Paraml: OleVariant): Single; begin

end:

function TTestCom.Min(Paraml: OleVanant): Single; begin

end;

initialization TTypedComObjectFactory.Create(ComServer. TTestCom.

Class_TestCom,ciMulti Instance. tmSingle);

end.

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

ПРИМІТКА

В описі класу TTestCom ніяк не відзначена приналежність його методів різним інтерфейсам. Це розділення виконується в бібліотеці типів. У заголовку оголення класу зазначено, що цей клас має два інтерфейси - ITestCom і IMinMax.

ПРОГРАМУВАННЯ МЕТОДІВ ІНТЕРФЕЙСУ

Програмування методів інтерфейсів ніяких особливостей не має. Достатньо просто написати необхідний текст між ключовими словами begin та end для кожного з оголошених методів. Найбільші складності в нашому прикладі може викликати лише використання варіантних масивів. При розробці СОМ-об'єктів досить часто застосовують варіантні змінні. А передачу масиву COM-об'єкту найпростіше реалізувати з типом Variant. Тому розглянемо роботу з варіантними масивами більш докладно.

Для створення варіантного масиву використовуються дві функції.

function VarArrayCreate (const Bounds: array of Integer;

varType: Integer): Variant;

Виділяє область пам'яті для варіантного масиву і повертає покажчик на нього. Параметр Bounds задає індексацію масиву, varType - тип елементів масиву.

function VarArrayOf (const Values: array of Variant): Variant;

Виділяє область пам'яті для варіантного масиву і ініціалізує створений масив значеннями, переданими в параметрі Values.

При використанні варіантних масивів важливо знати мінімальні і максимальні значення його індексів. Для цього теж визначені дві функції.

function VarArrayLowBound (const A: Variant: Dim: Integer): Integer:

Повертає мінімальне значення індексу вимірювання Dim масиву А.

function VarArrayHighBound (const A: Variant: Dim: Integer): Integer;

Повертає максимальне значення індексу вимірювання Dim масиву А.

Примітка:

Варіантні масиви можуть бути багатовимірними, причому розмірність різних вимірювань в загальному випадку може бути різною. Тому функції VarArrayLowBound і VarArrayLowBound вимагають вказівки вимірювання, для якого визначаються межі індексу.

Нумерація вимірювань в варіантних масивах ведеться з 1. З цього випливає, що для отримання межі індексу одновимірного масиву параметр Dim повинен приймати значення 1.

Набір дій, які повинні виконуватися при виклику кожного з методів в розглянутому прикладі, досить простий: спочатку необхідно визначити межі зміни індексу варіантного масиву, а потім провести тривіальні обчислення:

function TTestCom.Avg(Paraml: OleVariant): Single: var

Nl,N2,i : Integer;

A : Single: begin A:=0:

Nl:=varArrayLowBound(Paraml.l):

N2:=varArrayHi ghBound(Paraml.1); for i:=N1 to N2 do A:=A+Paraml[i]; result:=A/(N2-Nl+l): end;

function TTestCom.Variance(Paraml: OleVariant): Single; var

N1.N2.i : Integer:

A.D : Single; begin A:=Avg(Paraml):

D:=0;

N1:=varArrayLowBound(Paraml,1):

N2:=varArrayHi ghBound(Paraml.1); for i:=N1 to N2 do D:=sqr(Paraml[i]-A); result:=D/(N2-Nl): end:

function TTestCom.Max(Paraml: OleVariant): Single; var

Nl.N2,i : Integer;

M : Single; begin

N1:“VarArrayLowBound(Paraml.1);

N2:=varArrayHi ghBound(Paraml,1):

M:=Paraml[Nl]; for i:=N1 to N2 do if Paraml[i]>M then M:=Paraml[i]; result:=M; end:

function TTestCom.Min(Paraml: OleVariant): Single; var

N1.N2.i : Integer;

M : Single; begi n

Nl:=varArrayLowBound(Paraml,l);

N2:=varArrayHighBound(Paraml.1);

M:=Paraml[Nl]; for i:=N1 to N2 do if Paraml[i]<M then M:=Paraml[i]; result:-M: end;

Після завдання коду реалізації методів створення COM-об'єкта завершено. Залишилось тільки виконати компіляцію динамічної бібліотеки та реєстрацію створеного СОМ-сервера.

Компіляція динамічної бібліотеки, яка є внутрішнім СОМ-сервером, нічим не відрізняється від компіляції звичайного застосування. Слід просто вибрати в головному меню команду Project ► Compile або натиснути комбінацію клавіш Ctrl + F9. Якщо в коді не міститься синтаксичних помилок, буде виконана компіляція і створений файл TestCOMServer.dll. Щоб створений COM-об'єкт можна було використовувати в додатках, слід виконати реєстрацію СОМ-сервера. Реєстрація внутрішнього сервера може бути виконана кількома способами:

□ виконанням в середовищі Delphi команди Run ► Register ActiveX Server головного меню;

□ запуском спеціальної утиліти RegSvr32;

□ внесенням необхідної запису до реєстру вручну;

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

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

Розробка клієнтського додатка для внутрішнього сервера

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

Додаток, що є COM-клієнтом, практично нічим не відрізняється від звичайного застосування. Тому його розробку слід починати з виконання команди File ► New Application головного меню IDE Delphi. Після створення нового додатка розробимо його головну форму. На форму потрібно виводити вихідні дані, використовувані для розрахунку. У нашому випадку це одновимірний масив дійсних чисел. Як приклад візьмемо фіксований масив з дев’яти елементів [1, 2, 3, 4, 5, 6, 7, 8, 9]. Відобразимо їх на формі за допомогою списку (компонента TListBox). Крім списку на формі мають бути елементи керування, за допомогою яких дається команда на виконання розрахунків, і елементи для виведення результатів. В якості перших будемо використовувати кнопки (TButton), в якості других - мітки (TLabel). Так як наш COM-об'єкт має два інтерфейси, то розділимо всі елементи управління, розміщені на формі, на дві групи. Групування виконаємо за допомогою компонента TGroupBox. Приблизний зовнішній вигляд форми додатка наведено на рис. 18.6.

Рис. 18.6. Головна форма клієнтського додатку

Після розробки форми займемося створенням необхідного коду. Щоб забезпечити взаємодія додатки з COM-об'єктом, в розділ uses головного модуля додатка слід включити бібліотеку типів (модуль TestComServer_TLB).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]