Текущий архив: 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.52 MB
Время: 0.037 c