Лабораторная работа №3
.docxСимоненко В.С.
ИТ 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.
Результат:
Вывод: на примере данной лабораторной работы получил навыки создания внепроцессного СОМ-сервера с библиотекой типов.