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

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

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

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

ИТ 13-2

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

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

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

Ход работы

1 Создать внепроцессный сервер в виде исполнимого EXE-файла с библиотекой типов. Выполнить реализацию методов интерфейса согласно индивидуальному заданию (см. лабораторную работу №1).При разработке СОМ-сервера предусмотреть его работу в режиме одного экземпляра.

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

3 Запустить несколько копий клиентского приложения и отследить их взаимодействие с СОМ-сервером.

4 Изменить параметры конструктора фабрики классов для обеспечения работы СОМ-сервера в режиме множественных экземпляров.

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

16

[0; 10]

Листинг:

Файл ProjectComServ_TLB:

unit ProjectComServer3_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

ProjectComServer3MajorVersion = 1;

ProjectComServer3MinorVersion = 0;

LIBID_ProjectComServer3: TGUID = '{25AB376C-FFA3-4BFA-8439-C376097C4824}';

IID_IComServer3: TGUID = '{278363F2-A711-4DC4-8C97-E7A96418D71A}';

CLASS_ComServer3: TGUID = '{97829843-ECA4-44D2-AA52-F12250471AB4}';

type

IComServer3 = interface;

ComServer3 = IComServer3;

IComServer3 = interface(IUnknown)

['{278363F2-A711-4DC4-8C97-E7A96418D71A}']

function F(x: Double; var y: Double): HResult; stdcall;

end;

CoComServer3 = class

class function Create: IComServer3;

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

end;

implementation

uses ComObj;

class function CoComServer3.Create: IComServer3;

begin

Result := CreateComObject(CLASS_ComServer3) as IComServer3;

end;

class function CoComServer3.CreateRemote(const MachineName: string): IComServer3;

begin

Result := CreateRemoteComObject(MachineName, CLASS_ComServer3) as IComServer3;

end;

end.

Файл ComRealese:

unit Relese;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses

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

type

TComServer3 = class(TTypedComObject, IComServer3)

protected

function F(x: Double; var y: Double): HResult; stdcall;

{Declare IComServer3 methods here}

end;

implementation

uses ComServ;

function TComServer3.F(x: Double; var y: Double): HResult;

begin

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

F:=S_Ok;

end;

initialization

TTypedComObjectFactory.Create(ComServer, TComServer3, Class_ComServer3,

ciMultiInstance, tmApartment);

end.

Клиент:

unit Main;

interface

uses

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

Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs,

Chart, XPMan, ProjectComServer3_TLB;

type

TForm1 = class(TForm)

Button1: TButton;

Chart1: TChart;

Series1: TLineSeries;

XPManifest1: TXPManifest;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

coe:IComServer3;

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var x:integer; y :Double; w:HResult;

begin

y:=0;

for x:=1 to 10 do

begin

w:=coe.F(x,y);

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

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

coe:=CoComServer3.Create;

end;

end.

Результат:

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