wulfskin - Mo 11.09.06 22:15
Titel: Update DLL v0.2
Hallo Leute,
ich hab die letzten Tagen an einer DLL gebastelt, mit der sich auf einfache Art und Weise ein Programm updaten lässt. Die DLL besteht aus einer einzelnen Funktion
MyUpdate, die von einem Server eine Ini-Datei herunterlädt, ausliest und danach die gewünschten Optionen ausführt.
Um es gleich vorweg zu nehmen: Es existiert gerade die erste Version, die nur auf meinen speziellen Gebrauch zugeschnitten ist und deshalb nur einen sehr begrentzen Funktionsumfang besitzt:
- Ini-Datei herunterladen.
- Programm herunterladen.
- Programm starten.
- Fortschrittsdialog
Wer sich also nicht bemühen möchte ein extra Formular für die Updatefunktion herzustellen, der kann diese DLL mit nonVCL Formular benutzen.
Die DLL ist gerade einmal 26kb groß und
benötigt natürlich eine Internetverbindung.
Die nonVCL-Grundlagen habe ich mir durch Luckies Tutorial im Schnellkurz angeeignet, kann sein dass ich da noch handwerkliche Fehler begangen habe.
Im Allgemeinen gilt: Fehler und Vorschläge sind gerne erwünscht, auch die Erweiterung ist gerne möglich, bitte stellt sie aber uns alle zur Verfügung, ganz gemäß dem Grundgedanken von Open Source.
Das ist auch der Grund warum ich diese DLL veröffentliche: Vielleicht hat ja jemand sowas gesucht und möchte es jetzt erweitern, ein kleines Stück ist ja schon geleistet.
Download:
http://private.hippieclan.net/update_dll.zip.
So nun aber endlich ein einfaches Beispiel, es ist die Unit
UpdConst.pas einzubinden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var AData: PUpdateSettings; begin New(AData); AData^.UpdateMode := upmCheck; AData^.DownloadURL := 'http://private.hippieclan.net/update.ini'; AData^.ProgramName := 'Rep-Ex'; AData^.CurrentVersion := 0; AData^.MainHandle := 0; AData^.CallBackFunc := nil; AData^.CallBackData := nil; AData^.WindowSettings := nil; AData^.StartUpdate := True; AData^.FreeMemory := True; UpdateDoUpdate('update.dll', AData); |
So, nach Aufruf wird nun die Version überprüft und die Datei heruntergeladen und aufgerufen, dass ganze mit Dialog.
Wenn man kein Dialog oder die Position ändern möchte, gibt es dafür die
TWindowSettings:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| PWindowSettings = ^TWindowSettings; TWindowSettings = packed record ShowWindow: Boolean; CloseWindowWhenFinished: Boolean; X, Y: Integer; end; |
Um diese zu benutzen, einfach ein Record mit
New erstellen und
AData^.WindowSettings zuweisen.
Zu guter Letzt kann man den ganze Vorgang durch eine CallBack-Funktion kontrollieren. Diese sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| UPDATE_START = 1; UPDATE_WINDOW_CREATE = 2; UPDATE_CONNECT_INTERNET = 3; UPDATE_DOWNLOAD_TEMPFILE = 4; UPDATE_DOWNLOAD_FILESIZE = 5; UPDATE_DOWNLOAD_START = 6; UPDATE_DOWNLOAD_PROGRESS = 7; UPDATE_DOWNLOAD_FINISHED = 8; UPDATE_READ_SETTINGS = 9; UPDATE_GET_FILE_COUNT = 10; UPDATE_FOUND_VERSION = 11; UPDATE_ABORT = 12; UPDATE_ERROR = 13; UPDATE_WINDOW_CLOSE = 14; UPDATE_WINDOW_DESTROY = 15; UPDATE_FINISHED = 16; UPDATE_END = 17; UPDATE_CHECK_VERSION = 0; UPDATE_DO_UPDATE = 1; |
Der Rückgabewert entscheidet, ob die Operation fortgeführt wird (True) oder abgebrochen wird.
Und zu guter letzt ein Einblick in die Inidatei auf dem Server:
Quelltext
1: 2: 3:
| [program] version=1 file=URLTOFILETODOWNLOAD |
Mehr wird bald kommen, hoffentlich :)!
So, soviel mal fürs erste. Ich hoffe ihr unterstützt mich!
Version 0.2:
Quellcode komplett überarbeitet und auch getestet. Konstanten umbenannt und hinzugefügt. Die nötigen Konstanten und Types befinden sich in einer eigenen Unit und die UpdateFunktion ruft die DLL nun dynamisch auf!
Gruß Hape!
wulfskin - Sa 16.09.06 00:03
Force hat folgendes geschrieben: |
Zitat: | [Error] adf_p.pas(29): E2003 Undeclared identifier: 'TFNCallBack'
[Error] adf_p.pas(103): E2003 Undeclared identifier: 'WindowData'
[Error] adf_p.pas(103): E2017 Pointer type required
[Error] adf_p.pas(103): E2035 Not enough actual parameters
[Error] adf_p.pas(104): E2017 Pointer type required
[Error] adf_p.pas(105): E2017 Pointer type required
[Error] adf_p.pas(106): E2017 Pointer type required
[Error] adf_p.pas(113): E2003 Undeclared identifier: 'Handle'
[Fatal Error] adf.dpr(8): F2063 Could not compile used unit 'adf_p.pas' |
Muss da noch ein uses eingebunden werden? |
Sorry, ich gebs zu, hab noch was vergessen aus dem Header zu kopieren und hab das Beispielprogramm net getestet.
Ich werd mich morgen drumm kümmern, bin jetzt einfach zu Müde. Hab die DLL eh nochmal überarbeitet, dass werde ich dann morgen bringen!
EDIT:
So jetzt kann man endlich vernünftig testen!
Viele Grüße und nochmals sorry,
Hape
jaenicke - Di 13.10.09 02:02
Naxor hat folgendes geschrieben : |
da solltest du noch mal nachschauen was da los ist |
Naja, du hast Antivir, da gibts doch alle paar Stunden nen Fehlalarm. So schnell kann man mittlerweile die False Positives gar nicht mehr einschicken, ich habs aufgegeben, sollen die doch machen was sie wollen. Wers nutzt muss halt mit leben.
wulfskin hat folgendes geschrieben : |
Die DLL besteht aus einer einzelnen Funktion MyUpdate, die von einem Server eine Ini-Datei herunterlädt, ausliest und danach die gewünschten Optionen ausführt. |
Wobei ich mich da frage warum es dann Sinn macht das in eine DLL auszulagern, wenn du die Rechteverwaltung und so etwas ohnehin nicht weiter beachtest. Und was ist, wenn die DLL selbst aktualisiert werden muss?
Ich schau mir den Quelltext aber auch nochmal morgen etwas genauer an.
Allerdings funktioniert dein Updater, wenn ich das richtig sehe, noch unter Windows 9x. Mein in die Exe integrierter ja z.B. nicht. Das mag ja auch manchen noch wichtig sein.