VirusKill
Сайт для всех, кто знает, как включить компьютер. Программирование и веб-кодинг, взлом программ и угон учёток, создание вирусов и борьба с ними, ключи и кряки. Программы, книги, статьи, советы и обмен опытом.
[ ]

Поделиться:
Поиск:  
[ Меню сайта: Форум · Гостевая книга · Софт · Музыка · Юмор · Ссылки · Поиск ]
[ Меню форума: Разделы · Новое · RSS · В яндекс · Участники · Правила ]
Страница 1 из 11
Модератор форума: ZveR 
Форум » Программирование » Delphi / Pascal » Создаём свою службу Windows (Delphi 7)
Создаём свою службу Windows
[Offline]DiffiT Дата: Четверг, 16.02.2012, 21:19 | Сообщение # 1

[ Мужык ]

Старший криведко
Группа: Админы
Сообщений: 1879
Репутация: 16
Пример службы на Delphi (WinAPI)

Чтобы создать службу на Delphi, достаточно нажать F1, набрать TService и прочитать раздел using tservice. Но можно написать службу и на более низком уровне WinAPI, чему и посвящена статья.

Поместить в файл с расширением dpr, например, srv1.dpr.
Установка службы - srv1.exe /Install
Удаление службы - srv1.exe /Delete
Имя службы - "Sample_Srv"
Выполняемое действие - периодический звуковой сигнал beep()
Источник - кажется, эта статья
http://ishodniki.ru/art/artshow.php?cat=1&id=90&show=delphi
"Написание сервисов Windows NT на WinAPI"

Служба будет периодически выдавать окно Предупреждения.
Чтобы показывалось это окно сообщения, установите
Мой компьютер-Правый клик-Управление-Службы и приложения-Службы (англ. Services)
В списке выберите свою службу (в данном случае Sample_Srv).
Свойства - закладка Вход в систему - установить флажок
"Разрешить взаимодействие с рабочим столом" (англ. "Interact with desktop").

Code

program Project1;

uses
  Windows, WinSvc, SysUtils;

const c_ServiceName = 'Sample_Srv';

var DispatchTable : array [0..1] of _SERVICE_TABLE_ENTRYA;
var sst : SERVICE_STATUS;
var sstHandle : SERVICE_STATUS_HANDLE;

///////////////////////////////////////////////////////////////////////
procedure SetServiceStatus1;
begin
   if not SetServiceStatus(sstHandle,sst) then
   RaiseLastOSError;
end;
///////////////////////////////////////////////////////////////////////
procedure ServiceCtrlHandler(Opcode : Cardinal);stdcall;
begin
  case Opcode of

   SERVICE_CONTROL_STOP:
    begin
     sst.dwWin32ExitCode:=0;
     sst.dwCurrentState := SERVICE_STOPPED;
     sst.dwCheckPoint   :=0;
     sst.dwWaitHint     :=0;
     SetServiceStatus1;
     exit;
    end;

   SERVICE_CONTROL_INTERROGATE : ;
  end;

  SetServiceStatus1;
end;

///////////////////////////////////////////////////////////////////////
procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall;
begin
   sst.dwServiceType      := SERVICE_WIN32;
   sst.dwCurrentState     := SERVICE_START_PENDING;
   sst.dwControlsAccepted := SERVICE_ACCEPT_STOP;
//    or SERVICE_ACCEPT_PAUSE_CONTINUE;
   sst.dwWin32ExitCode           := 0;
   sst.dwServiceSpecificExitCode := 0;
   sst.dwCheckPoint              := 0;
   sst.dwWaitHint                := 0;

   sstHandle :=
            RegisterServiceCtrlHandler(c_ServiceName,@ServiceCtrlHandler);

   if sstHandle = 0 then RaiseLastOSError;

    sst.dwCurrentState :=SERVICE_RUNNING;
    sst.dwCheckPoint   :=0;
    sst.dwWaitHint     :=0;

    SetServiceStatus1;

   //ОСНОВНОЙ КОД ПРОГРАММЫ  
   repeat
    sleep(3000);
    beep();
    MessageBox(0, 'Проверка службы', 'sample_srv', 0);
    //Чтобы показывалось окно сообщения, установите  
    //Мой компьютер-Правый клик-Управление-Службы и приложения-Службы (англ. Services)  
    //В списке выберите свою службу.  
    //Свойства - закладка Вход в систему - установить флажок  
    //"Разрешить взаимодействие с рабочим столом" (англ. "Interact with desktop").  
   until sst.dwCurrentState = SERVICE_STOPPED;
end;

///////////////////////////////////////////////////////////////////////

var schService, schSCManager: SC_HANDLE;
var binExe: pchar;
begin

  if ParamStr(1)='/Install' then begin
    binExe:=pchar(ParamStr(0));

  ///////////////////////////// Установка службы

     schSCManager := OpenSCManager(
     nil,                    // local machine
     nil,                    // ServicesActive database
     SC_MANAGER_ALL_ACCESS);  // full access rights

     if schSCManager=0 then RaiseLastOSError;

     schService := CreateService(
         schSCManager,              // SCManager database
         c_ServiceName,               // name of service
         c_ServiceName,           // service name to display
         SERVICE_ALL_ACCESS,        // desired access
         SERVICE_WIN32_OWN_PROCESS, // service type
         SERVICE_DEMAND_START,      // start type
         SERVICE_ERROR_NORMAL,      // error control type
         binExe,        // service's binary
         nil,                      // no load ordering group
         nil,                      // no tag identifier
         nil,                      // no dependencies
         nil,                      // LocalSystem account
         nil);                     // no password

      if schService=0 then
        RaiseLastOSError;

      if not CloseServiceHandle(schService) then
        RaiseLastOSError;

        exit;

  ///////////////////////////// Удаление службы

    end else if ParamStr(1)='/Delete' then begin

     schSCManager := OpenSCManager(
     nil,                    // local machine
     nil,                    // ServicesActive database
     SC_MANAGER_ALL_ACCESS);  // full access rights

     if schSCManager=0 then RaiseLastOSError;

      schService := OpenService(
         schSCManager,       // SCManager database
         c_ServiceName,       // name of service
         SERVICE_ALL_ACCESS);            // only need DELETE access

     if schService = 0 then
       RaiseLastOSError;

     if not DeleteService(schService) then
       RaiseLastOSError;

     if not CloseServiceHandle(schService) then
       RaiseLastOSError;
     exit;

end;
  ///////////////////////////// Запуск службы
  DispatchTable[0].lpServiceName:=c_ServiceName;
  DispatchTable[0].lpServiceProc:=@ServiceProc;

  DispatchTable[1].lpServiceName:=nil;
  DispatchTable[1].lpServiceProc:=nil;

  if not StartServiceCtrlDispatcher(DispatchTable[0]) then
    RaiseLastOSError;

end.


Автор статьи: romix
Последняя редакция №5 от 08.11.07
Утянуто с http://kb.mista.ru/article.php?id=580

Проверено и работает :)

Тот, у кого есть мозги и руки,
Никогда не пропадёт от голода и скуки.
 
Форум » Программирование » Delphi / Pascal » Создаём свою службу Windows (Delphi 7)
Страница 1 из 11
Поиск:

© 2008-2012 VirusKill Team
Rambler's Top100
Хостинг от uCoz