Autor Beitrag
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Mo 01.08.22 19:49 
Moin,

Scheitere an einem einfachen Problem: Ich möchte ein JPG von einer URL in einer TPaintBox anzeigen. Problem: Die URL ist nur via https verfügbar und alle Beispiele die ich im Netz finde beziehen sich nur auf HTTP.

Konkret verwende ich folgenden Code:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.DownloadImage(Sender: TObject);
var
  MS : TMemoryStream;
  GIf: TJPEGImage;
  IdHTTP1: TIdHTTP;

begin
  MS := TMemoryStream.Create;
  GIf := TJPEGImage.Create;
  IdHTTP1 := TIdHTTP.Create(nil);

  try
    IdHTTP1.get('https://m.media-amazon.com/images/I/51EJCVDEW1L._AC_UY436_QL65_.jpg',MS);
    Ms.Seek(0,soFromBeginning);
    Gif.LoadFromStream(MS);
    PaintBox1.Canvas.Draw(0,0, GIF);

  finally
    FreeAndNil(GIF);
    FreeAndNil(MS);
  end;
end;


Führt dann zu einer Fehlermeldung (SSL Bibliothek konnte nicht geladen werden).
Ich vermute ich muss etwas nachinstallieren um Indy SSL-fähig zu machen. Weiß aber nicht wie das geht, sorry. Habe eine Erklärung gefunden, dass ich precompiled DLL-Dateien bei Indy erhalten würde. Habe ich nicht verstanden, könnte das jemand einfacher erklären? Meine Software läuft übrigens nur auf meinem Rechner, wird nicht weitergegeben. D.h. ich bräuchte mir keine Sorgen darum machen wie ein Nutzer an eine DLL-Datei käme, falls das eine Rolle spielt.

Danke & LG
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 01.08.22 21:19 
Hallo,

da dürften dir OpenSSL bzw. genauer Sichern von Indy-Netzwerkverbindungen weiterhelfen.

Programmcode dazu habe ich u.a. in TIDHTTP - Open SSL - TLS (3. Beitrag) gefunden.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 02.08.22 08:14 
Wenn du neuere Delphi-Versionen einsetzt, und auch die von MS nicht mehr unterstützten Windows-Versionen außen vor lassen willst, kannst du einfacher die internen THttpClient-Komponenten nutzen. Das kann von Haus aus https, ohne eigene SSL-Bibliotheken mitliefern zu müssen. Da werden wohl die Betriebssystem-Bibliotheken genutzt.

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.08.22 08:47 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du neuere Delphi-Versionen einsetzt, und auch die von MS nicht mehr unterstützten Windows-Versionen außen vor lassen willst, kannst du einfacher die internen THttpClient-Komponenten nutzen.
Das funktioniert sogar noch mit Windows 7, außer dass dort standardmäßig nicht alle neuen Protokolle (TLS 1.2, ...) vorhanden und aktiviert sind. Das betrifft aber dann ohnehin das System selbst, sollte daher kein Problem sein.

Delphi selbst unterstützt seit Delphi XE7 ja auch nur noch Windows 7 und höher.

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Das kann von Haus aus https, ohne eigene SSL-Bibliotheken mitliefern zu müssen. Da werden wohl die Betriebssystem-Bibliotheken genutzt.
Ja, THTTPClient nutzt die WinHTTP API.

Solange man keine zertifikatsbasierte Clientauthentifizierung (Mein Ticket dazu siehe hier) benötigt, funktioniert die Klasse auch sehr gut.
Karlson Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Di 02.08.22 16:26 
Hi,

Danke für eure Antworten!
Ich muss sagen, ich habe jetzt einen Workaround verwendet der noch einfacher ist.

ausblenden Quelltext
1:
2:
3:
4:
try
  URLMon.URLDownloadToFile(nil, PChar(Memo2.lines[0]), PChar('image1.jpg'), 0, nil);
finally
  Image1.Picture.LoadFromFile('image1.jpg');


Funktioniert mit SSL und reicht für mich...

Danke!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.08.22 20:23 
Ob das so eine gute Idee ist, in neuem Code noch den Internet Explorer zu verwenden? URLDownloadToFile macht nichts anderes als intern Funktionalität des Internet Explorers zu verwenden, um diesen Download durchzuführen.

Solange du das nur auf deinem eigenen PC nutzt, wird das vermutlich klappen. Auf meinem würde es aufgrund der Sicherheitseinstellungen nicht gehen (das habe ich zur Sicherheit auch gerade getestet, dem ist so) und z.B. in vielen Firmen auch nicht.

Du kannst aber davon ausgehen, dass zumindest neue Protokolle, die in den nächsten Jahren kommen mögen, damit auf jeden Fall nicht mehr gehen, da der Internet Explorer ja nicht mehr weiterentwickelt wird.
Karlson Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Mi 03.08.22 09:21 
Wichtiger Hinweis, danke.

Für mich passt es, weil die Software lediglich ein ganz kleines Helpertool für meinen Laptop ist. Ich werde das nie weitergeben (ist viel zu speziell dafür).

Aber für andere, die über den Code stolpern natürlich wichtig zu beachten.