Autor Beitrag
goldensurfer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45



BeitragVerfasst: Mo 24.01.05 20:34 
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 :wink:

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. :evil:

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

ausblenden volle Höhe Delphi-Quelltext
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 //ueber Proxy gehen
      hSession := InternetOpen(Nil, INTERNET_OPEN_TYPE_DIRECT, nilnil0)
    else  //direkte Verbindung ins Internet
      hSession := InternetOpen(NIL, INTERNET_OPEN_TYPE_PROXY, PChar(sProxy), NIL0);

    hURL := InternetOpenURL(hSession, PChar(sURL), nil0, 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 user profile iconraziel: Code- durch Delphi-Tags ersetzt.
wunsiedler
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 506
Erhaltene Danke: 4

Win7

BeitragVerfasst: Mo 24.01.05 20:55 
Probier die Indy-Komponente IDHTTP

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
 try
  text := idhttp1.Get('http://www.adresse.de/seite.htm');
 except
  showmessage('Fehler');
 end;
goldensurfer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45



BeitragVerfasst: Di 25.01.05 08:58 
wunsiedler hat folgendes geschrieben:
Probier die Indy-Komponente IDHTTP


Ja, da habe ich auch schon dran gedacht... ist leider ziemlich umfangreich das gesamte Paket.

Inzwischen habe ich rausgefunden, wo zumindest bei der NMHTTP-Komponente das Problem liegt: die Property "Proxy" will nicht, wie z.B. ein Browser, einen Proxyserver in der Form 12.34.56.78 sondern einfach nur die IP-Adresse ohne http:// davor. Muss man erstmal drauf kommen... in dem Beispiel aus der Hilfe wird die property natürlich nur anhand eines Edit-Feldes gesetzt :P
wunsiedler
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 506
Erhaltene Danke: 4

Win7

BeitragVerfasst: Di 25.01.05 10:33 
goldensurfer hat folgendes geschrieben:

Ja, da habe ich auch schon dran gedacht... ist leider ziemlich umfangreich das gesamte Paket.

schau doch meinen quelltext an oben, wo ist der umfangreich. und liefert genau das zurück, was du haben willst: den quelltext.