Hallo zusammen,
habe seit einigen Jahren wieder mal den Delphi-Compiler (Version 4) für ein kleines Internet-Tool angeworfen... aber irgendwie blicke ich die Welt nicht mehr.
Untenstehende Funktion soll anhand der übergebenen URL (sURL) eine HTML-Seite laden und sie in einer Datei (sFilename) ablegen. Die Verbindung soll entweder direkt (sProxy = '') oder über einen Proxy gehen; in dem Fall enthält sProxy die Adresse incl. Port des Proxyservers.
In der Firma (dort ist die Verbindung nur über einen Proxy gestattet) funktioniert die function wunderbar. Zu Hause - DSL ohne Proxy - bricht sie ab. (DSL-Verbindung wurde vorher natürlich aufgebaut)
Eine hSession wird zwar noch zugewiesen, jedoch liefert InternetOpenURL stets den Wert NIL zurück. Ein testweise aufgerufenes GetLastError liefert den Wert 2 (und wenn ich der Microsoft Doku trauen kann, ist das ein File not found error).
Die untenstehende Funktion habe ich im Grundgerüst übrigens hier im Forum gefunden; dem Autor an dieser Stelle mal ein Dankeschön dafür
Versuchsweise habe ich dann mal eine zweite Funktion mit der TNMHTTP-Komponente geschrieben (genau das Beispiel aus der Hilfe zur Methode Get von TNMHTTP.) Das Beispiel lief zu Hause ohne Proxy wunderbar. Ich habe es dann mal in der Firma ausprobiert - da funktioniert dieses Beispiel nicht! Die Get-Methode schmeißt eine Exception.
Gibt es irgendwo ein funktionierendes Beispiel einer Funktion, die die beschriebene Aufgabe erledigen kann, und zwar
universell mit und ohne Proxy? Ich wollte eigentlich nicht eine Funktion für die Proxy-Verbindung wie unten stehend und eine zweite mit der TNMHTTP-Komponente für die Direktverbindung nutzen...
Danke,
Ralf
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
| function LoadToFile(sURL, sProxy, sFilename: String):Integer; const BufferSize = 8192; var Buffer: array[1..BufferSize] of char; BufferLen: DWORD; ok: Boolean; hSession: HInternet; hUrl: HInternet; f: File; written: integer; iLoaded: Integer; begin iLoaded := -1; result := -1; try if sProxy = '' then hSession := InternetOpen(Nil, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0) else hSession := InternetOpen(NIL, INTERNET_OPEN_TYPE_PROXY, PChar(sProxy), NIL, 0);
hURL := InternetOpenURL(hSession, PChar(sURL), nil, 0, INTERNET_FLAG_RELOAD, 0); if hURL=Nil then Exit; except result := -2; exit; end;
try if hURL <> Nil then begin AssignFile(f, sFilename); {$I-} Rewrite(f, 1); if ioresult <> 0 then begin result := -3; end; {$I+} iLoaded := 0; repeat ok := InternetReadFile(hURL, @Buffer, SizeOf(buffer), BufferLen); if not ok then begin result := -4; CloseFile(f); exit; end; iLoaded := iLoaded + Integer(BufferLen); BlockWrite(f, Buffer, BufferLen, written); until bufferlen < SizeOf(Buffer); end; finally InternetCloseHandle(hURL); InternetCloseHandle(hSession); CloseFile(f); end; result := iLoaded; end; |
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.