Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.05.2011, 00:38
KiL0z KiL0z вне форума
Прохожий
 
Регистрация: 27.05.2010
Сообщения: 23
Репутация: 10
Вопрос Как программно установить службу в windows?

Как программно установить службу в windows? Я понимаю, что есть такая утилита как SC (т.к. простой /install в 7ке не работает), которой легко можно в 7ке установить и запустить службу. Но мне нужно именно программно установить и запустить, причем что бы работало в 2k, XP и 7ке. Как это сделать? Хотя бы для 2k и XP?
Ответить с цитированием
  #2  
Старый 10.05.2011, 02:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,068
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Думаю, что вот это:
http://www.chami.com/tips/delphi/031598D.html
наведет тебя на правильные мысли.
Ответить с цитированием
  #3  
Старый 10.05.2011, 15:39
KiL0z KiL0z вне форума
Прохожий
 
Регистрация: 27.05.2010
Сообщения: 23
Репутация: 10
По умолчанию

Да, спасибо, направление показало.... Инсталляция и удаление сервисов под НТ (www.delphisources.ru)

PS: описание функций, может кому пригодится:
* OpenSCManager (и на MSDN)
* CreateService (и на MSDN)
* OpenService (и на MSDN)
* DeleteService (и на MSDN)
* CloseServiceHandle (и на MSDN)

Описание служб Windows и работы с ними - www.vsokovikov.narod.ru и функции работы с сервисами (службами) на MSDN - Service Functions
Ответить с цитированием
  #4  
Старый 10.05.2011, 16:54
KiL0z KiL0z вне форума
Прохожий
 
Регистрация: 27.05.2010
Сообщения: 23
Репутация: 10
По умолчанию

Так накатал такой вот проект - http://zalil.ru/31009630
Как правильно создавать новую службу в 7ке (в 2k и XP работает) , а то не хочет устанавливаться и все тут (даже с админскими правами (помагает только предварительная установка для exe-шника совместимости с WinXP), если конечно ручками не ставить через утилиту SC) ?

PS код проекта:
Код:
program TestService;

uses
  SvcMgr,
  Forms,
  SysUtils,
  Windows,
  Types,
  WinSvc,
  UnitMyService in 'UnitMyService.pas' {MyService: TService},
  UnitAboutForm in 'UnitAboutForm.pas' {AboutForm1},
  UnitDataModule in 'UnitDataModule.pas' {DataModule1: TDataModule};

const
  NameService = 'MyService';

{$R *.RES}

function CreateNTService(ExecutablePath, ServiceName: string): boolean;
var
  hNewService, hSCMgr: SC_HANDLE;
  FuncRetVal: Boolean;
begin
  FuncRetVal := False;
  hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
  if (hSCMgr <> 0) then begin
    hNewService := CreateService(hSCMgr, PChar(ServiceName), PChar(ServiceName),
      STANDARD_RIGHTS_REQUIRED, SERVICE_WIN32_OWN_PROCESS,
      SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
      PChar(ExecutablePath), nil, nil, nil, nil, nil);
    CloseServiceHandle(hSCMgr);
    if (hNewService <> 0) then
      FuncRetVal := true
    else
      FuncRetVal := false;
  end;
  CreateNTService := FuncRetVal;
end;

function DeleteNTService(ServiceName: string): boolean;
var
  hServiceToDelete, hSCMgr: SC_HANDLE;
  RetVal: LongBool;
  FunctRetVal: Boolean;
begin
  FunctRetVal := false;
  hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
  if (hSCMgr <> 0) then begin
    hServiceToDelete := OpenService(hSCMgr, PChar(ServiceName),
      SERVICE_ALL_ACCESS);
    RetVal := DeleteService(hServiceToDelete);
    CloseServiceHandle(hSCMgr);
    FunctRetVal := RetVal;
  end;
  DeleteNTService := FunctRetVal;
end;

function Installing: Boolean;
begin
  if FindCmdLineSwitch('INSTALL',['-','\','/'], True) then
    Result := CreateNTService(ParamStr(0), NameService)
  else
    if FindCmdLineSwitch('UNINSTALL',['-','\','/'], True) then
      Result := DeleteNTService(NameService)
    else
      Result := False;
end;

function StartService: Boolean;
var
  Mgr, Svc: Integer;
  UserName, ServiceStartName: string;
  Config: Pointer;
  Size: DWORD;
begin
  Result := False;
  Mgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if (Mgr <> 0) then begin
    Svc := OpenService(Mgr, PChar(NameService), SERVICE_ALL_ACCESS);
    Result := Svc <> 0;
    if Result then begin
      QueryServiceConfig(Svc, nil, 0, Size);
      Config := AllocMem(Size);
      try
        QueryServiceConfig(Svc, Config, Size, Size);
        ServiceStartName := PQueryServiceConfig(Config)^.lpServiceStartName;
        if CompareText(ServiceStartName, 'LocalSystem') = 0 then
          ServiceStartName := 'SYSTEM';
      finally
        Dispose(Config);
      end;
      CloseServiceHandle(Svc);
    end;
    CloseServiceHandle(Mgr);
  end;
  if Result then begin
    Size := 256;
    SetLength(UserName, Size);
    GetUserName(PChar(UserName), Size);
    SetLength(UserName, StrLen(PChar(UserName)));
    Result := CompareText(UserName, ServiceStartName) = 0;
  end;
end;

begin
  if Installing or StartService then begin
    SvcMgr.Application.Initialize;
    SvcMgr.Application.CreateForm(TAboutForm1, AboutForm1);
    SvcMgr.Application.CreateForm(TMyService, MyService);
    SvcMgr.Application.CreateForm(TDataModule1, DataModule1);
    SvcMgr.Application.Run;
  end
  else begin
    Forms.Application.ShowMainForm := False;
    Forms.Application.Initialize;
    Forms.Application.CreateForm(TAboutForm1, AboutForm1);
    Forms.Application.CreateForm(TMyService, MyService);
    Forms.Application.CreateForm(TDataModule1, DataModule1);
    Forms.Application.Run;
  end;
  DataModule1.EnableTrayIcon := True;
end.
Форма AboutForm1 пустая, просто для примера.
На DataModule1 лежит TrayIcon и контекстное меню для него, вызывающее AboutForm1 и завершающее приложение.

Последний раз редактировалось KiL0z, 10.05.2011 в 17:05.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter