Autor Beitrag
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Mo 11.09.06 22:15 
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: private.hippieclan.net/update_dll.zip.

So nun aber endlich ein einfaches Beispiel, es ist die Unit UpdConst.pas einzubinden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
//uses UdpConst;

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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  PWindowSettings = ^TWindowSettings;
  TWindowSettings = packed record
    ShowWindow: Boolean;                //show the progress window
    CloseWindowWhenFinished: Boolean;   //close progress window when operation is finished
    X, Y: Integer;                      //-1 for screen middle
  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:
ausblenden 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;              //AData2 = null
  UPDATE_WINDOW_CREATE = 2;      //AData2 = WindowHandle (THandle)
  UPDATE_CONNECT_INTERNET = 3;   //AData2 = OpenUrlHandle (HINTERNET)
  UPDATE_DOWNLOAD_TEMPFILE = 4;  //AData2 = TempFileName (PChar)
  UPDATE_DOWNLOAD_FILESIZE = 5;  //AData2 = FileSize (Integer)
  UPDATE_DOWNLOAD_START = 6;     //AData2 = ID of File (Integer)
  UPDATE_DOWNLOAD_PROGRESS = 7;  //AData2 = Bytes downloaded (Integer)
  UPDATE_DOWNLOAD_FINISHED = 8;  //AData2 = ID of File (Integer)
  UPDATE_READ_SETTINGS = 9;      //AData2 = null
  UPDATE_GET_FILE_COUNT = 10;    //AData2 = FileCount of files to download (Integer)
  UPDATE_FOUND_VERSION = 11;     //AData2 = True if new version available (Boolean)
  UPDATE_ABORT = 12;             //AData2 = ID of file in process when aborted (Integer)
  UPDATE_ERROR = 13;             //AData2 = error id (Integer)
  UPDATE_WINDOW_CLOSE = 14;      //AData2 = WindowHandle (THandle)
  UPDATE_WINDOW_DESTROY = 15;    //AData2 = WindowHandle (THandle)
  UPDATE_FINISHED = 16;          //AData2 = WindowHandle (THandle)
  UPDATE_END = 17;               //Adata2 = True if not aborted and no error occured (Boolean)
  //Ids
  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:
ausblenden 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!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.


Zuletzt bearbeitet von wulfskin am Sa 16.09.06 12:58, insgesamt 2-mal bearbeitet
Force
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: Fr 15.09.06 23:28 
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?
wulfskin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Sa 16.09.06 00:03 
user profile iconForce 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

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Naxor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

alle
delphi, C++, php, html, java, flash, XML
BeitragVerfasst: Mo 12.10.09 23:27 
mhhh schade kann dein updater leider nicht testen da deine DLL bei mir sofort als Heur/Malware gemeldet wird und wird vom system sofort geblockt..

da solltest du noch mal nachschauen was da los ist

Hier die meldung zur Mailware

Spezialerkennung Beschreibung:
HEUR/Malware


HEUR/Malware ist eine heuristische Erkennungsroutine. Sie wurde designed um gemeinsame Eigenschaften von Malware zu erkennen. Avira AntiVir identifiziert unbekannte Malware proaktiv mit der AHeAD Technologie. Hierfür setzt Avira auf eine innovative strukturelle Analyse.

Die Heuristik erkennt mit einer hohen Wahrscheinlichkeit ob es sich bei einer Datei um eine schädlich oder virulente Datei handelt. Die Analyse basiert auf der Zusammensetzung der Datei, die Reihenfolge signifikatner Codesequenzen und spezielle Verhaltensmuster.

HEUR/Malware im speziellen meldet Dateien welche eine verdächtige Funktionalität aufweisen.

Sollten Sie dennoch einen Fehlalarm vermuten, bitten wir Sie diese Datei zur näheren Analyse an unser Virenlabor zu schicken.

Bei einer heuristischen Erkennung könnte es sich um einen Fehlalarm handeln wenn ein oder mehrere Punkte zutreffen:
- Das Programm wird bereits seit geraumer Zeit genutzt und ist dem Benutzer bekannt.
- Das Programm wurde vom Benutzer selbst installiert
- Das Programm stammt aus einer vertrauenswürdigen Quelle

Bitte beachten Sie das sowohl alte Programme ohne ihr Wissen infiziert oder von Malware ersetzt werden können. Desweiteren können auch vertauenswürdige Quellen infiziert worden sein.

Um die Erkennung weiterhin zu verbessern und Fehlalarme zu reduzieren empfehlen wir die Datei zu Analysezwecken an unser Virenlabor zu schicken.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 13.10.09 02:02 
user profile iconNaxor hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconwulfskin hat folgendes geschrieben Zum zitierten Posting springen:
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.
wulfskin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Sa 17.10.09 23:31 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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?
Stimmt, die von mir programmierte DLL betrachtet all dies nicht. Und Sinn scheint sie auch reichlich wenig zu machen. Aber vielleicht existiert ja mangels Alternative trotzdem Interesse...

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.