Domanda

cerco di seguire http://edn.embarcadero.com/article/28604 per il riavvio Interbase. Ecco il codice:

program IBRestart;

{$APPTYPE CONSOLE}

uses
  SysUtils, winsvc;

var
  vManager, vService: SC_Handle;
  vtmp: TServiceStatus;
begin
  vManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if vManager > 0 then
  begin
    vService := OpenService(vManager, 'InterBaseGuardian', SERVICE_START or SERVICE_STOP);
    if vService = 0 then           // vService is always 0 here, why ?
      CloseServiceHandle(vManager)
    else
    if ControlService(vService, SERVICE_CONTROL_STOP, vTmp) and
       QueryServiceStatus(vService, vTmp) and
       (vTmp.dwCurrentState = SERVICE_STOPPED) then
    begin
      WriteLn('Success');
    end;
  end;
end.

Ho notato che il servizio è elencato come "gds_db InterBase 2009 Guardian" finestra di dialogo nei servizi. Ho provato diverse varianti di questo come argomento per OpenService senza successo ... Eventuali suggerimenti?

Modifica Lista net start il servizio come InterBase 2009 Guardiano gds_db e InterBase 2009 Server gds_db

RaiseLastOSError restituire questo in entrambi i casi: Progetto IBRestart.exe ha sollevato un'eccezione di classe EOSError con il messaggio 'Errore di sistema. Codice:. 1060. Il servizio specificato non esiste come un servizio installato'

Quindi vService è sempre 0 nel codice sopra. Ho anche cercare di fermare un altro servizio come temi e funziona in realtà. Può essere gli spazi nella stringa che deve essere speciale gestito? Ho cercato di chiudere Amministrazione di IIS e restituito lo stesso messaggio di errore come Interbase fare.

È stato utile?

Soluzione

Questo è il file batch che uso per il riavvio InterBase 2007, ti mostra che su alcune macchine i nomi dei servizi hanno uno spazio supplementare in loro :

rem jpl: 20071015 - on some machines, the guardian service has an extra space
net stop "InterBase 2007 Guardian gds_db"
net stop "InterBase 2007 Guardian gds_db "
net stop "InterBase 2007 Server gds_db"
net start "InterBase 2007 Guardian gds_db"
net start "InterBase 2007 Guardian gds_db "
pause

Si noti che ho arrestare e avviare il Guardian due volte; a volte non reagisce entro la fermata del servizio / inizio periodo di timeout. Ho anche arresto il servizio InterBase specifico; è difficilmente necessaria, ma ho avuto un periodo in cui il servizio di guardiano si è fermata, ma il servizio InterBase non si fermò.

- Jeroen

Altri suggerimenti

Forse il nome del servizio è sbagliato o non si hanno abbastanza diritti (necessità di avviare come amministratore)? Difficile da dire, senza alcun suggerimento di quanto è andato storto.

Si prega di verificare se una delle chiamate segnalare un errore (codice di ritorno = 0) e controllare che cosa l'errore è chiamando RaiseLastOSError o SysErrorMessage (GetLastError) in quel caso. Assicuratevi anche di controllare gli errori sulle altre chiamate. Si prega di aggiornare la tua domanda con tutte le nuove informazioni che porta.

e cambiare il tuo assegno da> 0 a <> 0. 0 errore di segnali, niente altro successo. Una maniglia può essere un numero negativo. E aggiungere un po try..finally. E non dimenticate il codice per avviare di nuovo il servizio :) Inoltre si potrebbe prendere un po 'prima che il servizio cambia stato dopo una chiamata al ControlService così QueryServiceStatus potrebbe restituire SERVICE_STOP_PENDING per un po' prima di poter realmente fermarsi. Il codice dovrebbe conto. Vedere qui per un esempio.

program IBRestart;

{$APPTYPE CONSOLE}

uses
  SysUtils, winsvc;

var
  vManager, vService: SC_Handle;
  vtmp: TServiceStatus;
begin
  vManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if vManager <> 0 then
  begin
    try
      vService := OpenService(vManager, 'InterBaseGuardian', SERVICE_START or SERVICE_STOP);
      if vService = 0 then      // vService is always 0 here, why ?
        RaiseLastOSError;       // This will give a hint why !
      else
        try
          Win32Check(ControlService(vService, SERVICE_CONTROL_STOP, vTmp));
          Win32Check(QueryServiceStatus(vService, vTmp));
          if vTmp.dwCurrentState = SERVICE_STOPPED then   // This might also be SERVICE_STOP_PENDING
            WriteLn('Success')
          else
            WriteLn('Failure');
        finally
          CloseServiceHandle(vService);
        end;
    finally
      CloseServiceHandle(vManager);
    end;
  end
  else
    RaiseLastOSError;
end.

Guardiano è un servizio che riavviare il Ibserver.exe quando cadono: e 'stato utile per il vecchio sistema operativo o quando si esegue ibserver come applicazione. Se si utilizza ibserver come un servizio, è possibile gestire questo direttamente al servizio (Guardian è inutile in questo caso).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top