Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Download aus INet - fertiger Code gesucht (https://www.delphipraxis.net/203017-download-aus-inet-fertiger-code-gesucht.html)

Guido Eisenbeis 3. Jan 2020 20:48

Download aus INet - fertiger Code gesucht
 
Hallo Leute. Ich programmiere gerade ein Setup für ein eigenes Programm. (Ich weiß, dass es Inno Setup u Co gibt, aber die Sache hier ist kompliziert und dafür ist Delphi besser geeignet.)

Das Setup ist sehr umfangreich und fast fertig. Was noch fehlt, sind Funktionen für INet-Downloads. Zum einen direkte Downloads (zip's die automatisch entpackt werden sollen), zum anderen Aufrufe von Download-Webseiten im Standard-Browser (wo der User die Downloads selbst durchführt).

Da das Setup wie gesagt sehr umfangreich geworden ist, habe ich seit Wochen darauf mehr Zeit verwendet, als auf die Entwicklung des eigentlichen Programms. Ich würde mich sehr freuen, wenn jemand fertigen Code zur Verfügung stellen würde, mit dem man die Downloads umsetzen kann. Das würde mich echt entlasten. :thumb:

Guido.

Redeemer 3. Jan 2020 21:12

AW: Download aus INet - fertiger Code gesucht
 
Fertigen Code haben wir nicht.
Wochen für ein Setup zu brauchen, ist auch eine Sache. Ich halte portable Software in Ehre.

Ansätze: THTTPRIO, TDownloadURL, TBrowseURL, TIdHTTP uvm.

Guido Eisenbeis 3. Jan 2020 21:39

AW: Download aus INet - fertiger Code gesucht
 
Hallo Redeemer.

Zitat:

Zitat von Redeemer (Beitrag 1454401)
Fertigen Code haben wir nicht.

Wer sind denn "wir"? (Du wirst doch nicht von dir selbst in der 3. Person sprechen!?) :wink:

Zitat:

Zitat von Redeemer (Beitrag 1454401)
Wochen für ein Setup zu brauchen, ist auch eine Sache.

Tut mir leid, ich bin alt, da geht das nicht mehr so schnell wie früher! :oops:

Zitat:

Zitat von Redeemer (Beitrag 1454401)
Ich halte portable Software in Ehre.

Witzig, genau darum geht es bei meinem Projekt: Um portable Freeware! Mein Setup enthält mehrere fremde Software, die ich aus urheberrechtlichen Gründen nicht in mein Setup hineinpacken will. Deshalb wird sie "live" aus dem Internet nachgeladen. Das macht die Sache kompliziert und aufwendig.

Zitat:

Zitat von Redeemer (Beitrag 1454401)
Ansätze: THTTPRIO, TDownloadURL, TBrowseURL, TIdHTTP uvm.

Danke für die Tipps! :)

mensch72 3. Jan 2020 22:52

AW: Download aus INet - fertiger Code gesucht
 
uiuiui... "Mein Setup enthält mehrere fremde Software, die ich aus urheberrechtlichen Gründen nicht in mein Setup hineinpacken will. Deshalb wird sie "live" aus dem Internet nachgeladen. Das macht die Sache kompliziert und aufwendig."...

Wenn du in deinem Delphiprogramm intern Standard-APIs für den Download nimmst und dann auch noch OS-Calls benutzt um etwas auszuführen (ShellExecute, CreateProcess,...) dann wird deine Software von jeder guten Heuristik der besseren Vierentests erkannt und gesperrt.

Allein beim Öffnen einer Download-Seite und dem "manuellem" Laden einer Datei via Standard-WEB-Browser können dir schon Downloadmanager dazwischen funken.
Das Laden von Dateien aus fremden Quellen, welche du nicht selbst unter Kontrolle hast, ist für ein Setup schlicht untauglich, denn wenn sich morgen irgendeine externe Quelle ändert bekommst du das auf Dauer niemals immer mit... also funktioniert übermorgen oder wann auch immer dein Setup nicht mehr so wie es mal ging.

Wenn schon "portabel", dann richtig "AllInOne & 100%lokal"... dann reicht ein Verzeichnis mit genug Rechten wo genau eine EXE gestartet wird.

Guido Eisenbeis 3. Jan 2020 23:34

AW: Download aus INet - fertiger Code gesucht
 
Hallo mensch72.

Deine Einwände helfen zwar nicht, sind aber leider durchaus realistisch. Deshalb frage ich hier, ob jemand bewährten Code hat, der vielleicht schon einige Hürden umschifft. :wink:

Zitat:

Zitat von mensch72 (Beitrag 1454404)
Wenn schon "portabel", dann richtig "AllInOne & 100%lokal"... dann reicht ein Verzeichnis mit genug Rechten wo genau eine EXE gestartet wird.

Wie gesagt, Urheberrechte usw.

Ich habe einen Aufsatz für ein fremdes Programm geschrieben, quasi ein Add-on. Weitere fremde Programme werden als Prerequisites benötigt. Nun wäre es mit einem nicht einschätzbarem Aufwand verbunden, dafür die Rechte zum Ausliefern zu bekommen => was ich nicht will. Auch will ich dafür weder die Verantwortung noch den Support übernehmen. Mein Anteil ist lediglich das Add-on.

Stell es dir vielleicht vor wie bei einem Java Programm, da würde ich auch nicht die JRE mit ausliefern. :P

mensch72 4. Jan 2020 00:48

AW: Download aus INet - fertiger Code gesucht
 
..."Deshalb frage ich hier, ob jemand bewährten Code hat, der vielleicht schon einige Hürden umschifft"...

All das was du "jetzt" suchst, ist die eigentliche "interne" zertifizierte Funktion der bekannten "Installer" (Inno,Wise,...)!
Sorry für meine Meinung:
- vergiss deinen Ansatz als "Master-Installer" samt GUI als pures Delphi-Programm
- entwickle meherere Delphi-DLLs als AddOn/PlugIn für bekannte Standard-Installer (die haben alle ein DLL-API)
- mache so wenig wie möglich in den nativ DLLs, nutze die Installerscripts... weil deren Interpreter sind Security geprüft und "bekannt"
- zu 99% kannst du per Installerscript+notfalls ein paar nativ DLL Calls all das machen, was du in den letzten Wochen komplett selbst gemacht hast
- du glaubst, jetzt fehlen dir nur noch zwei drei Funktionsaufrufe um was aus dem INet zu laden und auszuführen, nur genau da verkennst du aus meiner Sicht die reale Sicherheits-Lage... denn DAS ist es, was die Standardinstaller nach Jahre langer Entwicklung SICHER drin haben!

-> sowas mal so nebenbei hier oder sonstwo als fertigen Code ausgehändigt zubekommen... ich glaube es gab mal irgendwo gute Berichte/Analysen zu (bösen) MalWare Installern, welche sogut waren, das sie nur bei Realinstallationen und nicht bei VirtuellenMaschinen ihren Werbemist nachgeladen haben... dort wurden ein paar funktionierende Nachlademechanismen ganz gut beschrieben... mein TIP: lass es und nutze Standardinstaller, welche du nur für GUI und lokale nativ Sachen per DLL erweiterst!

Guido Eisenbeis 4. Jan 2020 01:57

AW: Download aus INet - fertiger Code gesucht
 
Danke für deine Infos und deine Meinung! Ich werde es mir ansehen.

Guido.

Guido Eisenbeis 4. Jan 2020 02:23

AW: Download aus INet - fertiger Code gesucht
 
@mensch72

Ich habe mir Inno Setup gerade kurz angesehen und konnte außer dem Generieren von anklickbaren Download-Links keine großartigen Download Fähigkeiten entdecken. Wahrscheinlich im Prinzip wie TLinkLabels. ... Wenn ich mit Inno Setup bei Null anfangen würde, dann würde es mindestens nochmals ein paar Wochen dauern, bis ich etwas habe. Und ob dann die Dinge damit alle umgesetzt werden können, die benötigt werden, kann ich vielleicht erst erkennen, wenn es nicht weiter geht.

Kennst du dich damit aus und kannst mir dabei helfen? Ansonsten ist mir das zu heikel, wenn ich nicht mal weiß, ob überhaupt alles umsetzbar ist. :cry:

Nachtrag: Scheinbar habe ich mich geirrt bezüglich der Download-Fähigkeiten. Es gibt Plugins wie das "Inno Download Plugin", die einen Blick wert sein könnten. :)

philipp.hofmann 4. Jan 2020 09:15

AW: Download aus INet - fertiger Code gesucht
 
Da hier TIdHTTP empohlen wurde: Würde ich nicht mehr benutzen, v.a. nicht mehr Plattform übergreifend, für SSL braucht man da zusätzlich OpenSSL.
Die Alternative bessere TNetHTTPClient nutzt die jeweilige Betriebssystem-SSL-Implementierung, deutlich einfacher und v.a. unterstützt auch alle neuen SSL-Protokolle.
Aber generell würde auch ich für das grundlegende Problem auch zu InnoSetup tendieren und den Mehraufwand in Kauf nehmen.

Guido Eisenbeis 4. Jan 2020 17:06

AW: Download aus INet - fertiger Code gesucht
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1454410)
Die Alternative bessere TNetHTTPClient nutzt die jeweilige Betriebssystem-SSL-Implementierung, deutlich einfacher und v.a. unterstützt auch alle neuen SSL-Protokolle.

Vielen Dank für deinen Hinweis! :)

Leider ist es mir nicht gelungen, Delphi-Code zu finden, der auch nur eine einzige Datei (ca. 5 MB) downloaded. Das Meiste ist aus den frühen 2000ern! Die Codes sind entweder nicht zum Laufen zu bringen (lassen sich nicht kompilieren, weil alles veraltet ist), oder sie laden von den 5 MB nur 40 KB runter. Aktuelle Codes scheint es nicht zu geben.

Hast du ein Code Beispiel für TNetHTTPClient?

Redeemer 4. Jan 2020 18:01

AW: Download aus INet - fertiger Code gesucht
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454428)
Leider ist es mir nicht gelungen, Delphi-Code zu finden, der auch nur eine einzige Datei (ca. 5 MB) downloaded. Das Meiste ist aus den frühen 2000ern! Die Codes sind entweder nicht zum Laufen zu bringen (lassen sich nicht kompilieren, weil alles veraltet ist), oder sie laden von den 5 MB nur 40 KB runter. Aktuelle Codes scheint es nicht zu geben.

TDownloadURL gibt es beispielsweise seit ich mich erinnern kann, und der komplette Code sieht seit eher so aus:
Delphi-Quellcode:
DownloadURL1.Execute;

Ach verdammt, ich wollte ja keinen fertigen Code posten.

Dann mach ich's hier besser:
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454428)
Hast du ein Code Beispiel für TNetHTTPClient?

Delphi-Referenz durchsuchenSystem.Net.HttpClientComponent.TNetHTTPClient.Get

Guido Eisenbeis 4. Jan 2020 18:37

AW: Download aus INet - fertiger Code gesucht
 
Zitat:

Zitat von Redeemer (Beitrag 1454429)
TDownloadURL gibt es beispielsweise seit ich mich erinnern kann, ...

Das ist scheinbar das Problem, denn in Delphi 10.3 finde ich die Componente nicht.

Luckie 4. Jan 2020 19:40

AW: Download aus INet - fertiger Code gesucht
 
Google-Suche, erster Treffer: http://docs.embarcadero.com/products...wnLoadURL.html

philipp.hofmann 4. Jan 2020 21:44

AW: Download aus INet - fertiger Code gesucht
 
Die einfachste Variante, wenn man nur eine Datei herunterlädt (läuft bei mir in sowieso in einem Thread, daher geht auch die Fortschrittsanzeige und der direkte Aufruf von ohne get an TNetHTTPClient):

Delphi-Quellcode:
var httpClient: TNetHTTPClient;
    ms:TStream;
begin
  httpClient:=TNetHTTPClient.create(nil);
  try
    httpClient.OnAuthEvent:=NetHTTPClientAuthEvent;
    httpClient.OnReceiveData:=NetHTTPClientReceiveData;
    httpClient.ConnectionTimeout:=60000;
    httpClient.ProxySettings := TProxySettings.Create(xxx,yyy);
    ms:=TFileStream.Create(localFileName,fmCreate or fmOpenReadWrite);
    try
      httpClient.Get('https://'+remoteFileName,ms);
    finally
      ms.Free();
    end;
  finally
    httpClient.free();
  end;

procedure TForm.NetHTTPClientAuthEvent(const Sender: TObject; AnAuthTarget: TAuthTargetType; const ARealm, AURL: string; var AUserName, APassword: string; var AbortAuth: Boolean; var Persistence: TAuthPersistenceType);
begin
  AUserName:=xxx;
  APassword:=yyy;
end;

procedure TForm.NetHTTPClientReceiveData(const Sender: TObject; AContentLength, AReadCount: Int64; var Abort: Boolean);
begin
  //todo: Fortschrittsanzeige
end;
Ob Du ein OnAuthEvent oder ProxySettings benötigst hängt an der jeweiligen Konfiguration, wahrscheinlich eher nein und man kommt natürlich auch ohne OnReceiveData aus).

Guido Eisenbeis 5. Jan 2020 02:31

AW: Download aus INet - fertiger Code gesucht
 
@philipp.hofmann

Dein Code hat mir den Einstieg ermöglicht. Ich bin nun in der Lage, eine Datei herunterzuladen, eine Fortschrittsanzeige zu zeigen und einen laufenden Download abzubrechen.

Vielen Dank für deine Hilfe! :thumb:

KodeZwerg 7. Jan 2020 07:10

AW: Download aus INet - fertiger Code gesucht
 
Guten Morgen, folgender Kode hat mir immer brav gedient, allerdings ohne Https Unterstützung.

Delphi-Quellcode:
(*

Simples Http-Get Beispiel,
hier steht nur das dürftigste drinnen,
sollte aber dennoch recht verständlich sein.
Hierbei bleibt das Kompilat relativ schlank da alles nativ abläuft.

*)



// ************* Header

{$IFNDEF MSWindows}
{$MESSAGE ERROR 'This program/unit is made for Windows only!'}
{$ENDIF MSWindows}

{$IF CompilerVersion >= 23}
{$DEFINE NameSpace}
{$IFEND CompilerVersion}



// ************* Uses

uses
{$IFDEF NameSpace}
  Winapi.Classes,
  Winapi.WinInet;
{$ELSE NameSpace}
  Classes,
  WinInet;
{$ENDIF NameSpace}



// ************* Methode

procedure HttpGet(const Url: string; Data: TStream);
const
  BuffSize = 1024 * 1024;
var
  hInter: HINTERNET;
  UrlHandle: HINTERNET;
  BytesRead: DWORD;
  Buffer: Pointer;
begin
  hInter := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hInter) then
  begin
    Data.Seek(0, 0);
    GetMem(Buffer, BuffSize);
    try
      UrlHandle := InternetOpenUrl(hInter, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if Assigned(UrlHandle) then
      begin
        repeat
          InternetReadFile(UrlHandle, Buffer, BuffSize, BytesRead);
          if BytesRead > 0 then
            Data.WriteBuffer(Buffer^, BytesRead);
        until BytesRead = 0;
        InternetCloseHandle(UrlHandle);
      end;
    finally
      FreeMem(Buffer);
    end;
    InternetCloseHandle(hInter);
  end
end;



// ************* Beispiel

procedure DoJob;
var
  DataStream: TMemoryStream;
begin
  DataStream := TMemoryStream.Create;
  try
    try
      HttpGet('http://download-adresse.com/Filename.ext', DataStream);
      if DataStream.Size > 0 then
        DataStream.SaveToFile('X:\Pfad\Lokal-Filename.ext'); // oder mach halt was anderes mit dem Stream...
    except
      on E: exception do
        ShowMessage(E.Message);
    end;
  finally
    DataStream.Free;
  end;
end;

Guido Eisenbeis 7. Jan 2020 07:23

AW: Download aus INet - fertiger Code gesucht
 
Guten Morgen.

Heute komme ich nicht mehr dazu, aber morgen werde ich mir den Code ansehen. Vielen Dank! :)

Guido Eisenbeis 10. Jan 2020 15:39

AW: Download aus INet - fertiger Code gesucht
 
@KodeZwerg

Ich habe deinen Code ausprobiert. Ich habe ein paar einfache Test durchgeführt, und er funktioniert, wie du gesagt hast, für HTTP, aber nicht für HTTPS. So weit, so gut.

Vielen Dank für den Code! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz