Re[5]: InnoSetup и установка/удаление, запуск/остановка службы, поделитесь скрип
От: fcuk_moder  
Дата: 26.06.12 16:45
Оценка:
Здравствуйте, Дон Педро, Вы писали:

ДП>Здравствуйте, fcuk_moder, Вы писали:


_>>
_>>if IsServiceInstalled(FullServiceName) then
_>>begin
_>>if IsServiceRunning(FullServiceName) = True then

_>>


ДП>Это встроенные в InnoSetup функции?


function OpenSCManager(lpMachineName, lpDatabaseName: String; dwDesiredAccess: DWORD): HANDLE;
  external 'OpenSCManagerA@advapi32.dll stdcall';
function OpenService(hServiceControlManager: HANDLE; lpServiceName: string; dwDesiredAccess: DWORD): HANDLE;
  external 'OpenServiceA@advapi32.dll stdcall';
function CloseServiceHandle(hServiceControlObject: HANDLE): Boolean;
  external 'CloseServiceHandle@advapi32.dll stdcall';
function QueryServiceStatus(hService: HANDLE; var ServiceStatus: SERVICE_STATUS): Boolean;
  external 'QueryServiceStatus@advapi32.dll stdcall';
function ControlService(hService: HANDLE; dwControl: DWORD; var ServiceStatus: SERVICE_STATUS): Boolean;
  external 'ControlService@advapi32.dll stdcall';
  
function OpenServiceManager(): HANDLE;
begin
  Result := 0;

  if UsingWinNT then
   begin
     Result := OpenSCManager('', 'ServicesActive', SC_MANAGER_ALL_ACCESS);
   end
end;
    
function IsServiceInstalled(ServiceName: String): Boolean;
var
    hServiceControlManager: HANDLE;
    hService              : HANDLE;
begin
  Result := False;
    
  hServiceControlManager := OpenServiceManager();
  if hServiceControlManager <> 0 then
   begin
     hService := OpenService(hServiceControlManager, ServiceName, SERVICE_QUERY_CONFIG);
     if hService <> 0 then
      begin
        Result := True;
        CloseServiceHandle(hService)
      end;
     CloseServiceHandle(hServiceControlManager)
  end
end;

function IsServiceRunning(ServiceName: String): Boolean;
var
  hServiceControlManager,
  hService              : HANDLE;
  Status                : SERVICE_STATUS;
begin
  Result := False;

  hServiceControlManager := OpenServiceManager();
  if hServiceControlManager <> 0 then
   begin
     hService := OpenService(hServiceControlManager, ServiceName, SERVICE_QUERY_STATUS);
     if hService <> 0 then
      begin
        if QueryServiceStatus(hService, Status) then
         begin
           Result := (Status.dwCurrentState = SERVICE_RUNNING)
         end;
        CloseServiceHandle(hService)
      end;
     CloseServiceHandle(hServiceControlManager)
  end
end;

function StopService(ServiceName: String): Boolean;
var
  hServiceControlManager,
  hService              : HANDLE;
  Status                : SERVICE_STATUS;
begin
  Result := False;

  hServiceControlManager := OpenServiceManager();
  if hServiceControlManager <> 0 then
   begin
     hService := OpenService(hServiceControlManager, ServiceName, SERVICE_STOP);
     if hService <> 0 then
      begin
        Result := ControlService(hService, SERVICE_CONTROL_STOP, Status);
        CloseServiceHandle(hService)
      end;
     CloseServiceHandle(hServiceControlManager)
  end
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.