
Примітка
У даному прикладі при створенні об'єкта автоматизації не була включена підтримка обробки подій. Програмування подій в деякій мірі ускладнює код модуля об'єкта автоматизації і являє собою нетривіальну задачу, але зважаючи обмеженого обсягу книги дані питання тут не розглядаються.
Код бібліотеки типів новоствореного об'єкта автоматизації, на відміну від СОМ-об'єкту, включає опис декількох інтерфейсів:
unit AutoServer_TLB;
{STYPEDADDRESS OFF}
uses Windows, ActiveX. Classes, Graphics, OleServer,
OleCtrls. StdVCL;
const
AutoServerMajorVersion = 1;
AutoServerMinorVersion = 0;
LIBID_AutoServer: TGUID - '{62D7BF80-A76C-11D4-A8C1- 0060520799ВЕ} ’;
IID_ITestAuto: TGUID = '{62D7BF81-A76C-11D4-A8C1- 0060520799BE}';
CLASS_TestAuto: TGUID = 1{62D7BF85-A76C-11D4-A8C1- 0060520799BE}':
type
ITestAuto = interface;
ITestAutoDisp = dispinterface:
TestAuto - ITestAuto;
ITestAuto = interface(IDispatch)
['{62D7BF81-A76C-11D4-A8C1-0060520799BE}'] end;
ITestAutoDisp = dispinterface
['{62D7BF81-A76C-11D4-A8C1-0060520799BE}' ]
end;
CoTestAuto = class class function Create: ITestAuto; class function CreateRemote(const MachineName: string): ITestAuto; end;
implementation
uses ComObj;
class function CoTestAuto.Create: ITestAuto; begin
Result := CreateComObject(CLASS_TestAuto) as ITestAuto: end;
class function CoTestAuto'.CreateRemote(const MachineName: string): ITestAuto; begin
Result := CreateRemoteComObject(MachineName.
CLASS_TestAuto) as ITestAuto:
end:
end.
Інтерфейс ITestAuto називається дуальним і призначений для роботи з об'єктом TTestAuto.
ПРИМІТКА
Дуальні інтерфейси є спадкоємцями інтерфейсу IDispatch і забезпечує як зв'язування з об'єктом під час компіляції (раннє зв'язування через таблицю віртуальних методів), так і пізніше зв'язування, використовуване в технології автоматизації.
Інтерфейс диспетчеризації ITestAutoDisp забезпечує взаємодію з об'єктивним на основі технології автоматизації.
СТВОРЕННЯ ІНТЕРФЕЙСІВ І МЕТОДІВ ОБ'ЄКТУ АВТОМАТИЗАЦІЇ
Так само як і при розробці COM-об'єкта, інтерфейси і методи об'єкта автоматизації створюються за допомогою редактора бібліотеки типів. Для спрощення приклада створимо тільки один інтерфейс, який буде містити методи обчислення середнього значення і дисперсії. Слід зазначити, що створення методів інтерфейсу для об'єкта автоматизації має одну особливість, яка полягає в тому, що результат, що повертається функцією, може мати тільки тип HRESULT. У цьому випадку метод є процедурою, тому для передачі розрахованого значення в клієнтський додаток слід використовувати параметр виклику процедури.
Таким чином, у нашому прикладі при виклику методу потрібні два параметри: перший використовується для передачі даних об'єкту автоматизації, а другий - для отримання результату від об'єкта автоматизації. Створення нового методу інтерфейсу і зміна його імені провадиться точно так само, як і при розробці COM-об'єкта. Тип результату НRESULT присвоюється методом за замовчуванням, тому зазвичай змінювати значення в списку Return Туре не потрібно. Створення першого параметра методу також повністю аналогічно прикладу для СОМ-об'єкту. А ось завдання другого параметра має особливості, пов'язані з тим, що через цей параметр об'єкт автоматизації повертає результат клієнтського додатку. Тому даний параметр повинен передаватися по посиланню, а не по значенню, і мати атрибут out. Щоб вказати, що параметр передається по посиланню, потрібно просто додати символ зірочки (*) до імені типу параметра в стовпці Туре списку Parameters (мал. 18.8).