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...