Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: TCP Socket (+ HTTP_GET) möglichst ohne Komponenten

  Alt 20. Okt 2009, 19:17
Bei BinärenDaten liefert die Methode Responsetext einen Fehler. Jetzt musst du ResponseBody verwenden.
Dieses liefert dir ein eindimensionales varArray zurück, auf dessen Inhalt du dann folgendermaßen zugreifen kannst:
(Achtung du musst jetzt die Unit Variants einbinden, welche dein Programm gleich wieder ein schönes Stück größer macht)

Delphi-Quellcode:
var vArray:Variant;

//also anstatt Responsetext:
vArray:=XMLHttpRequest.responsebody;
Zugriff geht jetzt bspw. über vArray[0] bis vArray[x]. Die einzelnen Bytes kannst du jetzt in eine Datei speichern oder anzeigen, wenn du sie interpretieren kannst.
Von wo bis wo das Array im Index läuft bekommst du über die Funktionen varArrayLowBound(vArray,1) und VarArrayHighBound(...) heraus. Die eins steht für die erste Dimension (in diesem Fall ist nur eine zu erwarten)
Mit VarArrayLock bekommst du einen Zeiger auf die gesamten Daten, den man recht simpel speichern kann, das sähe folgendermaßen aus:
Delphi-Quellcode:
procedure SaveToFile(x:Variant);
var len:Integer;
    Data:Pointer;
    hFile:THandle;
    temp:Cardinal;
begin
  len:=VarArrayHighBound(x,1)-VarArrayLowBound(x,1);//Länge ermitteln
  Data:=VarArrayLock(x); //Pointer auf den ArrayInhalt bekommen
  try
    hfile:=CreateFile('D:\test.jpg',Generic_Write,0,nil,Create_Always,0,0); //Datei öffnen über WinAPI (ich habe als test ein JPG-Bild geladen)
    try
      Writefile(hfile,Data^,len,temp,nil); //Inhalt schreiben (Achtung! Derzeit keine Fehlerbehandlung)
    finally
      closehandle(hFile); //Datei schließen
    end;
  finally
    VarArrayUnlock(x); //Zugriff auf Array wieder freigeben
  end;
end;

Edit:
Um ohne den Comfort der Unit Variants auszukommen (EXE-Datei wird kleiner) geht obige Funktion auch so:
Delphi-Quellcode:
procedure SaveToFile(x:Variant);
var len:Integer;
    psa:PSafeArray;
    Data:Pointer;
    hFile:THandle;
    temp:Cardinal;
    UBound,LBound:Integer;
begin
  psa:=PSafeArray(TVarData(x).VArray);
  SafeArrayGetUBound(psa,1,UBound);
  SafeArrayGetLBound(psa,1,LBound);
  len:=UBound-LBound;
  SafeArrayAccessData(psa,Data);
  try
    hfile:=CreateFile('D:\test.jpg',Generic_Write,0,nil,Create_Always,0,0);
    try
      Writefile(hfile,Data^,len,temp,nil);
    finally
      closehandle(hFile);
    end;
  finally
    SafeArrayUnaccessData(psa);
  end;
end;
Edit2:
All das funktioniert nur, wenn auf dem Rechner der IE installiert ist (wovon man derzeit noch ausgehen kann). Aber andere Browser gehen eben mit der Änderung des Ressourcenstrings auch (sollten zumindest). Das liegt daran, dass diese Klasse die hier benutzt wird quasi standardisiert ist (den genauen Status kenne ich leider nicht). Und deshalb sind diese Funktionen wohl auch in Linux verfügbar. Wie man das aber dort macht, weiß ich nicht.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat