![]() |
Software Launcher/Update Prüfer
Hi,
ich habe vor, einen Launcher für eine Software zu schreiben. Ich habe auch schon einige Tutorials gesehen mit den Indy-Komponenten aber ich wurde daraus nicht schlau. Die Software soll eigentlich nur den Inhalt einer .txt Datei auf einem FTP Server prüfen und dann sagen ob Updates verfügbar sind. Googlen hat auch nichts gebracht.. Danke Luki :) |
AW: Software Launcher/Update Prüfer
Und wie lautet jetzt deine Frage?
|
AW: Software Launcher/Update Prüfer
Frage: Wie kann man so eine Updateprüf Software schreiben?
|
AW: Software Launcher/Update Prüfer
Möchtest du wissen, wie man so etwas am besten angeht ("Gibt es einen besseren Weg als Datei auf FTP-Server? Was wenn der Server eines Tages nicht mehr erreichbar ist? ...") oder wissen, wie man einen bestimmten Teil deines Plans (FTP+Textdatei) umsetzt?
|
AW: Software Launcher/Update Prüfer
Wenn ich ehrlich bin, wären beide Varianten nicht verkehrt ;)
|
AW: Software Launcher/Update Prüfer
Zitat:
Zumindest ich verweigere den Dienst, wenn ein User gewissermaßen nach fertigem Code fragt, denn viel anders ließe sich das nicht beschreiben: Du verlangst eine Erklärung, wie man ein bestimmtes komplettes Projekt umsetzt. Wieso suchst du dir nicht einfach erstmal Aufgaben, denen du auch gewachsen bist? Wenn man ein Projekt umzusetzen beabsichtigt, dann informiert man sich erst einmal: über die Forensuche und über die benötigen Komponenten, die man noch nicht kennt. Man übt sich erst mal im Gebrauch, macht ein Testprojekt, geht Tutorials durch usw. Erst dann geht man an die Umsetzung. Bei eintretenden Problemen bemüht man zuerst die Forensuche und fragt bei Mißerfolg im Forum nach, am besten mittels Posten der problematischen Codezeilen, die du noch gar nicht hast. So wie du das ständig machst, wird das nichts und erregt zudem den Unmut der anderen Forenteilnehmer, auch wenn viele das nicht so deutlich mitteilen, wie ich das tue. Erst mal fragen, wie man denn dieses und jenes Programm schreibt, dann hoffen, daß jemand was fertiges liefert, das du dann natürlich nicht wirklich verstehst, weil dir die Grundlagen fehlen, und dann ellenlange Threads erzeugen, in denen man ständig nachfragen muß, was denn nun nicht funktioniert und an welcher Stelle usw. Ich kann es nicht ausstehen, wenn Leute wie du hier ständig ihre Bequemlichkeit zur Schau stellen, Ratschläge nicht befolgen bzw. nicht umsetzen, behaupten, es genau so gemacht zu haben, wie empfohlen, obwohl das gar nicht stimmt usw. Irgendwann hilft dir dann keiner mehr, wenn du so weitermachst ... |
AW: Software Launcher/Update Prüfer
Schön das du so Leute wie mich nicht leiden kannst.. Wie so bitte antwortest du dann wenn es dir zu viel ist mal einen Ansatz von Hilfsbereitschaft zeigst? Hast mich schon im Delphi-Treff Forum blöd angemacht wo ich noch überhaupt nichts gekonnt hatte.. Ich hatte auch nur gefragt, wo ich Erklärungen finde und nicht gleich einen kompletten Code.. Du warst von Anfang an unfreundlich (mag sein das du ständig sowas lesen muss und es dich nervt aber du könntest trotzdem ein wenig freundlicher sein, wenigstens zu Anfängern) obwohl ich nie irgendwie unfreundlich war..
|
AW: Software Launcher/Update Prüfer
Die Worte kommen vielleicht etwas unglücklich an, ich formuliere es mal aus einer anderen Richtung:
Es wird sehr schwer und wenig effektiv werden, wenn wir versuchen, dir einen Software-Updater oder Teile daraus vorzuprogrammieren ohne zu wissen, was du davon verstehst, was du wie benutzen wirst, und warum etwas komischerweise nicht klappt. Du hast doch schon eine Idee (mit dem FTP-Server), wie du es realisieren willst. Du hast einen super Spielplatz vor dir. Von Indy hast du auch schon gehört. Da wäre doch der erste Schritt: Sagen wir dem FTP-Server "Hallo". Du sagst nur, dass du aus Tutorials "nicht schlau" geworden bist. Mich würde jetzt interessieren, was du versucht hast mit dem FTP-Server zu sprechen und was nicht ging. |
AW: Software Launcher/Update Prüfer
Zitat:
Ich helfe gerne und auch wiederholt, wenn jemand ein Problem hat und ich mich damit auskenne. Entgegen deiner Behauptung hattest du in diesem Thread eben nicht danach gefragt, wo du Erklärungen findest, sondern wie man sowas programmiert. Deine jetzige Behauptung, du hättest danach gefragt, wo man Erklärungen findet, ist unwahr und stellt aus meiner Sicht ein unaufrichtiges Ausweichverhalten dar. Auch das ist nicht wirklich freundlich: Du glaubst nämlich, dein Gegenüber sei so blöde, daß er das nicht bemerken würde. Was soll man denn darauf antworten, wenn jemand fragt, wie man ein ganzes Programm, von dem er nicht mal ein Konzept hat, entwickelt? Dir lang und breit auseinandersetzen, wie so ein Programm aufgebaut werden muß, worauf man achten muß usw.? Das käme einer kompletten Vortipperei gleich, auf die du ja allermeist abzuzielen scheinst, auch wenn du verständlicherweise das Gegenteil behauptest. Wenn man dir keinen Code vortippt, verstehst du meistens nur Bahnhof. Auch habe ich nicht zum Ausdruck gebracht, wie du es darstellst, daß ich dich nicht leiden kann, sondern daß ich solche Vorgehensweisen, wie du sie ständig zeigst, nicht ausstehen kann, z.B.: Obwohl man dich – und nicht nur ich – immer wieder um aussagekräftige Fehlerbeschreibungen bittet, kommst du immer wieder mit "es geht nicht", "es funktioniert nicht", "geht nicht richtig" usw. In mir erweckt das den Eindruck einer gewissen Lernresistenz. Ist es in deinen Augen etwa unfreundlich, darauf hinzuweisen, daß ein "geht nicht" ungenügend ist, weil es nicht ausreicht, sich den Fehler vorzustellen? Wie kann man das dann trotzdem immer wieder so machen? Du mußt dir doch langsam selber ein wenig blöde vorkommen, wenn man dich ständig darauf hinweisen muß ... Davon abgesehen helfe ich dir oder anderen nicht in der Absicht, mir Freunde oder mich beliebt zu machen, sondern aus simpler Hilfsbereitschaft, die meistens auf Gegenseitigkeit beruht, denn schließlich benötige ich ja auch hin & wieder Hilfe und Unterstützung. Ich bin nicht unfreundlich, sondern sachlich. Dagegen scheinst du überempfindlich zu sein: Du empfindest nur Leute als freundlich, die deine Bequemlichkeit unterstützen. Wer dir was Unangenehmes sagt, ist unfreundlich, auch wenn er es völlig sachlich rüberbringt. Oder ist es etwa keine Bequemlichkeit, ständig auf die Forensuche zu verzichten und Fragen, die schon zigmal gestellt und beantwortet wurden, wieder und wieder zu stellen? Geschieht es etwa nicht aus Bequemlichkeit, statt sich erst einmal selbst um Lösungen zu bemühen, gleich ganze Konzepte anzufragen, ohne zuvor auch nur den kleinen Finger gerührt zu haben? Noch während du mit der Lösung des einen Problems beschäftigt warst, hattest du schon die nächste Idee und fragtest, wie man sowas programmiert. Kannst du auch nur im Ansatz nachvollziehen, was ich dir mitzuteilen versuche? Oder willst du weiterhin darauf beharren, daß ich das aus schierer Bosheit und Unfreundlichkeit schreibe? Wenn ich dir nicht helfen wollte, dann würde ich mir nicht die Mühe machen, das darfst du mir glauben. Unser schöner Günter – keine Ahnung, ob er wirklich so schön ist – :lol: bringt dasselbe, was ich zu auszudrücken suche, auf den Punkt, nur mit anderen Worten. Ist das jetzt freundlicher? Es ist vielleicht weniger scharf formuliert, das mag schon sein, doch Schärfe in der Formulierung ist noch lange keine Unfreundlichkeit. Die wäre dann gegeben, wenn ich dich beschimpfen, als grundsätzlich unfähig, als zu blöde und dergleichen bezeichnen würde. Tue ich aber nicht, schon weil mir das nicht zustehen würde. Vielmehr benenne ich ganz sachlich – und engagiert – die Schwachpunkte deiner Vorgehensweise. Und ja, du hast richtig vermutet: Ich und viele andere müssen ständig sowas lesen, du bist da leider nicht der einzige schwierige Fall :stupid: Übrigens bin ich mir ziemlich sicher, daß du weder gegoogelt noch Tutorials gelesen hast – was in der kurzen Zeit zwischen dem Aufkommen der Idee und dem Posten der Anfrage ja auch kaum möglich gewesen wäre. Ich bin mir absolut sicher, daß du ![]() |
AW: Software Launcher/Update Prüfer
Mal in Grundzügen
Info-Datei laden und mit der installierten Version vergleichen. Ist ein Update notwendig, dann die Installationsdatei laden und ausführen. Es gibt da noch mehrere Spielarten, z.B. wenn für das Update auf die aktuellste Version Zwischenupdates gemacht werden müssen. Das packt man alles in die Info-Datei und reagiert entsprechend darauf. Grundsätzlich haben wir hier also nur 2 wirkliche Schwierigkeitsgrade: Dateien per FTP laden Dateien ausführen PS Ich weiß nicht wonach du gesucht hast, aber versuche es mal mit ![]() Oh Wunder, der erste Link ist ein deutsches Tutorial mit der Indy-Komponente ;) |
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) ![]() |
AW: Software Launcher/Update Prüfer
A propos Verifizierung, 1000 Zeilen usw.
All das ist in den vielen Zeilen enthalten. Verifizierungen aller Art, um auf möglichst viele Probleme reagieren zu können. verzeiht Schreibfehler. Ich poste mit dem Handy. |
AW: Software Launcher/Update Prüfer
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hab hier mal die Folien bzw. den Source von den DT2010.
Die Folien sind zwar ohne Moderation nicht so sprechend, geben aber vielleicht paar Themen-Ideen um welche du dich kümmern musst. Vielleicht hilft es dir. Links: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 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