Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi update eures eigenen Programms: vorgehensweise (https://www.delphipraxis.net/90812-update-eures-eigenen-programms-vorgehensweise.html)

Ajin 24. Apr 2007 10:33


update eures eigenen Programms: vorgehensweise
 
Hallo Delphianer,

Sicherlich aben viele unter euch schon Programme geschrieben und auch veröffentlicht. Natürlich wird die Software auch gewartet und unterliegt einigen Versionsänderungen. Nun ich hab da eine kleine Anwendung bestehend aus einem .exe File und 3 DLLs als Innosetup im Internet zum download angeboten.
Dieses Programm ist in der Testphase und mein kleiner Nutzerkreis (bestehend aus 12 Leuten) testen die Software täglich. Wenn ich ne neue Version gebastelt habe wird diese wieder als Innosetup verpackt und hochgeladen. Bzw wird nur das .exe File hochgeladen oder eine geänderte DLL.
Dann geht ne Foren-Nachricht an alle raus und die Leute laden sich die aktuelle Version herunter.

Das find ich irgendwie uncool. Toll wäre es doch, wenn mein Programm nach dem Start in ner online Tabelle nachschaut, ob eine neue Version verfügbar ist und den nutzer dann mit einem "Versionsupdate verfügbar" Dialog nervt.
Optionen wären:

-herunterladen und manuell installieren
-herunterladen und automatisch installierenA
-jetzt nicht herunterladen (später erinnern)

Nun wie löst ihr soetwas? Ich habe mir das so vorgestellt und dabei treten dann einige Fragen auf.

(1) Anwendung registriert Versionsupdate.
(2) Nutzer möchte das update herunterladen und automatisch installieren
(3) eine versteckte TWebBrowser Komponente navigiert die update URL an (z.B. www.meineseite.de/neuedatei.exe)
und dann müsste ja der speichern Dialog des Browsers erscheinen.
(4) Mit der "ondownloadComplete" Methode kann ich dem user signalisieren, dass der download abgeschlossen ist.


(?) Tja was dann? Solange meine Anwendung läuft kann ich sie ja nicht mit den neuen Files ersetzen? Soll ich noch eine andere Anwendung schreiben, welche nur für das Aktualiseren der Hauptanwendung zuständig ist?


Nach dem Aktualisierungsvorgang müsste das update Proggie:

- Update Tabelle wieder zurücksetzen (es ist keine neuere Version mehr verfügbar)
- die Hauptanwendung wieder starten und sich selbst beenden

Wäre das okay oder viiiel zu umständlich?

zecke 24. Apr 2007 10:38

Re: update eures eigenen Programms: vorgehensweise
 
:hi:

Ich würde dir eine *.bat-Datei empfehlen, die zuerst dein Programm schließt - die Files austauscht und dann dein Programm wieder startet. Bei Spybot S&D funktioniert das wunderbar (wenn ich mich nicht irre).


edit: Zu bat-Dateien gab es kürzlich einen Thread. Zum Umgang mit diesen, trotzdem hier ein Link: wuppdi
edit2: fehlerkorrektur

Schubi 24. Apr 2007 10:47

Re: update eures eigenen Programms: vorgehensweise
 
Bat-Dateien sinf recht praktisch für sowas!
Die kannst du z.B. direkt von deiner Homepage downloaden und lokal ausführen.

Delphi-Quellcode:
batchname := Pfad_Lokal+'Update.bat';

FileSetAttr(Pfad_Lokal+'TTS_Starter.exe', 0);
batchfile := TStringList.Create;
with batchfile do
begin
  try
    Add('@Echo off');
    Add(':Label1');
    Add('del "'+Pfad_Lokal+File1+'"'); //Löscht die alte Datei
    Add('copy "' + Pfad_Netz + File1 + '" "' + Pfad_Lokal + File1 + '"'); //Kopiert die Neue
    Add('if not Exist "' + Pfad_Lokal + File1 + '" goto Label1'); //Prüft, ob sie vorhanden ist
    Add(Pfad_Lokal + File1); //Startet sie
    Add('del ' + batchname); //und löscht die BAT
    SaveToFile(batchname);
    ChDir(ExtractFilePath(Application.ExeName));
    WinExec(PChar(batchname), SW_HIDE); //BAT starten
  finally
    batchfile.Free;
  end;
  Halt; //Programm beenden
end;

manfred_h 24. Apr 2007 10:57

Re: update eures eigenen Programms: vorgehensweise
 
Hallo

schau Dir doch diese Komponente an:
http://www.tp-soft.de/index.php?T=rema&P=produkte

damit dannst Du das alles machen.
Habe diese bei mir imeinsatz und das ganze funktioniert einwandfrei.

Shalom
Manfred

Mazel 24. Apr 2007 11:37

Re: update eures eigenen Programms: vorgehensweise
 
Als ob jemand meine Gedanken lesen kann, ich hatte auch demnächst vor diese Frage zu stellen. :wink:

Eine *.bat Datei scheint hier wirklich praktisch, aber wie kann man am einfachsten im Internet nach einem Update schauen? Ich habe mir vorgestellt eine html Datei hochzuladen und in ihr befindet sich ein Inhalt, vtl. die Build Nummer. Das Programm läd die html Datei und vergleicht die Buildnummern (neue und alte), wenn eine neuere vorhanden ist, dann die neue Datei laden. Nur wie geht das am einfachsten?

Gruß
Mazel

Khabarakh 24. Apr 2007 11:44

Re: update eures eigenen Programms: vorgehensweise
 
So kompliziert würde ich es nicht machen. Du legst einfach alle Informationen, die du brauchst, binär in eine Datei auf dem Server ab (muss ja nicht menschenlesbar sein) und lädst diese dann nach Bedarf herunter. Das wäre der allereinfachste Weg; wenn du es ein wenig komplizierter machen willst, benutzt du statt dem Binärformat eine XML-Datei, damit du ihren Inhalt leicht auch auf deiner Webseite anzeigen kannst.

Schubi 24. Apr 2007 12:07

Re: update eures eigenen Programms: vorgehensweise
 
Delphi-Quellcode:
//Auslesen der Versionsnummer aus einer Datei
type
  T_Version = Record
    Hauptversion, Nebenversion, Ausgabe, Build : Integer;
  end;

function GetVersion(Datei : String): T_Version;
var
  VerInfoSize: DWORD;
  VerInfo: Pointer;
  VerValueSize: DWORD;
  VerValue: PVSFixedFileInfo;
  Dummy: DWORD;

begin
  Result.Hauptversion := 0;
  Result.Nebenversion := 0;
  Result.Ausgabe := 0;
  Result.Build := 0;

  If FileExists(Datei) Then begin
    VerInfoSize := GetFileVersionInfoSize(PChar(Datei), Dummy);
    if VerInfoSize = 0 then Exit;
    GetMem(VerInfo, VerInfoSize);
    GetFileVersionInfo(PChar(Datei), 0, VerInfoSize, VerInfo);
    VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
    with VerValue^ do
    begin
      Result.Hauptversion := (dwFileVersionMS shr 16);
      Result.Nebenversion := (dwFileVersionMS and $FFFF);
      Result.Ausgabe := (dwFileVersionLS shr 16);
      Result.Build := (dwFileVersionLS and $FFFF);
    end;
    FreeMem(VerInfo, VerInfoSize);
  end
  else begin
    Result.Hauptversion := 0;
    Result.Nebenversion := 0;
    Result.Ausgabe := 0;
    Result.Build := 0;
  end;
end;
Dann musst du nur noch die aktuelle Version deiner EXE in eine Datei schreiben(z.B. binär)
Diese Datei lädst du runter, vergleichst den Inhalt der Datei(also die Versionsnummer) mit der Versionsnummer die die Prozedur oben für deine lokale EXE ausgibt.

Dann kannst du die EXE runterladen (in ein Update-Verzeichnis oder so) und mit der Batch-Datei aktualisierst du das Ganze.

Noch Fragen? :mrgreen:

messie 24. Apr 2007 12:44

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von Ajin
Das find ich irgendwie uncool.

Cooler wäre, statt einer Batchdatei einen Dienst mitzuinstallieren, der im Fall eines Updates gestartet wird, die Arbeit erledigt und sich dann beendet.
Grüße, Messie

Schubi 24. Apr 2007 12:47

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von messie
Zitat:

Zitat von Ajin
Das find ich irgendwie uncool.

Cooler wäre, statt einer Batchdatei einen Dienst mitzuinstallieren, der im Fall eines Updates gestartet wird, die Arbeit erledigt und sich dann beendet.
Grüße, Messie

Dafür muss ich mein System nicht mit einem Dienst "zumüllen", das geht auch mit einer simplen exe.
Die Batch-Datei ist aber kleiner und genauso wirksam.

Ajin 24. Apr 2007 13:22

Re: update eures eigenen Programms: vorgehensweise
 
da muss ich Schubi zustimmen. Sicherlich ist eine Batch Datei "unprofessionell", aber äusserst wirksam und schnell. Ich werde diese Methode mal heute Nachmittag ins Auge fassen.

Chewie 24. Apr 2007 13:42

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von Ajin
Die Batch-Datei ist aber kleiner und genauso wirksam.

Nein, ist sie nicht. Es gibt einen wichtigen Unterschied: Ein Dienst hat immer Schreibrechte für das Programmverzeichnis, ein normaler Benutzer nicht. Arbeitest du nicht als Administrator, musst du die Batchdatei explizit als Administrator starten, um sie auszuführen. Bei einem Dienst kann jeder Benutzer ein Update durchführen.

Schubi 24. Apr 2007 13:47

Re: update eures eigenen Programms: vorgehensweise
 
[quote="Chewie"][quote="Schubi"]
Zitat:

Zitat von messie
Zitat:

Zitat von Ajin
Die Batch-Datei ist aber kleiner und genauso wirksam.

Nein, ist sie nicht. Es gibt einen wichtigen Unterschied: Ein Dienst hat immer Schreibrechte für das Programmverzeichnis, ein normaler Benutzer nicht. Arbeitest du nicht als Administrator, musst du die Batchdatei explizit als Administrator starten, um sie auszuführen. Bei einem Dienst kann jeder Benutzer ein Update durchführen.

Das wird wahrscheinlich den Grund haben, dass ein normaler Benutzer nun mal nicht zu schreiben HAT.
Solche Sicherheitsmechanismen sollte man nicht einfach so umgehen.

Chewie 24. Apr 2007 15:18

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von Schubi
Das wird wahrscheinlich den Grund haben, dass ein normaler Benutzer nun mal nicht zu schreiben HAT.

Richtig. Und ein "normales" Programm sollte nicht von einem Administrator gestartet werden müssen. Eine Updatefunktion aus dem Programm heraus per Batchdatei erfordert aber Administratorrechte. Wozu dann, könnte man sich fragen.


Man muss halt einen Kompromiss schließen zwischen Sicherheit und Komfort. Und bei Programmen, die häufigen Updates bedürfen (z.B. Virenscanner) ziehe ich die Variante mit dem Dienst vor.

Ajin 30. Apr 2007 11:45

Re: update eures eigenen Programms: vorgehensweise
 
Mochen!

Delphi-Quellcode:
batchname := Pfad_Lokal+'Update.bat';

FileSetAttr(Pfad_Lokal+'TTS_Starter.exe', 0);
batchfile := TStringList.Create;
with batchfile do
begin
  try
    Add('@Echo off');
    Add(':Label1');
    Add('del "'+Pfad_Lokal+File1+'"'); //Löscht die alte Datei
    Add('copy "' + Pfad_Netz + File1 + '" "' + Pfad_Lokal + File1 + '"'); //Kopiert die Neue
    Add('if not Exist "' + Pfad_Lokal + File1 + '" goto Label1'); //Prüft, ob sie vorhanden ist
    Add(Pfad_Lokal + File1); //Startet sie
    Add('del ' + batchname); //und löscht die BAT
    SaveToFile(batchname);
    ChDir(ExtractFilePath(Application.ExeName));
    WinExec(PChar(batchname), SW_HIDE); //BAT starten
  finally
    batchfile.Free;
  end;
  Halt; //Programm beenden
end;
Kann man dem batch file eine Pause geben bevor es das alte File löscht? Ich bekomm immer den Fehler: keinen Zugriff weil die Anwendung noch läuft und daher nicht gelöscht werden kann.
WAIT und SLEEP scheint es nicht zu geben im Batch code.

Schubi 30. Apr 2007 12:37

Re: update eures eigenen Programms: vorgehensweise
 
Du kannst sowas wie
Delphi-Quellcode:
dir c:\ /s >> NULL
machen. Das dauert ne kleine Weile.
(Gibt alle Verzeichnisse und Dateien auf Laufwerk C aus. Allerdings wird wegen ">> NULL" nichts angezeigt)

Ansonsten so:
Delphi-Quellcode:
Add(':Label1');
Add('del "'+Pfad_Lokal+File1+'"'); //Löscht die alte Datei
Add('if Exist "' + Pfad_Lokal + File1 + '" goto Label1'); //Prüft, ob sie

Ajin 30. Apr 2007 13:20

Re: update eures eigenen Programms: vorgehensweise
 
Nach einigem herumprobieren hab ich ein ähnliches System wie Schubi entworfen. Nun funktionert das prima! Schubis Lösung funktioniert ebenfalls einwandfrei :)

Vielen Dank !

dor557 11. Jan 2008 02:32

Re: update eures eigenen Programms: vorgehensweise
 
So nun habe ich "Meine eigene" lösung zusammengetragen und Hier Gepostet.

Gruss Sascha

QuickAndDirty 11. Jan 2008 08:02

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von Ajin
Mochen!

Delphi-Quellcode:
batchname := Pfad_Lokal+'Update.bat';

FileSetAttr(Pfad_Lokal+'TTS_Starter.exe', 0);
batchfile := TStringList.Create;
with batchfile do
begin
  try
    Add('@Echo off');
    Add(':Label1');
    Add('del "'+Pfad_Lokal+File1+'"'); //Löscht die alte Datei
    Add('copy "' + Pfad_Netz + File1 + '" "' + Pfad_Lokal + File1 + '"'); //Kopiert die Neue
    Add('if not Exist "' + Pfad_Lokal + File1 + '" goto Label1'); //Prüft, ob sie vorhanden ist
    Add(Pfad_Lokal + File1); //Startet sie
    Add('del ' + batchname); //und löscht die BAT
    SaveToFile(batchname);
    ChDir(ExtractFilePath(Application.ExeName));
    WinExec(PChar(batchname), SW_HIDE); //BAT starten
  finally
    batchfile.Free;
  end;
  Halt; //Programm beenden
end;
Kann man dem batch file eine Pause geben bevor es das alte File löscht? Ich bekomm immer den Fehler: keinen Zugriff weil die Anwendung noch läuft und daher nicht gelöscht werden kann.
WAIT und SLEEP scheint es nicht zu geben im Batch code.

ping -t

Jelly 11. Jan 2008 08:44

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von manfred_h
schau Dir doch diese Komponente an:
http://www.tp-soft.de/index.php?T=rema&P=produkte

Oder genauer, besser hier

Da mein Programm ja mittlerweilen Freeware ist, sind ja damit keine Kosten verbunden. Ich fahre alle meine Updates darüber. Und die Liste zeigt dir, dass du nicht nur Updates damit fahren kannst, sondern sogar noch viel mehr... Was du brauchst, ist:
  • Ein MySQL 4.1 Server
  • PHP Anbindung
  • Webserver
  • FTP Server
Und das Programm sowie die TInternetUpdate Komponente, die es aber auch auf meiner Seite zum Runterladen gibt und auch im REMA Paket enthalten ist.

Rema regelt die Versionssteueren, setzt also Version verfügbar, und lädt das Setup dann auch autmatisch via FTP auf den Server hoch. Zu jeder Version schreibst du TODO- und WHATSNEW-Listen.

Die TInternetUpdate Komponente prüft, ob eine neue Version verfügbar ist (über http, nicht ftp), und lädt diese gegebenfalls runter... Alles in eigenem Thread ausgelagert und mit 2 Zeilen Code erledigt.

Luckie 11. Jan 2008 08:52

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von Schubi
Bat-Dateien sinf recht praktisch für sowas!
Die kannst du z.B. direkt von deiner Homepage downloaden und lokal ausführen.

Delphi-Quellcode:
batchname := Pfad_Lokal+'Update.bat';

FileSetAttr(Pfad_Lokal+'TTS_Starter.exe', 0);
batchfile := TStringList.Create;
with batchfile do
begin
  try
    Add('@Echo off');
    Add(':Label1');
    Add('del "'+Pfad_Lokal+File1+'"'); //Löscht die alte Datei
    Add('copy "' + Pfad_Netz + File1 + '" "' + Pfad_Lokal + File1 + '"'); //Kopiert die Neue
    Add('if not Exist "' + Pfad_Lokal + File1 + '" goto Label1'); //Prüft, ob sie vorhanden ist
    Add(Pfad_Lokal + File1); //Startet sie
    Add('del ' + batchname); //und löscht die BAT
    SaveToFile(batchname);
    ChDir(ExtractFilePath(Application.ExeName));
    WinExec(PChar(batchname), SW_HIDE); //BAT starten
  finally
    batchfile.Free;
  end;
  Halt; //Programm beenden
end;

Was muss in Pfad_Netz stehen, damit das funktioniert? Ich habe es gerade in der Konsole versucht:
Code:
C:\Dokumente und Einstellungen\mp>copy "http://www.michael-puff.de/Developer/Delphi/Programme/ADSReader.zip" d:\adsreader.zip
[url]http://www.michael-puff.de/Developer/Delphi/Programme/ADSReader.zip[/url]
Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung
ist falsch.
        0 Datei(en) kopiert.

Schubi 11. Jan 2008 09:53

Re: update eures eigenen Programms: vorgehensweise
 
@Luckie:
Die Dateri musst du vorher in der Software runterladen und irgendwo abspeichern.
Und diesen Pfad setzt du dann dort ein.

In meiner bat hat er sich die Datei von einem Server im Lan kopiert ("\\Server\Pfad\Datei.exe").

Luckie 11. Jan 2008 10:28

Re: update eures eigenen Programms: vorgehensweise
 
Ach so. Ich hatte das so verstanden, als ob du mit der Batch-Datei, das Update auch gleich runterlädst.

Hansa 11. Jan 2008 10:30

Re: update eures eigenen Programms: vorgehensweise
 
Irgendeinen Dateinamen in "" einzusetzen, das habe ich noch nirgends gesehen. Was soll das ? :shock:

Jelly 11. Jan 2008 10:30

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von Luckie
Ach so. Ich hatte das so verstanden, als ob du mit der Batch-Datei, das Update auch gleich runterlädst.

Das wäre ja im Prinzip auch möglich. Man müsste sich lediglich ein Konsolenprogramm schreiben, welches analog zum alten DOS-Copy Befehl funktioniert, nur halt auch für http-Downloads aus dem Web. Sollte eigentlich nicht schwer zu realisieren sein, denk ich.

Aurelius 11. Jan 2008 10:39

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von Hansa
Irgendeinen Dateinamen in "" einzusetzen, das habe ich noch nirgends gesehen. Was soll das ? :shock:

Bei Leerzeichen im Pfad gibt sonst Probleme bei einem Konsolenbefhl.

snow 11. Jan 2008 22:27

Re: update eures eigenen Programms: vorgehensweise
 
Kannst ja auch ne txt datei hochladen und immer die letzte zeile lesen lassen.
Alternativ kannste auch in deiner Website nen Komentar einfügen. Wenn du dannd die html datei nach dem Komentar durchsuchst.

kannste den komentar ja so aufbauen

neuste version : X.X
benötigte Datei(url)
speicherplatz der neuen Datei relativ zum Programmverzeichniss
Nächste benötigte Datei(url)
speicherplatz der neuen Datei relativ zum Programmverzeichniss
usw usw

Niemand schaut sich heutzutage die Komentare an. Und selbst wenn schon.

Zum Updaten.

Du kannst auch einfach ne eigene Win32.exe zu deinem Programm dazulegen oder das programm beenden und im Distroy-Event die Dateien ersetzen (IO-Checks =OFF). Dann sollte es vllt funktioniern ohne fehlermeldung.

ODer du kannst des vllt in nen Threat auslagern und den Hauptthreat beenden.

Wie auch immer das Updateprogramm muss dann nur die url öffnen und unter dem angegeben pfad speichern.

Gruß snow

Edit:// Andere Methode

Bei den meissten Webhostern und Servern hast du einen ftp-server dabei.

dem kannnst du sogar ein password geben, damit sich kein unbefugter die Dateien mal eben anguggt.
Bei Indy sollte eine ftp-kompo drin sein.
Nur vllt sollteste dem programm nen eigenen nutzer-account geben, damit keiner dein Webmaster-PW raus bekommt.


Zitat:

Kann man dem batch file eine Pause geben bevor es das alte File löscht? Ich bekomm immer den Fehler: keinen Zugriff weil die Anwendung noch läuft und daher nicht gelöscht werden kann.
WAIT und SLEEP scheint es nicht zu geben im Batch code.
Iss vllt nicht die beste lösung aber wie wärs mit einem ping 127.0.0.1 ?
der dauert unter windows seine 2 sekunden und fertig.

himitsu 17. Jan 2008 13:23

Re: update eures eigenen Programms: vorgehensweise
 
Zitat:

Zitat von snow
Bei den meissten Webhostern und Servern hast du einen ftp-server dabei.

dem kannnst du sogar ein password geben, damit sich kein unbefugter die Dateien mal eben anguggt.
Bei Indy sollte eine ftp-kompo drin sein.
Nur vllt sollteste dem programm nen eigenen nutzer-account geben, damit keiner dein Webmaster-PW raus bekommt.

dann brauchst du aber 'nen seperaten FTP-Zugang zum Downloadverzeichnis ... einen Adminzuang zur gesamten Zeite würde ich nicht so freischalten, denn du hättest dann ja die Zugangsdaten in dem Updatprogramm und dort kann sich jeder diese Daten rausholen und nette Sachen mit deiner Seite anstellen.


Zitat:

Kann man dem batch file eine Pause geben bevor es das alte File löscht? Ich bekomm immer den Fehler: keinen Zugriff weil die Anwendung noch läuft und daher nicht gelöscht werden kann.
WAIT und SLEEP scheint es nicht zu geben im Batch code.
WAIT > "PAUSE"? macht jedenfalls 'nen Päuschen :zwinker:

aber man kann die fhlerausgabe umleiten, statt sie anzeigen zu lassen ... NUL wäre da ein super Ziel :angel2:
oder einfach mal nach meiner Batch suchen ... die schwirrt schon seit Jahren hier irgendwo rum und läuft einwandfrei :angel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz