Лабораторная работа №1
.docxСимоненко В.С.
ИТ 13-2
Лабораторная работа №1
Создание и использование внутрипроцессного COM-сервера
Цель: получить навыки создания внутрипроцессного СОМ-сервера и СОМ-клиента.
Ход работы
-
Создать внутрипроцессный сервер в виде динамической библиотеки, для чего выбрать на странице ActiveX Репозитория Delphi значок ActiveX Library, в результате чего будет создан новый проект DLL-библиотеки.
-
Из Репозитория выбрать значок COM Object на странице ActiveX. В результате будет открыт диалог установки начальных параметров нового объекта: в поле ввода текста Class Name необходимо ввести имя нового класса (например, New), выбор в списке Instancing в данном случае не имеет значения, выбор в списке Threading Model – желательно Apartment, флажок «Include Type Library» необходимо выключить.
-
Создать новый модуль, в котором выполнить описание интерфейса СОМ-объекта.
-
Выполнить реализацию методов интерфейса согласно индивидуальному заданию.
-
Откомпилировать СОМ-сервер в виде DLL-библиотеки. Зарегистрировать сервер в реестре операционной системы с помощью команды «RegSvr32».
-
Создать проект клиентского приложения, реализующего функциональность согласно индивидуального задания и вызывающего методы созданного СОМ-сервера. Добавьте в него созданный ранее модуль, содержащий описание разработанного интерфейса. Для вызова СОМ-сервера необходимо использовать стандартную функцию
function CreateComObject(var ClassID: TGUID): IInterface;
-
В ходе защиты лабораторной работы необходимо продемонстрировать знания основ технологии СОМ, классов и интерфейсов, создаваемых при ее реализации.
Индивидуальные задания
Разработать СОМ-сервер, реализующий вычисление значения заданной функции в точке. Разработать клиентское приложение, осуществляющее построение графика функции на отрезке.
16 |
[1; 10] |
Листинг программы
Интерфейс:
unit IInterface;
interface
const
CLSID_ComServer: TGUID = '{20C5F9EA-C37B-4AB0-97DD-B25D7CB0C15F}';
VIProgID_ComServer = 'DelphiKingdom.ComServer';
ProgID_ComServer = VIProgID_ComServer + '.1';
IID_IComServer: TGUID = '{E2ACAA85-9108-4736-9583-92D0EE16A764}';
type
IComServer = interface(IUnknown)
['{E2ACAA85-9108-4736-9583-92D0EE16A764}']
function F(x:Double):Double; stdcall;
end;
implementation
end.
COM-Сервер:
unit Main;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, ActiveX, Classes, Math, ComObj, IInterface;
type
TComClass = class(TComObject, IComServer)
public
function F(x:Double):Double; stdcall;
end;
const
Class_ComClass: TGUID = '{D20367C9-1903-4FC9-AA46-60108184362B}';
implementation
uses ComServ;
function TComClass.F(x:Double):Double;
begin
F:=sqrt(1+sqrt(x));
end;
initialization
TComObjectFactory.Create(ComServer, TComClass, Class_ComClass,
'ComClass', '', ciMultiInstance, tmApartment);
Регистрация Com-Сервера:
COM-Клиент:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComObj, IInterface, TeEngine, Series, ExtCtrls, TeeProcs,
Chart, DbChart, XPMan;
type
TForm1 = class(TForm)
Button1: TButton;
DBChart1: TDBChart;
Series1: TLineSeries;
Memo1: TMemo;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FSimpleInstance: IComServer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
const
Class_ComClass: TGUID = '{D20367C9-1903-4FC9-AA46-60108184362B}';
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FSimpleInstance := CreateComObject(Class_ComClass) as IComServer;
if FSimpleInstance = nil then
ShowMessage('Сервер не найден');
Exit;
end;
procedure TForm1.Button1Click(Sender: TObject);
var x:Integer; y:Double;
begin
for x:=1 to 10 do
begin
y:= FSimpleInstance.F(x);
Memo1.Lines.Add('x='+IntToStr(x)+'; y='+FloatToStr(y)+';');
Series1.AddXY(x,y,'',clGreen);
end;
end;
end.
Результат работы:
Вывод: на примере данной лабораторной работы получил навыки создания внутрипроцессного СОМ-сервера и СОМ-клиента.