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