Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

TServiceApplication - организация интерфейса   Найти похожие ветки 

 
andrey__   (2004-05-07 10:31) [0]

Была программа с таймером (работающим постоянно) и  с интерфейсом в виде формы с помощью которого можно было остановить/запустить работу таймера, поменять параметры его работы ну и еще кое что. Потом возникла необходимость переписать программу как службу. Основную работу которую делает таймер я реализовал как службу (TServiceApplication )  но теперь стоит задача сделать интерфейс к этой службе. Кто может подсказать как это сделать - прошу ответить.
Спасибо.


 
Семен Сорокин ©   (2004-05-07 10:37) [1]

andrey__   (07.05.04 10:31)  
Да таким же образом, я делал так:
1. При установки сервиса - автоматом модально показывал форму с настройками (там событие есть OnInstall или похожее).
2. Либо при запуске с ключом (например /Setup) тоже показываешь форму.


 
andrey__   (2004-05-14 11:43) [2]

>Семен Сорокин ©   (07.05.04 10:37) [1]
>Да таким же образом, я делал так:
>1. При установки сервиса - автоматом модально показывал форму с >настройками (там событие есть OnInstall или похожее).

Если Ты имеешь в виду событие OnCreate, то Я сделал форму и показываю ее в этом событии. Инсталлирую (делаю вход в систему под LocalSystem, помечаю "разрешить взаимодействовать с рабочим столом"), запускаю на своей машине (Windows 2000 Professional) все нормально - показывается форма и одновременно работает служба.
Пытаюсь инсталлировать на другой машине (Windows 2000 Server) - инсталлируется нормально, но когда запускаю, то форма не отображается, а служба работает нормально.
Подскажите, как сделать, чтобы отображалась форма на Windows 2000 Server.


 
Семен Сорокин ©   (2004-05-14 11:58) [3]

andrey__   (14.05.04 11:43) [2]
трудно сказать в чем проблема.
не пробовал пройтись отладчиком? приведи код отображения формы.


 
andrey__   (2004-05-14 12:11) [4]

>приведи код отображения формы.

код файла проекта:
program UchetServServiec;
uses
 SvcMgr,
 unServService in "unServService.pas" {ServService: TService},
 Unit1 in "Unit1.pas",
 WorkSenior in "WorkSenior.pas",
 Workbackground in "Workbackground.pas",
 WorkCrea30min in "WorkCrea30min.pas",
 CreateBackup in "CreateBackup.pas",
 Un_Work9_SutTab in "Un_Work9_SutTab.pas",
 unInterfase in "unInterfase.pas" {InterfaseForm};
{$R *.RES}
begin
 Application.Initialize;
 Application.CreateForm(TServService, ServService);
 Application.Run;
end.


код отображения формы:
procedure TServService.ServiceCreate(Sender: TObject);
begin
  Application.CreateForm(TInterfaseForm, InterfaseForm);
  InterfaseForm.Show;
end;


 
Digitman ©   (2004-05-14 12:23) [5]


> то форма не отображается, а служба работает нормально


у тебя в коде речь идет как минимум о 2-х формах - TServService и TInterfaseForm... какая из них не отображается ? TServService ? а смысл вообще каков в ней заложен ? ведь сервис-приложение, будучи запущенным, может контролировать работу более чем одного сервиса !


 
andrey__   (2004-05-14 12:40) [6]

>Digitman ©   (14.05.04 12:23) [5]

TServService - это сервис, а TInterfaseForm - форма с помощию которой я хочу управлять работой сервиса (пауза, продолжение, стоп) и менять параметры ее работы.


 
Digitman ©   (2004-05-14 12:50) [7]

т.е. при старте сервис-приложения ты не видишь никаких визуальных проявлений создания формы TInterfaseForm ? я правильно понял ?


 
Петров Денис ©   (2004-05-14 13:12) [8]

IMHO, писать интерактивные сервисы - во-первых, дурной тон, во-вторых, достаточно нудно: тебе еще предстоит не только создать вывести форму, а вывести ее на нужный десктоп нужной оконной станции. Соответственно, определить, есть ли он вообще на текущий момент. оно тебе надо?

Хочешь настраивать сервис налету - предусмотри какой-нибудь интерфейс взаимодействия с сервисом, например, через проецируемые файлы, сокеты, вариантов много. Создай, к примеру, cpl и настрайвай через него.


 
Armen   (2004-05-14 13:37) [9]

program Project2;
                                                                               
uses
 SvcMgr,
 Forms,
 SysUtils,
 Unit1 in "Unit1.pas" {Service1: TService},
 Unit2 in "Unit2.pas" {Form2};

{$R *.RES}
                                                                               

begin
 if FindCMDLineSwith(..."/configure"...Параметры не помню, под рукой нету Delphi) then
 begin
   SvcMgr.Application.Initialize;
   SvcMgr.Application.CreateForm(TService1, Service1);
   SvcMgr.Application.Run;
 end else
 begin
   Forms.Application.Initialize;
   Forms.Application.CreateForm(TForm2, Form2);
   Forms.Application.Run;
 end;
end.


 
andrey__   (2004-05-14 13:40) [10]

>Digitman ©   (14.05.04 12:50) [7]
>т.е. при старте сервис-приложения ты не видишь никаких >визуальных проявлений создания формы TInterfaseForm ? я >правильно понял ?

Да при старте на машине с Windows 2000 Server формы нет. Но я забыл сказать, что при инсталяции форма появляется вместе с сообщением "serviec installed successfully" и после того как я жму ОК исчезает (тоже самое и в Windows 2000 Professional, но там при запуске службы она отображается).


 
Digitman ©   (2004-05-14 13:45) [11]


> andrey__


ну при инсталляции - это понятно .. еще бы она не отображалась  ..

а вот старт сервиса под управлением Винтукей-Сервера вполне может происходить в контексте иного дисктопа, поэтому и окно формы не отображается на текущем дисктопе


 
Armen   (2004-05-14 13:49) [12]

Armen   (14.05.04 13:37) [9]
Проверено 100% работает, и не надо делать сервис интерактивной.
Только после этого Delphi IDE уже не в силах справиться с файлом проекта, и придется там все писать руками.


 
Петров Денис ©   (2004-05-14 13:51) [13]

> andrey__   (14.05.04 11:43) [2]
> делаю вход в систему под LocalSystem

Уважаемый, простейшая ситуация: сервис стартует автоматически? Скорее всего. Когда происходит автостарт сервиса? Естественно, до входа пользователя в систему. Пока ни один из пользователей не вошел в систему, на какой десктоп будет выведена твоя форма?

Ты же говоришь ей создаваться автоматически, так определи, для начала, оконную станцию и рабочий стол, чтобы VCL создала тебе форму.

Кроме того, учти, что у SvcMgr.Application и Forms.Application - свои циклы выборки сообщений.

Для иллюстрации неработоспособности твое кода в принципе, а не только под Win2k Server, предлагаю произвести эксперимент: перезагрузись, получи свое сообщение об ошибке и сделай либо так, как предлагает Armen   (14.05.04 13:37) [9], либо напиши по-человечески интерактивный сервис, либо настрайвай сервис из отдельного приложения.


 
Digitman ©   (2004-05-14 13:57) [14]


> andrey__


Конечно же, интеракт.сервис - это большая крайность ..

Поэтому прислушайся к
> Петров Денис ©   (14.05.04 13:12) [8]
и реализуй интерак.управление сервисом любыми другими средствами, например, те же самые  GUI-app/CPL-app + MMF/Pipes/ThreadMessages


 
Digitman ©   (2004-05-14 14:01) [15]


> > andrey


есть и еще один (правда весьма изощренный) способ обмена инф-цией с сервисом - использование сервисом и управляющим им приложением единой ДЛЛ с расшаренной в ней секцией данных


 
Игорь Шевченко ©   (2004-05-14 14:22) [16]

Digitman ©   (14.05.04 14:01)


> единой ДЛЛ с расшаренной в ней секцией данных


Сергей, а вопрос такой - ты готовых инструментов/версий Delphi не встречал, которые позволяют сделать расшаренную секцию данных в DLL?


 
Digitman ©   (2004-05-14 14:37) [17]


> Игорь Шевченко ©   (14.05.04 14:22) [16]


Игорь. нет, не встречал ... попросту потому что не интересовался ... но наверняка таковые (прикладные инструменты. но не версии делфи) имеются в природе ...

Но среди Индейских компонентов, думаю что ты в курсе, есть готовые соотв.утилитки, "одетые" в компонентную оболочку ... невелика функциональность их, но дело они делают ...


 
andrey__   (2004-05-14 15:46) [18]

>Armen   (14.05.04 13:37) [9]

если можно то в двух словах объясни как выведется форма. Может что-то я не так написал

begin
if FindCmdLineSwitch("INSTALL",[],false) then
begin
  SvcMgr.Application.Initialize;
  SvcMgr.Application.CreateForm(TService1, Service1);
  SvcMgr.Application.Run;
end else
begin
  Forms.Application.Initialize;
  Forms.Application.CreateForm(TForm2, Form2);
  Forms.Application.Run;
end;
end.


Инсталировать получается но что дальше - служба не запускается.


 
andrey__   (2004-05-14 16:02) [19]

>Петров Денис ©   (14.05.04 13:51) [13]
>Для иллюстрации неработоспособности твое кода в принципе, а не >только под Win2k Server, предлагаю произвести эксперимент: >перезагрузись, получи свое сообщение об ошибке

Попытался сделал перегруз, после того как машина перегрузилась  сервис начал работать (узнал по звуковому сигналу который специально поставил), зашёл в систему форма есть и функционирует. Завершил сеанс - служба работает (по звуковому сигналу), вошёл под другим пользователем - форма видна. Но только это все в Windows 2000 Professional.


 
Петров Денис ©   (2004-05-14 16:16) [20]

> andrey__   (14.05.04 16:02) [19]

Сколько энергии, направленной в русло саморазрушения...

Говорят тебе, не пиши интерактивные сервисы без крайней необходимости. Хрен с ним, с моим мнением, у меня нет феньки мастера в анкете. Ну прислушайся ты хотя бы к Digitman"у, он ведь не зря говорит!

То, что у тебя где-то твое творение заработало, не дает тебе основания утверждать, что так буде везде, куда бы ты ни установил этот сервис. Более того, ты сам в об этом говоришь. Более того, можно написать список причин, почему этот сервис корректно работать не будет. Кроме того, интерактивные сервисы - это вымирающие представители своего рода.

Но нет, вместо того, чтобы решать задачу изменения параметров сервиса, ты решаешь проблему вывода формы под Win2k Server. Зачем?


 
Digitman ©   (2004-05-14 16:24) [21]


> Петров Денис ©   (14.05.04 16:16) [20]


нашего (вашего ?) "сервисного" полку прибыло, однако ... в лице разбирающихся спецов ... крайне приятно ...


 
Петров Денис ©   (2004-05-14 16:28) [22]

:)


 
andrey__   (2004-05-14 17:18) [23]

andrey__   (14.05.04 15:46) [18]     ???????


 
Петров Денис ©   (2004-05-14 17:26) [24]

> andrey__   (14.05.04 15:46) [18]

Если уж так неймется, внимательно посмотри на
if FindCmdLineSwitch("INSTALL",[],false),
на реализацию класса TService, и на свойства своего сервиса в оснастке MMC "Службы".

И процесс просмотра рекомендую сопроводить чтением книги "Программирование серверных приложений для MS Windows 2000". Сразу все станет кристалльно ясно.


 
Armen   (2004-05-14 17:31) [25]

>andrey__   (14.05.04 15:46) [18]
FindCmdLineSwitch("INSTALL",[],false) "INSTALL" замени на "configure", "setup" ... false на true.

Вообщем, если запускаем с ключами /setup, /configure, то запускается Forms.Application, если /install, /uninstall, /silent или вообще без ключа, то SvcMgr.Application.

Удачи.


 
andrey__   (2004-05-14 17:51) [26]

спасибо всем. если  не затруднит можете выслать мне свой пример (если есть).


 
Armen   (2004-05-14 17:55) [27]

Должно быть так

begin
if not FindCmdLineSwitch("setup", [], true) then
begin
 SvcMgr.Application.Initialize;
 SvcMgr.Application.CreateForm(TService1, Service1);
 SvcMgr.Application.Run;
end else
begin
 Forms.Application.Initialize;
 Forms.Application.CreateForm(TForm2, Form2);
 Forms.Application.Run;
end;
end.


 
sniknik ©   (2004-05-14 18:56) [28]

есть такая прога в дельфях scktsrvr, прога может быть и приложением и сервисом, нтерактивным сервисом, есть исходники ....

затрудняюсь сказать как она себя поведет в терминале, но судя по функционалу будет отображатся только на десктопе сервера (другого ей не нужно, а значит скорее всего не реализовано).



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.567 c
3-1083839947
Alina
2004-05-06 14:39
2004.05.30
Дата???


3-1084266514
Shura
2004-05-11 13:08
2004.05.30
ADOConnection. Не закрывается соединение с базой данных.


3-1084267048
Flamberg
2004-05-11 13:17
2004.05.30
Непонятная ошибка при закрытии ADOQuery


7-1082599978
LazyFox
2004-04-22 06:12
2004.05.30
Чтение текста из консоли


3-1084134130
Piter
2004-05-10 00:22
2004.05.30
DISTINCT?