Einzelnen Beitrag anzeigen

nytaiceman

Registriert seit: 15. Dez 2005
Ort: Schweiz, Bern
58 Beiträge
 
Delphi XE3 Professional
 
#9

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 10:32
Der Ansatz mit einem zweiten Dienst zu arbeiten habe ich auch schon verfolgt.

UpdateService mit einem Timer versehen. Der Timer prüft regelmässig ob eine aktuellere Version des Arbeitsdienstes rumliegt und führt wenn nötig eine Aktualisierung durch:

Delphi-Quellcode:
// === Timer - UpdateCheck =====================================================
procedure TnwUpdateService.OnUpdateCheckTimer(Sender: TObject);
var
 ServiceManager: TServiceManager;
 oldName, NewName, UpdFile : String;
 tts : Integer;
begin
 newname := GetScriptDir +'\n_Server.old';
 oldname := GetScriptDir +'\n_Server.exe';
 updfile := GetScriptDir +'\n_DataServer\n_Server.exe';

// WriteLog('Updatechecker','Check on every 30s');

// = Check for local update
 if Fileexists(updfile) then
  begin
   WriteLog('Updatechecker','Found Update for "n_DataServer.exe"');
   ServiceManager := TServiceManager.Create;
   ServiceManager.Connect;
   ServiceManager.OpenServiceConnection('nwDataServer');

   with ServiceManager do begin
    // Stoping Service if it is running

     if ServiceRunning then
     begin WriteLog('Updatechecker','Trying to stop "n_DataServer.exe"'); StopService; end else WriteLog('Updatechecker','Is not running: "n_DataServer.exe"');

     // = Check repeatetly
      tts := 0;
      repeat
       tts := tts +1;
       sleep(1000)
      until (tts > 30) OR (Servicemanager.ServiceStopped);

     If Servicemanager.ServiceStopped then WriteLog('Updatechecker','was or is stopped: "n_DataServer.exe"') else
      begin
       WriteLog('Updatechecker','[ERROR] Could not stop "n_DataServer.exe"');
       exit;
      end;

    // = Replace current server.exe with the new one
     WriteLog('Updatechecker','Current Version was: ' +fGetFileVersion(oldname));
     WriteLog('Updatechecker','New Version is : ' +fGetFileVersion(updfile));

    // = Rename current server.exe to server.old
     if Fileexists(newname) then DeleteFile(newname);
     sleep(100);
     newName := ChangeFileExt(oldName, '.old');
     sleep(100);
     RenameFile(oldName, newName);
     sleep(100);

    // = Move update.exe to currentdir
     MoveFile(PChar(updfile),PChar(oldname));
     sleep(100);

    // = Start Service
     if ServiceStopped then begin
      WriteLog('Updatechecker','Trying to start "n_DataServer.exe"');
      StartService;
     end;

     sleep(100);

     // = Check repeatetly
      tts := 0;
      repeat
       tts := tts +1;
       sleep(1000)
      until (tts > 30) OR (Servicemanager.ServiceRunning);

     If Servicemanager.ServiceRunning then WriteLog('Updatechecker','Is running: "n_DataServer.exe"') else
      begin
       WriteLog('Updatechecker','[ERROR] Could not start "n_DataServer.exe"');
       exit;
      end;

   end;

   // = Free the instance
   FreeAndNil(ServiceManager);

  end;

end;
Im Anhang die ServiceManager.pas welche mal irgendwo gefunden habe.

Bitte nicht mit Prügel aufwarten, mein Code hat sicher Optimierungspotential...
Angehängte Dateien
Dateityp: pas ServiceManager.pas (4,0 KB, 8x aufgerufen)
Einfach ist nur einfach, wenn Einfach auch einfach ist!
Vermeintlich einfache Workarounds führen irgendwann zu Problemen!

Geändert von nytaiceman ( 8. Mär 2016 um 10:35 Uhr) Grund: Anhang ServiceManager.pas vergessen.
  Mit Zitat antworten Zitat