Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2010, 16:05   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию И как сервис и как программа одновременно(C++ => Delphi)

Всем доброго времени суток!

Вопрос как сделать свою программу сервисом, не прибегая к написанию отдельного exe(сервиса)?

На примере программы NetView, она может по нажатию кнопки в програме перезапуститься и стать сервисом. И с точностью до наоборот=)

Как такое реализовать у себя?

Вариант создания сервиса, упаковка пакерами, и толкание в ресурсы программы не подходит, хотя это вариант. Но только если писать сервис на WinAPI.

Чтобы проще понять, есть EXE программа. Просто запускаешь , это обычная программа. Запускаешь с параметрами /install , это сервис.

Писал бы ServiceApplication да уже довольно поздно. Слишком много придётся переделывать.

От сервиса всего-то надо запускать программу до того как залогинится пользователь.

Добавлено.

Ну покопался в сети, нашёл исходник на c++ вот реализация и как сервис и как программа.
Код:
/////////////////////////////////////////////////
//////////////////////////////////service support

int SvcStarted;
SERVICE_STATUS SvcStatus;
SERVICE_STATUS_HANDLE SvcHandle;
VOID WINAPI ServiceHandler(DWORD fdwControl)
{
if((fdwControl==SERVICE_CONTROL_STOP)||(fdwControl==SERVICE_CONTROL_SHUTDOWN))
 {
 SvcStatus.dwCurrentState=SERVICE_STOP_PENDING; 
 SetServiceStatus(SvcHandle,&SvcStatus);
 HaltMich(); 
 }
}

VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
SvcHandle=RegisterServiceCtrlHandler("CPULimit",&ServiceHandler);
ZeroMemory(&SvcStatus,sizeof(SvcStatus));
SvcStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
SvcStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
SvcStatus.dwCurrentState=SERVICE_RUNNING;SetServiceStatus(SvcHandle,&SvcStatus);
SvcStarted=1;
CPULimitMain();
SvcStatus.dwCurrentState=SERVICE_STOPPED;SetServiceStatus(SvcHandle,&SvcStatus);
}
SERVICE_TABLE_ENTRY ste[2]={{"CPULimit",&ServiceMain},{0,0}};


int WINAPI MyMain(void *)
{
if(mystrstr(GetCommandLine(),"/service"))
 {
 SvcStarted=0;
 StartServiceCtrlDispatcher(ste);
 while(!SvcStarted)Sleep(100);
 }else if(mystrstr(GetCommandLine(),"/q"))
 {
 HaltMich(); 
 }else if(mystrstr(GetCommandLine(),"/install"))
 {
 SC_HANDLE sch=OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
 if(sch)
  {
  char fpath[1100];GetModuleFileName(0,fpath+1,1023);fpath[0]='\"';fpath[1023]=0;
  strcat(fpath,"\" /service");
  SC_HANDLE sh=CreateService(sch,"CPULimit","CPULimit",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,fpath,0,0,0,0,0);
  if(sh)
   {
   CloseServiceHandle(sh);
   MessageBox(0,"CPULimit service installed. Start it using \"net start CPULimit\"","Install",MB_ICONINFORMATION);  
   }else MessageBox(0,"Can't create service","Install failed",MB_ICONERROR);  
  CloseServiceHandle(sch);
  }else MessageBox(0,"Can't open Service Control Manager","Install failed",MB_ICONERROR);
 }else if(mystrstr(GetCommandLine(),"/uninstall"))
 {
 SC_HANDLE sch=OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
 if(sch)
  {
  SC_HANDLE sh=OpenService(sch,"CPULimit",SERVICE_ALL_ACCESS);
  if(sh)
   {
   SERVICE_STATUS ss;QueryServiceStatus(sh,&ss);
   SERVICE_STATUS st;st.dwCurrentState=SERVICE_STOP_PENDING; 
   ControlService(sh,SERVICE_CONTROL_STOP,&ss);
   while(st.dwCurrentState==SERVICE_STOP_PENDING){QueryServiceStatus(sh,&st);Sleep(100);}
   if(!DeleteService(sh))MessageBox(0,"Can't delete service","Uninstall failed",MB_ICONERROR);
                    else MessageBox(0,"CPULimit service uninstalled","Uninstall",MB_ICONINFORMATION);     
   }else MessageBox(0,"Can't open CPULimit service","Uninstall failed",MB_ICONERROR);
  }else MessageBox(0,"Can't open Service Control Manager","Uninstall failed",MB_ICONERROR);
 }else 
 {
 CPULimitMain(); 
 }

ExitProcess(0);
return 0;
}
//---------------------------------------------------------------------------
Одна беда! Как это перевести на Delphi?
Очень похоже на реализацию сервиса через WinAPI, копался в сети везде одна и таже статья (Реализация NT сервисов средствами WinAPI), но неработоспособна.

Помогите с переводом! Пожалуйста!

Последний раз редактировалось Человек_Борща; 04.11.2010 в 16:15.
Человек_Борща вне форума Ответить с цитированием
Старый 04.11.2010, 16:09   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

>>> тыкнуть
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 04.11.2010, 16:18   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Благодарю и ставлю +! Пролил свет на проблему=) Иду разбираться что к чему!
Человек_Борща вне форума Ответить с цитированием
Старый 06.11.2010, 00:48   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

raxp

вот что-то получилось.

Но проблема!
Сервис устанавливается, но запускать не запускается! В службах состояние запуска "Запуск", а через некоторое время служба останавливается и программа закрывается.

Вот проект, можешь пожалуйста посмотреть в чём причина

p.S. и хотя бы чуток пояснить как работает сервис(комментариями в коде), а то непонять что и как работает=)

P.S.
Сообщение выше, редактировать нельзя, пишу новое.
Вложения
Тип файла: zip Application & service.zip (7.0 Кб, 46 просмотров)

Последний раз редактировалось Человек_Борща; 06.11.2010 в 09:50.
Человек_Борща вне форума Ответить с цитированием
Старый 07.11.2010, 16:44   #5
pupkinsoft
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 12
Вопрос

Доброго времени суток. Дабы не плодить аналогичную тему пишу тут. Написал приложение-сервис. сервис интерактивный(знаю что это ни есть хорошо). сервис делает старт/стоп/прорисовку иконки. Форма работает с bde.
если запускаю как прприложение, то все работает(в БД и пишет и читает), а если запускается как сервис то выдает ошибку.
код проекта:
Код:
if installing or startservice then begin
    Forms.Application.ShowMainForm:=False;
    SvcMgr.Application.Initialize;
    SvcMgr.Application.CreateForm(TDirMon, DirMon);
    SvcMgr.Application.CreateForm(TDirFrm, DirFrm);
    DForm.FromService:=True;
    SvcMgr.Application.Run;
  end else begin
    Forms.Application.ShowMainForm:=True; 
    Forms.Application.Initialize;
    Forms.Application.CreateForm(TDirFrm, DirFrm);
    DForm.FromService:=False;
    Forms.Application.Run;
  end;
//это мой первый сервис, если честно я даже не знаю можно ли в данной ситуации пользоваться БД. в общем просьба сильно не ругаться, а ткнуть носом как котенка
- В чем заключается многозадачность Windows?
- Она глючит и работает одновременно.
pupkinsoft вне форума Ответить с цитированием
Старый 09.12.2018, 13:23   #6
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
raxp
вот что-то получилось.
Скажите, чем закончилось?
tarakan1983 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выбрать из нескольких файлов одновременно ЦЕРЦЕЯ Microsoft Office Excel 0 20.01.2010 16:16
как подсоеденить колонки + наушники одновременно ? pavel42 Компьютерное железо 19 11.09.2009 12:58
Как вывести несколько одинаковых форм одновременно k1r1ch Общие вопросы Delphi 11 22.08.2009 18:07
Как зарегистрировать сервис Terran Общие вопросы Delphi 7 19.03.2009 13:10
Как копировать и одновременно переименовывать файлы? eriser Помощь студентам 4 17.01.2008 17:51