|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как программно установить службу в windows?
Как программно установить службу в windows? Я понимаю, что есть такая утилита как SC (т.к. простой /install в 7ке не работает), которой легко можно в 7ке установить и запустить службу. Но мне нужно именно программно установить и запустить, причем что бы работало в 2k, XP и 7ке. Как это сделать? Хотя бы для 2k и XP?
|
#2
|
|||
|
|||
|
#3
|
|||
|
|||
Да, спасибо, направление показало.... Инсталляция и удаление сервисов под НТ (www.delphisources.ru)
PS: описание функций, может кому пригодится: * OpenSCManager (и на MSDN) * CreateService (и на MSDN) * OpenService (и на MSDN) * DeleteService (и на MSDN) * CloseServiceHandle (и на MSDN) Описание служб Windows и работы с ними - www.vsokovikov.narod.ru и функции работы с сервисами (службами) на MSDN - Service Functions |
#4
|
|||
|
|||
Так накатал такой вот проект - 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. На DataModule1 лежит TrayIcon и контекстное меню для него, вызывающее AboutForm1 и завершающее приложение. Последний раз редактировалось KiL0z, 10.05.2011 в 17:05. |