Forum: PC-Programmierung Selbst-Update einer Applikation


von Frank (Gast)


Lesenswert?

Ich arbeite an einer Client-Server-Lösung zur Datenerfassung. Damit man 
nicht bei jedem Update der Clientsoftware - was ja gerade am Anfang 
häufiger vorkommt - stundenlang mit dem USB-Stick von Client zu Client 
hirscht, habe ich eine Auto-Update-Methode eingebaut.

Dabei wird der Ordner mit der neuen Applikation und sämtlichen DLLs am 
Server zu einem ZIP-Archiv gepackt, in "Häppchen" zu je 1 MB geschnitten 
und in einer Tabelle der ohnehin verwendeten MySQL-Datenbank 
untergebracht (Version, BlockNr, BlockAnz, Daten). Die Clients prüfen in 
gewissen Abständen, ob es ein Update mit einer neueren Version als die 
eigene gibt. Wenn ja, lädt der Client die einzelnen Blocks herunter, 
fügt sie wieder zusammen und entpackt sie in ein Verzeichnis innerhalb 
des eigenen, mit dem Namen "Update". Das klappt Alles hervorragend.

Und genau jetzt kommt das Problem. Eine laufende Applikation kann sich 
nicht selber löschen und ersetzen, ebensowenig in Benutzung befindliche 
DLLs. Ich habe da bisher immer noch eine zusätzliche Anwendung 
gebraucht, die, nachdem sich die Hauptanwendung beendet hat, die 
aktuellen Dateien gegen die neuen ersetzt und die neue Applikation 
startet. Das funktioniert, scheint mir aber umständlich. Gibt es dafür 
eine cleverere Lösung?

Ich habe auch mal mit Batchdateien und Shellscripten "herumgemacht", hat 
im Prinzip funktioniert, aber nicht immer. Ein Problem war z.B., dass es 
unter Windows anscheinend ein (unterschideliches) Weilchen dauert, bevor 
die Dateien einer gerade beendeten Applikation nicht mehr 
schreibgeschützt sind. Tips?

Frank

von Marcus B. (raketenfred)


Lesenswert?

ich weiß nicht genau wie es geht, aber theoretisch kannst du deine 
anwendung in dem ram legen- und somit von der exe etc abkoppeln, sodass 
diese nicht mehr schreibgeschützt sind- dann die Updateroutine starten 
und gut

aber ich kenne viele Programme, die auch mit einer 2. exe Datei updaten, 
weil es einfacher und flotter ist, einfach mal an den zkm aufwand denken 
;-) (der hat leider viel mehr zu sagen als die eleganz :( )

mfg

von Bastian N. (bastian_n)


Lesenswert?

Ich hab das Problem auch immer so gelöst. Das Update wurde 
heruntergeladen und zusätzlich noch ein Programm, dass nach dem Download 
und der Beendigung des zu updatenden Programms gestartet wird. Das 
kleine Programm wartet, bis alle Dateien ersetzt wurden beendet sich 
dann. Das andere Programm löscht dann den Updater. Ist etwas 
umständlich, aber funktioniert immer.

von Peter (Gast)


Lesenswert?

Das hilft aber alles nichts, wenn man nicht als Admin arbeitet. Und als 
Software entwickler sollte man schon darauf achten das das Programm auch 
mit user rechten arbeitet. Und da kann man keine Schreibrechte in einem 
Programm verzeichniss. Also scheidet schon mal ein Selbstupdate aus. 
Wenn ein update auch von einem normalen Anwender gemacht werden soll, 
dann muss man es über eine Update-Dienst machen. Dieser prüft 
regelmässig ob ein update gemacht werden muss. Eventuell kann auch die 
Anwendung das neue Zip laden und dem Dienst übergeben (z.b. im Temp 
verzeichnis) Der Dienst wartet dann einfach auf das beenden der 
Anwendung und tauscht die Datein aus. Jetzt bleibt nur noch das Problem 
zum ausauschen von den Dienst. Wenn er nur aus einer exe besteht kann 
man diese vorher umbenenne und dann die neue exe hinlegen. Nach dem 
restart des Dienstes sollte dann die neue Version laufen. Ja das 
umbenenen geht auch wenn die Anwendung läuft.

von Peter (Gast)


Lesenswert?

nachtrag:
In Windows7 hat eine Anwendung im normalfall auch keine Schreibrechte in 
dem Program verzeichnis, selbst wenn der User ein Admin ist. Sie muss 
explizit als Administrator gestartet werden damit das geht. Oder die UAC 
muss deaktiviert werden.

von Arc N. (arc)


Lesenswert?

Peter schrieb:
> Das hilft aber alles nichts, wenn man nicht als Admin arbeitet. Und als
> Software entwickler sollte man schon darauf achten das das Programm auch
> mit user rechten arbeitet. Und da kann man keine Schreibrechte in einem
> Programm verzeichniss. Also scheidet schon mal ein Selbstupdate aus.
> Wenn ein update auch von einem normalen Anwender gemacht werden soll,
> dann muss man es über eine Update-Dienst machen. Dieser prüft
> regelmässig ob ein update gemacht werden muss. Eventuell kann auch die
> Anwendung das neue Zip laden und dem Dienst übergeben (z.b. im Temp
> verzeichnis) Der Dienst wartet dann einfach auf das beenden der
> Anwendung und tauscht die Datein aus. Jetzt bleibt nur noch das Problem
> zum ausauschen von den Dienst. Wenn er nur aus einer exe besteht kann
> man diese vorher umbenenne und dann die neue exe hinlegen. Nach dem
> restart des Dienstes sollte dann die neue Version laufen. Ja das
> umbenenen geht auch wenn die Anwendung läuft.


Andere Möglichkeiten
ClickThrough (gehört zum Windows Installer XML toolset)
http://blogs.msdn.com/b/robmen/archive/2005/11/08/490448.aspx
http://wix.sourceforge.net/clickthrough.html

oder sieht sich an/nutzt den Updater von Google
(je nach Standpunkt sieht man, wie es nicht gehen sollte:
Die gesamte Anwendung ala Chrome liegt unterhalb des Benutzerprofils...)
http://omaha.googlecode.com/svn/wiki/OmahaOverview.html
http://code.google.com/p/omaha/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.