Класс TComServer - единственный «постоялец» модуля ComServ. В рамках класса инкапсулировано приложение COM-сервер, доступ к которому реализован посредством автоматически создаваемой глобальной переменной Com-Server. Цепочка наследования класса невелика. TComServer построен на основе абстрактного класса TComServerObject, который в свою очередь берет начало от TObject. Имя сервера устанавливается процедурой:
procedure SetServerName(const Name: string);
Библиотека типов загружается методом: procedure LoadTypeLib;
Процессом регистрации (и снятия с регистрации) COM-сервера в системном реестре ведает процедура:
procedure Initialize;
В рамках метода Initialize() вызывается процедура:
procedure UpdateRegistry(Register: Boolean);
Для регистрации в системном реестре всех входящих в сервер объектов в процедуру передается значение true. Обратная операция (стирание данных о COM-объектах в реестре) произойдет при передаче false.
Из девяти свойств COM-сервера всего одно доступно для редактирования:
property UIInteractive: Boolean;
Это свойство определяет, должен ли COM-сервер иметь интерактивный интерфейс с пользователем. Интерактивность (состояние true) в первую очередь проявляется в информировании сервером пользователя обо всех возникающих исключительных ситуациях. Если же сервер выполняется как отдельная служба (сервис), то целесообразно передавать в это свойство значение false.
В классе TComServer предусмотрен один-единственный обработчик события: property OnLastRelease: TLastReleaseEvent;
type TLastReleaseEvent = procedure(var Shutdown: Boolean) of object;
который призван реагировать на тот момент, когда последний клиент отказывается от услуг сервера. Единственный параметр метода Shutdown определяет, прекращать работу сервера (значение true) или оставить его в памяти (false).
Ниже представлен листинг, предлагающий вариант применения информационных свойств сервера.
implementation uses ComServ; {$R *.dfm}
procedure TfrmMain.FormCreate(Sender: TObject); begin
with Memo1.Lines do begin
Clear;
Add('HM4: -+#9+ComServer.ServerName);
AddC^a^: '+#9+ComServer.ClassName);
Add('Тип: -+#9+ComServer.ServerKey);
Add('HM4 файла: '+#9+ComServer.ServerFileName); end; end;
procedure TfrmMain.Timer1Timer(Sender: TObject); begin
{с каждым "вздохом" таймера мы узнаем количество загруженных COM-объектов} StaticTextl.Caption:=Format('Число COM-объектов %d',[ComServer. ObjectCount]); end;