![]() |
AW: Software Launcher/Update Prüfer
Also wenns schnell und einfach sein soll, dann kann ich das Empfehlen:
![]() Nur wenige Zeilen und es funktioniert. Der Prüft die Versionen deiner DLL , EXE , usw. |
AW: Software Launcher/Update Prüfer
Ich habe es jetzt per HTTP gelöst:
Delphi-Quellcode:
@Perlsau: Es tut mir leid das ich mich vorhin so aufgespielt hatte... Hast ja im großen und ganzen recht.. Das ist auch ein Problem von mir, wenn jemand ohne irgendwelche Smilys schreibt meine ich dann, er würde dann sofort aggressiv schreiben..
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type TForm1 = class(TForm) IdHTTP1: TIdHTTP; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } const vers = 2; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var stream: TFileStream; sl : TStringList; s, v: String; begin ForceDirectories('C:\ProgramData\Programm\Files'); Stream := TFileStream.Create('C:\ProgramData\Programm\Files\temp.crwd', fmCreate); try IdHTTP1.Get('http://www.meinewebsite/update/software/update.txt', Stream); finally Stream.Free; end; sl :=TStringList.Create; try sl.LoadFromFile('C:\ProgramData\Programm\Files\temp.crwd'); s := sl.CommaText; finally sl.Free; end; v := IntToStr(vers); if s = v then begin MessageDlg('Die Software ist auf dem neuesten Stand', mtInformation, [mbOK], 0); end else MessageDlg('Neue Updates verfügbar!! Ihre Version: '+v+' '#10#13'Neue Verison: '+s, mtInformation, [mbOK], 0); end; end. |
AW: Software Launcher/Update Prüfer
Wenn du das temporäre Speichern noch raushaben möchtest, dann nimm statt eines FileStreams einen MemoryStream und befüllst die StringList mit LoadFromStream ;)
|
AW: Software Launcher/Update Prüfer
@Luki206: Bitte überdenke dringend deine Praxis, Pfade hart zu kodieren! Es gibt entsprechende Funktionen in der WinAPI, mit denen man die gewünschten Pfade ermitteln kann - auch passend je nach OS. Davon abgesehen: Wenn die Datei eh schon temp.* heißt, warum landet sie dann nicht gleich im %TEMP% (natürlich ermittelt mit der entsprechenden API-Funktion)?
MfG Dalai |
AW: Software Launcher/Update Prüfer
Zitat:
Aber sag mal: wenn ich dich jetzt mit Beleidigungen überziehen und die mit vielen hübschen Smileys schmücken würde, wären das dann keine Beleidigungen mehr? Genauso ist es nicht automatisch Unfreundlichkeit oder Boshaftigkeit, wenn man nicht ständig mit Smileys um sich wirft. Es geht hier ja auch nicht ums Smilen und miteinander fröhlich sein, sondern um Wissens- und Erfahrungsaustausch. Das findest du in Kuschelforen, wo man sich ständig gegenseitig einschleimt :P und hochlobt :drunken: und knuddel loveyou eiapopeia käselippe ... Es mag dir vielleicht aggressiv vorkommen, wenn wiederholt dieselben Dinge angemahnt oder kritisiert werden; du fühlst dich in deiner Bequemlichkeit bedroht. Kenne ich gut. Aber schließlich bist du doch hier, um was zu lernen, oder etwa nicht? Das kann mitunter auch mal ganz schön anstrengend sein. Wir haben doch auf der Welt mehr als genug leistungslose Spitzeneinkommen (nein, die ALG-II-Bezieher meine ich damit gewiß nicht), da darf man eine solche Haltung doch nicht auch noch unterstützen. Doch bevor ich jetzt weiter abschweife: Wenn du was lernen wilslt, mußt du den Leuten, von denen du was lernen willst, auch die Möglichkeit geben, dir helfen zu können. Beim Abtippen und Kopieren lernst du jedenfalls nichts, das ist dir doch hoffentlich auch inzwischen klar geworden. Ebenso wie kein Arzt dir helfen kann, wenn du ihm einfach nur sagst, du funktionierst nicht mehr richtig, ohne genauer darauf hinzuweisen, was nicht funktioniert oder wo genau es dir wehtut, kann dir auch kein User helfen, wenn du immer nur schreibst, daß es nicht klappt, oder "funktioniert soweit, aber doch nicht so ganz" und dergleichen schwammige Aussagen. Immerhin kannst du dir jetzt vorstellen, daß das unheimlich nervt, was natürlich irgendwann dazu führt, daß man aufgibt und erst gar nicht mehr draufklickt, wenn dort Luki steht: "Ach der schon wieder, nee, das tu ich mir nicht mehr an, der blickt's eh nicht." Man muß nicht wegen jeder Kleinigkeit im Forum nachfragen, das meiste kann man eigenständig – was man natürlich auch erst lernen muß, wenn man vorher diesbezüglich allzu verwöhnt war – herausfinden. Wenn du dir dann z.B. ein Tutorial über ein bestimmtes Thema vornimmst und du kommst nicht weiter, ist das was ganz anderes als sich hinzustellen und zu fragen: "Leute, sagt mir mal, wie programmiert man das? Am besten noch mit Konzept und kompletter Lösung." Genau so kommt das rüber. Andere bezahlen mich, damit ich ihnen das programmiere, da kannst du nicht erwarten, daß man dir das mal schnell runterprogrammiert, noch dazu mit allen Erklärungen, Hintergründen und Zusammenhängen usw. Und bevor vielleicht der Verdacht entsteht, ich würde hier den Coolen spielen: Ich hab mich hier auch schon zum Narren germacht und mußte mich anschließend entschuldigen (bzw. empfand das dringende Bedürfnis, das zu tun) und ich hab das erstens wunderbar überlebt und mir zweitens keinen Zacken dabei abgebrochen. Das ist doch was ganz Natürliches und in zwischenmenschlichen Angelegenheiten völlig normal – oder sollte es zumindest sein. Es ist auch keine Schande nachzufragen, wenn man bestimmte Empfehlungen und Hinweise nicht versteht. Vielen Anfängern ist das peinlich, die schreiben dann einfach: "Okay, habs rausgefunden, funktioniert jetzt" und man erfährt nie, wie sie denn das Problem jetzt gelöst haben. Die tun das, um sich die weiteren Ratschläge, die sie als schmerzvoll empfinden, weil sie sich dabei blöde vorkommen, zu vermeiden. So einfach ist das. Ich hoffe, daß Admins und Moderatoren das jetzt nicht wieder als unnötig und off topic abmahnen, denn ich bin er Ansicht, daß solche Dinge nicht ganz unwichtig sind und ihre Erwähnung bei solchen Gelegenheiten durchaus angebracht ist. Es ist ja nicht so, daß ich der einzige bin, der das so sieht und empfindet, nur weil ich der einzige zu sein scheine, der das öffentlich thematisiert. |
AW: Software Launcher/Update Prüfer
Wenn dich keiner leiden würde, dann würde keiner mehr antworten, aber Grundsätzlich solltest du dir auch erstmal mehr Gedanken über das machen, was du eigentlich willst.
Bin jetzt nur nochmal so von Anfang an ein paar deiner Fragen/Antworten durchgegangen: Zitat:
Zitat:
Zitat:
![]() ![]() Und, findet man da nun etwas? Zitat:
Nja, im Grunde ist dein Problem erstmal, daß du deine Probleme scheinbar nicht trennen kannst. - Datei runterladen - runtergeladene Datei auslesen/auswerten - Version der aktuellen Dateien bestimmen (z.B. Versionsinfo auslesen oder ganz einfach nur Änderungsdatum auslesen) - neue Dateien runterladen (wurde nun schon in Punkt 1 gelöst) - Dateien austauschen (was zwar bei der EXE, also vorallem sich selber etwas schwieriger ist, aber dafür gibt es auch einige Lösungen ... wenn man mal nach "Programm updaten" oder Dergleichen sucht) Einzeln lassen sich diese Punkte bestimmt viel einfache lösen, als wenn man alles zusammen in einem Mischmasch nicht mehr durchblickt. |
AW: Software Launcher/Update Prüfer
Zitat:
ich habe es auch mit einer sich auf einem ftp-server befindlichen datei gelöst in welcher nur die versionsnummer des neuen releases gespeichert ist. in einer weiteren datei sind alle dateinamen der dateien gespeichert welche erneuert werden sollen. es werden also nur neuere oder fehlende dateien heruntergeladen. Zitat:
vorteil: kein umständliches setup und der user muss sich um nichts kümmern. nachteil: sehr umfangreich vom code her und man muss alle möglichen fehler und eventuelle modifikationen des users mit einberechnen. bezüglich umfangreich: meine updateroutine hat ungefähr über den daumen etwas mehr als 1000 codezeilen. |
AW: Software Launcher/Update Prüfer
@d7user1
In der Programmierung arbeitet man (wenn man es richtig macht) mit Delegations. (z.B. Owner bei TComponents, TObjectlist mit OwnsObjects, eine PrintKlasse, die eine bestimmte Instanz ausdruckt, ...) Ändert sich etwas an der Daten-Klasse, dann passt man die Print-Klasse an und trotzdem bleibt der Aufruf gleich - schick. Man kann sich gegen diese Delegations auch wehren und muss dann eine sehr aufwändige und umständliche Programmierung aufbringen, um eine Setup/Update-Routine zu haben, die auch zukünftige Szenarien abdeckt. Oder man nimmt eine sehr einfache und simple Routine, die lediglich überprüft ob eine Aktualisierung vorliegt, und wenn, dann das Updatepaket liest und ausführt. Diesem Updatepaket (joar ein Setup) ist es erheblich leichter beizubringen die alte Version auf den neuen Stand zu bringen. Man delegiert es eben. Und ein Setup muss nicht umständlich sein, da man dieses auch silent (sichtbar ohne Benutzereingriff) oder very silent (gar nicht zu sehen) ausführen kann. Und auch beim Setup können Dateien nachgeladen werden (wenn benötigt). Somit kann man das gleiche Resultat erreichen, mit erheblich geringerem Aufwand und der Sicherheit auf jede mögliche Änderung reagieren zu können. Jeder macht sich das Leben aber selber schwer, empfehlen würde ich deine Vorgehensweise aber nicht. |
AW: Software Launcher/Update Prüfer
@d7user: Meinst du nicht, daß 1000 Zeilen ein bissl viel sind? :lol:
Delphi-Quellcode:
Tja, und ab nun fangen die möglichen Probleme an.
uses
Math, IOUtils, ShellApi; procedure TForm4.Button1Click(Sender: TObject); const URL = 'http://example.com/application.exe'; var TempName, OldName, CurName: string; TempFile: TStream; Error: HINST; begin CurName := Application.ExeName; OldName := CurName + '.old'; TempName := TPath.GetTempFileName; IdHTTP1.Head(URL); if IdHTTP1.Response.LastModified <= TFile.GetLastWriteTime(CurName) then Exit; // lokale Datei ist neuer TempFile := TFileStream.Create(TempName, fmCreate); try IdHTTP1.Get(URL, TempFile); finally Free; end; if TFile.Exists(OldName) then TFile.Delete(OldName); TFile.Move(CurName, OldName); TFile.Move(TempName, CurName); Error := ShellExecute(Application.Handle, nil, PChar(CurName), nil, nil, SW_SHOW); if Error <= 32 then RaiseLastOSError(Error); Application.Terminate; end; - keine Verifizierung, z.B. ob die runtergeladene Datei defekt ist - Schreibrechte? (ordentliche Anwendungen liegen in C:\Programme und da darf nicht jeder drin rumschreiben) - Proxy? (Pech gehabt) - es wird sich auf eine aktuelle Eigenart von lokalen Datenträgern verlassen, beim Austausch der Datei (mit Netzwerkpfaden geht es nicht) - keine Prüfung ob alles korrekt ablief und auch kein Rollback bei Problemen, um ein Funktionierendes System nach dem Update zu haben - kein Update/Konvertierung von irgendwelchen Dateienen, z.B. wenn sich in der neuen Version was ändert (die neue Version muß dann alle alten Daten ebenfalls verstehen = unnützer Anwendungscode, der nur einmal benötigt wird) - usw. |
AW: Software Launcher/Update Prüfer
Also mit wenigen Zeilen kann man Dateien von einem Webserver herunterladen:
Delphi-Quellcode:
Nachteile:
uses ..., UrlMon;
function DownLoadInternetFile(const SourceUrl, DestFilename : String): Boolean; const S_OK = 0; begin Result := URLDownloadToFile(nil,PChar(SourceUrl),PChar(DestFilename),0,nil) = S_OK; end; * Die Funktion blockiert während des Downloads * kein Feedback während des Downloads (das liese sich aber noch mit einem IBindStatusCallback interface verbessern) * läuft nur unter Windows Vorteile * extrem einfach und wenig Sourcecode * benützt die Proxyeinstellungen der IE * HTTPS funktioniert ebenfalls out of the box Also ich würde mit dieser einfachen Methode beginnen und erst wenn der ganze Download & Update Prozess funktioniert auf eine andere Methode (z.B. Indy oder MSXML2 oder WinInet) umsteigen. Noch ein Wort zu FTP: Vergiss es einfach; das Protokoll hat gegenüber HTTP(S) ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz