Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Inhalt einer HTTP-Datei direkt in String laden (https://www.delphipraxis.net/91980-inhalt-einer-http-datei-direkt-string-laden.html)

CalganX 12. Mai 2007 19:00


Inhalt einer HTTP-Datei direkt in String laden
 
Hi,
da ich dummerweise im Moment nicht über MS XML an meine XML-Daten komme, sondern auf eine Bibliothek zurückgreifen muss, die nur lokale Dateien oder einen XML-String verarbeiten kann, möchte ich die XML-Datei direkt in den Speicher laden. Entweder in einen Stream oder in einen String.

Gibt es dafür API-Funktionen? Indys sind keine Lösung. ;)

Chris

mkinzler 12. Mai 2007 19:03

Re: Inhalt einer HTTP-Datei direkt in String laden
 
Mit was lädst du die Datei?
INDY
LoadToStream

CalganX 12. Mai 2007 19:04

Re: Inhalt einer HTTP-Datei direkt in String laden
 
Hi,
noch gar nicht. Ich will ja gerade über HTTP an die Datei herankommen. Und eben nicht über die Indys, sondern über API-Funktionen. ;)

Chris

mkinzler 12. Mai 2007 19:06

Re: Inhalt einer HTTP-Datei direkt in String laden
 
Wo liegen die Dateien?

inherited 12. Mai 2007 19:07

Re: Inhalt einer HTTP-Datei direkt in String laden
 
Warscheinlich auf einem HTTP-Server ;)

CCRDude 12. Mai 2007 20:53

Re: Inhalt einer HTTP-Datei direkt in String laden
 
Ich hab hier mal was zusammengeschrieben, um per "API" (sprich den Wininet.dll-Funktionen) Daten herunterzuladen, als Indy für mich auch keine Alternative war (gibt's eh noch nicht für Windows Mobile ;) ). Auch direkt in einen Stream möglich.

CalganX 12. Mai 2007 21:47

Re: Inhalt einer HTTP-Datei direkt in String laden
 
Hi,
ja, auf die WinINet-Komponenten bin ich auch gerade gestoßen. Meine Lösung sieht so aus:
Delphi-Quellcode:
var
  hSession, hXmlFile: hInternet;
  pCode: array[1..10] of WideChar;
  dwCodeLen, dwIndex, dwNumToRead, dwRead: Cardinal;
  buf: array[0..MAX_CACHE_ENTRY_INFO_SIZE] of WideChar;
begin
  Result := '';

  // Internet-Session öffnen
  hSession := InternetOpen('XmlDownloader/1.0', INTERNET_OPEN_TYPE_PRECONFIG,
                nil, nil, 0);

  // Fehlgeschlagen
  if (hSession = nil) then
  begin
    raise Exception.Create('Konnte keine Verbindung zum Internet herstellen.');
    Exit;
  end;

  // URL öffnen
  hXmlFile := InternetOpenUrl(hSession, PChar(DataURL), nil, 0,
                INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_CACHE_WRITE
                or INTERNET_FLAG_NO_COOKIES, 0);
  if (hXmlFile = nil) then
  begin
    raise Exception.Create('Verbindung zur XML-Datei fehlgeschlagen.');
    Exit;
  end;

  // Verfügbarkeit überprüfen
  dwIndex := 0;
  dwCodeLen := 10;
  HttpQueryInfo(hXmlFile, HTTP_QUERY_STATUS_CODE, @pCode, dwCodeLen, dwIndex);
  if not ((PChar(@pCode) = '200') or (PChar(@pCode) = '302')) then
  begin
    raise Exception.Create('Die Datei konnte nicht geladen werden. Fehler: '
                            + PChar(@pCode));
    Exit;
  end;

  dwNumToRead := SizeOf(buf)-1;
  // Datei zusammensetzen
  while (InternetReadFile(hXmlFile, @buf, dwNumToRead, dwRead)) do
  begin
    if dwRead = 0 then
      break;
    // Null-terminieren
    buf[dwRead] := #0;
    Result := Result + WideString(@buf);
  end;

  // Handle wieder schließen
  InternetCloseHandle(hXmlFile);
  InternetCloseHandle(hSession);
end;
Das funktioniert auch wunderbar - zumindest für das was es soll. :?

Danke trotzdem für deine Unit,
Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:17 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