Updater für eigenes Programm



  • Hallo Leute, wieder mal ein Problem:

    -Ja, ich hab die SuFu benutzt, bin aber nicht weitergekommen.

    Wie in der Überschrift schon gesagt, möchte ich einen Updater für mein Programm schreiben. Ich weiß bereits, dass es eine extra EXE sein muss, die die Versionsnummer im Internet überprüft, gegebenfalls die neue Datei herunterlädt,
    die alte Datei überschreibt und es dann automatisch wieder startet.

    Überschreiben und wieder aufrufen ist kein Problem, nur wie kann ich die Versionsnummer im Internet überprüfen und die Datei herunterladen?

    MfG
    Chris_



  • Hallo,

    das hat jetzt aber erst mal nix mit dem CBuilder zu tun, eher Programmierung allgemein.
    Ich zeige dir mal das System wie ich das bei mir mache.

    Ich lege auf dem Webserver ein Steuerfile in Textform (TIniFile)ab, welches die nötigen Informationen beinhaltet.
    Beispiel:

    [update]
    date=30.08.2009
    newversion=1.2.1.2
    
    [action]
    msg=Neue Version verfügbar
    showURL=http://www.meinewebsite.de
    
    [eula]
    file=http://www.meinewebsite.de/updates/license.txt
    
    [files]
    count=3
    
    [file1]
    url=http://www.meinewebsite.de/updates/meineanwendung.exe_new
    descr=MainApp
    targetdir=ProgPath
    compressed=0
    
    [application]
    appupdate=1
    appname=meineanwendung.exe
    appcomps=meineanwendung.exe_new
    

    Ablauf:
    Zunächst liest das Mainprogramm das Steuerfile ein und vergleicht die Versionen. Bei neuerer Version auf dem Webserver gebe ich den Button "jetzt updaten" frei. Dieser startet das eigentliche Updateprogramm und schließt die Mainanwendung.
    Das Updateprogramm lädt jetzt die Dateien, die im steuerfile angegeben sind herunter und ersetzt das Mainprogramm ode andere Dateien.
    Das mal in Kürze, stecken natürlich noch Prüffunktionen dahinter usw.
    Zum Download würde ich HTTP empfehlen, da Du da am wenigsten mit einer Firewall Probleme bekommst.
    Ich hoffe das hilft Dir erst mal als Ansatz.

    Gruß myerscola



  • Hallo myerscola,
    schonmal Danke für den Ansatz 👍
    So hatte ich es mir auch gedacht, oder eben nur mir der Versionsnummer im Dateinamen per SubString, weil es nur eine einzige Datei (EXE) ist.

    myerscola schrieb:

    Zum Download würde ich HTTP empfehlen, da Du da am wenigsten mit einer Firewall Probleme bekommst.

    Genau das ist mein Problem, WIE ich das in C++ realisieren kann!
    Ich kenne die URL des Programmes, nur wie kann ich sie herunterladen?

    Chris_



  • Schau Dir mal die Komponente TIdHTTP auf der Indy-Palettenseite genauer an.
    Andernfalls kannst Du auch in den FastNet-Reiter gehen.



  • Ich habe die Indy-Komponenten nicht installiert (Habe auch keinen FastNet-Reiter)
    und bekomme das unter BCB6 auch irgendwie nicht hin 😞

    Gibt es noch eine andere Möglichkeit??

    Chris_



  • Hi,
    in der Artikelsektion gibts einen wunderschönen Beitrag dazu.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-169861.html

    Das kann man sehr einfach nutzen um ein File aus dem Netz zu laden. Müsstest es dir nur auf deine Gegebenheiten anpassen.

    MfG
    TFX



  • Danke an TFX!

    Trotzdem kann ich damit leider weniger anfangen, da ich eher ein Anfänger bin
    und das "nur auf deine Gegebenheiten anpassen" nicht hinbekomme.

    Gibt es noch andere Komponenten, die das einfacher erledigen?

    Chris_



  • TNMHTTP aus dem bereits erwähnten FastNet-Paket.
    Das ist beim BCB6 (ausser Personal?) im Lieferumfang.



  • Genau diese Personal-Edition habe ich. 😞

    Gibts diese Komponentensammlung irgendwo (kostenlos) ?
    Per Google hab ich nichts gefunden.

    Chris_



  • Ich kenne mich mit dem Builder nicht aus. Aber wenn du da WinAPI-Funktionen nutzen kannst, wäre URLDownloadToFile wohl das einfachste.



  • Wenn du die Win32 API benutzt kannst du auch das FTP Protokoll mit den Funktionen InternetOpen, InternetConnect und FTPGetFile benutzen.



  • Habe die Idee von Badestrand verfolgt (Danke dafür, auch an DocShoe!)
    und benutze folgenden Code als Konsolenanwendung:

    #include <urlmon.h>
    #include <iostream>
    #pragma comment(lib,"urlmon") 
    
    using namespace std;
    
    int main() {
    
    if ( FAILED( CoInitialize(NULL) ) ) return -1;
    
    HRESULT hResult = URLDownloadToFile(
    NULL,
    TEXT("http://www.test.de/"),
    TEXT("C:\\test.htm"),
    0,
    NULL
    );
    
    CoUninitialize();
    cout << GetLastError();
    
    if ( FAILED(hResult) ) return -1;
    else
    return 0;
    }
    

    Es tut sich aber leider gar nichts! 😞
    Bei GetLastError() wird 0 zurückgegeben 😕

    Woran liegt das?

    Chris_



  • Nicht alle Windows Funktionen benutzen Get-/SetLastError um einen Fehlerstatus anzuzeigen. Dass GetLastError() 0 zurückgibt heisst also nicht zwangsläufig, dass alles funktioniert hat.
    Hast du mal probiert, in der URL die konkrete Datei anzugeben, so wie "http://www.test.de/index.html" ?



  • Du musst schon die komplete URL zu der Datei spezifizieren, die du herunterladen willst, d.h. http://www.test.de/test.thm
    Und zur Diagnose solltest du auch dein hResult auswerten.

    Da du aber keine VCL-Mittel anwenden kannst/willst, wäre eine weitere Diskussion ggf. im WinAPI-Forum besser aufgehoben.

    Edit: Ähh ja, genau. 😉



  • @DocShoe: Auch unter Angabe der Datei lädt er nichts herunter.
    @Jansen: hResult: -2147467260 (irgendwo hier im Forum hab ich gelesen was der Wert bedeutet, finde ich gerade nur nicht. Edit: Hab mich getäuscht, war ein anderer Wert, auch bei msdn ist dieser wert nicht aufgelistet)

    Kann es evtl. am Zugriffsrecht auf (C:\) bei Vista liegen???
    Edit: Das muss es sein, denn es geht, wenn ich die datei auf einem USB-Stick speichere. Wie kann ich das beheben???

    Chris_



  • Chris_ schrieb:

    Kann es evtl. am Zugriffsrecht auf (C:\) bei Vista liegen???
    Edit: Das muss es sein, denn es geht, wenn ich die datei auf einem USB-Stick speichere. Wie kann ich das beheben???

    Entweder du speicherst die Datei irgendwo, wo du Schreibrechte hast (Persönlicher Ordner und Unterordner, siehe SHGetFolderPath), oder du musst dein Programm mit Administratorrechten starten; dazu eine entsprechende Manifestdatei im selben Ordner platzieren oder als Ressource einbinden.


Log in to reply