Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб.2

.docx
Скачиваний:
15
Добавлен:
06.05.2017
Размер:
190.63 Кб
Скачать

Симоненко В.С.

ИТ 13-2

Лабораторная работа №2

Создание и использование внутрипроцессного COM-сервера с библиотекой типов

Цель: получить навыки создания внутрипроцессного СОМ-сервера с библиотекой типов.

Ход работы

1. Создать внутрипроцессный сервер в виде динамической библиотеки, для чего выбрать на странице ActiveX Репозитория Delphi значок ActiveX Library, в результате чего будет создан новый проект DLL-библиотеки.

2. Из Репозитория выбрать значок COM Object на странице ActiveX. В результате будет открыт диалог установки начальных параметров нового объекта: в поле ввода текста «Class Name» необходимо ввести имя нового класса, выбор в списке «Instancing» в данном случае не имеет значения, выбор в списке «Threading Model» – желательно Apartment, флажок «Include Type Library» необходимо включить.

3. С использованием редактора библиотеки типов выполнить описание интерфейса СОМ-объекта.

4. Выполнить реализацию методов интерфейса согласно индивидуаль-ному заданию (см. лабораторную работу №1).

5. Откомпилировать СОМ-сервер в виде DLL-библиотеки. Зарегистри-ровать сервер в реестре операционной системы.

6. Создать проект клиентского приложения, реализующего функциона-льность согласно индивидуального задания и вызывающего методы созданного СОМ-сервера. Выполнить импортирование библиотеки типов в программный модуль, содержащий описание разработанного интерфейса, и подключить его к разрабатываемому приложению.

7.В ходе защиты лабораторной работы необходимо продемонстриро-вать знания основ технологии СОМ, классов и интерфейсов, создаваемых при ее реализации.

Листинг

unit ProjectComServer2_TLB;

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.

{$WARN SYMBOL_PLATFORM OFF}

{$WRITEABLECONST ON}

{$VARPROPSETTER ON}

interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;

const

// TypeLibrary Major and minor versions

ProjectComServer2MajorVersion = 1;

ProjectComServer2MinorVersion = 0;

LIBID_ProjectComServer2: TGUID = '{2E3E00DF-343E-4ACC-814E-755A4E79C894}';

IID_IComServer2: TGUID = '{1218E967-7130-43AE-9439-860F1137621C}';

CLASS_ComServer2: TGUID = '{72E60162-F7FD-4C0D-B9B3-E22258B5A4F2}';

type

ComServer2 = IComServer2;

IComServer2 = interface(IUnknown)

['{1218E967-7130-43AE-9439-860F1137621C}']

function F(x: Double): Double; stdcall;

end;

CoComServer2 = class

class function Create: IComServer2;

class function CreateRemote(const MachineName: string): IComServer2;

end;

implementation

uses ComObj;

class function CoComServer2.Create: IComServer2;

begin

Result := CreateComObject(CLASS_ComServer2) as IComServer2;

end;

class function CoComServer2.CreateRemote(const MachineName: string): IComServer2;

begin

Result := CreateRemoteComObject(MachineName, CLASS_ComServer2) as IComServer2;

end;

end.

COM-Сервер:

unit Main;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses

Windows, ActiveX, Math, Classes, ComObj, ProjectComServer2_TLB, StdVcl;

type

TComServer2 = class(TTypedComObject, IComServer2)

protected

function F(x: Double): Double; stdcall;

{Declare IComServer2 methods here}

end;

implementation

uses ComServ;

function TComServer2.F(x: Double): Double;

begin

F:=sqrt(1+(sqrt(x));

end;

initialization

TTypedComObjectFactory.Create(ComServer, TComServer2, Class_ComServer2,

ciMultiInstance, tmApartment);

end.

Регистрация COM-Сервера:

COM-Клиент:

unit Main;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ProjectComServer2_TLB, StdCtrls, TeEngine, Series, ExtCtrls,

TeeProcs, Chart, XPMan;

type

TForm1 = class(TForm)

Button1: TButton;

Chart1: TChart;

Series1: TLineSeries;

XPManifest1: TXPManifest;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var Fun:IComServer2; x:Integer; y :double;

begin

Fun := CoComServer2.Create;

for x:=1 to 10 do

begin

y:=Fun.F(x);

Series1.AddXY(x,y,'',clgreen);

end;

end;

end.

Результат работы:

Вывод: на примере данной лабораторной работе получил навыки создания внутрипроцессного СОМ-сервера с библиотекой типов.