Door de updatefunctie in het programma µTorrent (http://www.utorrent.com/) kwam ik op het idee om een programma van mezelf uit te rusten met een snelle & eenvoudige updatefunctie. Het idee is als volgt: mijn programma bestaat uit één exefile waar alle functionaliteit in zit. In het programma zit een updatecontrole, die het versienummer van het draaiende programma vergelijkt met een nummer dat wordt uitgelezen vanaf een vaste url. Op deze manier weet het programma of er een update beschikbaar is.
Wanneer de gebruiker er voor kiest om de huidige versie te updaten, worden de volgende stappen uitgevoerd:
Zijn er mensen die iets soortgelijks hebben gedaan (evt. ook in Delphi) en die er een betere manier voor denken te hebben? Zie ik dingen over het hoofd die de boel in de war kunnen laten lopen?
Hier de belangrijkste delen code die ik heb gebruikt:
Wanneer de gebruiker er voor kiest om de huidige versie te updaten, worden de volgende stappen uitgevoerd:
- De update wordt gedownload en opgeslagen als "programma.update"
- Het gedownloade bestand wordt gecontroleerd (grootte + checksum)
- Het draaiende programma hernoemt zichzelf van "programma.exe" -> "programma.old"
- Het draaiende programma hernoemt "programma.update" -> "programma.exe"
- Het draaiende programma sluit zichzelf af & start "programma.exe"
- De nieuwe versie ziet "programma.old" staan en verwijdert dit bestand
- Klaar!
Zijn er mensen die iets soortgelijks hebben gedaan (evt. ook in Delphi) en die er een betere manier voor denken te hebben? Zie ik dingen over het hoofd die de boel in de war kunnen laten lopen?
Hier de belangrijkste delen code die ik heb gebruikt:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| // Deze procedure uitvoeren wanneer de gebruiker wil updaten // en de update is gedownload & gecontroleerd procedure updateCurrentExecutable(); begin if (FileExists('programma.update')) then begin RenameFile('programma.exe', 'programma.old'); RenameFile('programma.update', 'programma.exe'); end; end; // Deze procedure altijd uitvoeren bij de start van het programma procedure deleteOldVersion(); begin if (FileExists('programma.old')) then DeleteFile('programma.old'); end; // Deze code staat in het .dpr bestand (de main loop van het programma) Application.Initialize; Application.Title := 'Programma'; Application.CreateForm(TfrmProgrammaMain, frmProgrammaMain); // In de volgende regel wordt de main loop gestart Application.Run; // Als we hier zijn aangekomen, is het programma 'afgesloten' // FRestartApplication is een globale flag die op True wordt gezet // wanneer een update is gedownload & gecontroleerd if (FRestartApplication) then begin si.cb := sizeof(STARTUPINFO); CreateProcess('programma.exe', nil, nil, nil, FALSE, 0, nil, nil, si, pi); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); end; |