Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0227: Dateien mit der Wininet laden

 von 

Beschreibung 

Die Wininet kann nicht nur mit dem FTP-Protokoll umgehen sondern auch "normale" www-Dateien laden.Dieses Besipiel zeigt wie eine HTML-Seite aus dem Internet geladen werden kann.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

InternetCloseHandle, InternetOpenA (InternetOpen), InternetOpenUrlA (InternetOpenUrl), InternetReadFile

Download:

Download des Beispielprojektes [2,45 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Textfeld "Text2"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Schaltfläche "Command1"

Option Explicit

Private Declare Function InternetOpen Lib "wininet" Alias _
        "InternetOpenA" (ByVal sAgent As String, ByVal _
        lAccessType As Long, ByVal sProxyName As String, ByVal _
        sProxyBypass As String, ByVal lFlags As Long) As Long
        
Private Declare Function InternetCloseHandle Lib "wininet" _
        (ByVal hInet As Long) As Integer
        
Private Declare Function InternetReadFile Lib "wininet" _
        (ByVal hFile As Long, ByVal sBuffer As String, ByVal _
        lNumBytesToRead As Long, lNumberOfBytesRead As Long) _
        As Integer
        
Private Declare Function InternetOpenUrl Lib "wininet" Alias _
        "InternetOpenUrlA" (ByVal hInternetSession As Long, _
        ByVal lpszUrl As String, ByVal lpszHeaders As String, _
        ByVal dwHeadersLength As Long, ByVal dwFlags As Long, _
        ByVal dwContext As Long) As Long


Const INTERNET_OPEN_TYPE_DIRECT = 1
Const INTERNET_OPEN_TYPE_PROXY = 3
Const INTERNET_FLAG_RELOAD = &H80000000

Const UserAgent = "Wininet Test"

Private Sub Command1_Click()
  Dim l&, Buffer$, hOpen&, hFile&, Result&
  
    
    l = 50000
    Buffer = Space(l)
    Text1.Text = ""
    DoEvents
    
    MousePointer = vbHourglass
    hOpen = InternetOpen(UserAgent, INTERNET_OPEN_TYPE_DIRECT, _
                         vbNullString, vbNullString, 0)
  
    hFile = InternetOpenUrl(hOpen, Text2.Text, vbNullString, _
                            ByVal 0&, INTERNET_FLAG_RELOAD, _
                            ByVal 0&)
                            
    Call InternetReadFile(hFile, Buffer, l, Result&)
    Call InternetCloseHandle(hFile)
    Call InternetCloseHandle(hOpen)
    
    Buffer = Left$(Buffer, Result)
    Text1.Text = Buffer
    MousePointer = vbDefault
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 15 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Dirk Nestl am 19.03.2010 um 21:01

Hallo Roger,

wie schon Kai Fuchs geschrieben hat:

"To ensure all data is retrieved, an application must continue to call the InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero."

Grund dafür: Es dauert unter Umständen einen Moment, bis Daten empfangen werden. Wird zu früh abgefragt (oder in zu kurzen Intervallen) befindet sich noch/wieder nichts im Emfangspuffer und die "Bytes" sind deshalb 0.

Kommentar von Roger am 19.03.2010 um 15:51

Obschon ich den unten beschriebenen Loop mache, bleibt "Buffer" manchmal leer

Do
InternetReadFile hURL, Buffer, Len(Buffer), Bytes
If Bytes = 0 Then Exit Do
OpenURL = OpenURL & Left$(Buffer, Bytes)
Loop


Was ist der Grund?

Kommentar von Dirk Nestl am 20.01.2008 um 13:36

Der Ansatz von Kai Fuchs ist sehr gut, allerdings sollte man in die Schleife ein DoEvents einbauen, um dem System Zeit zum Atmen zu geben.

Man kann nun außerdem mit Len(s) die Länge der empfangenen Daten abfragen - wenn man jetzt noch vorab herausfinden könnte, wie groß die Datei ist ließe sich sogar ein ProgressBar erstellen.

Kommentar von Kai Fuchs am 06.12.2007 um 09:55

Zwar keine Lösung für Erwin's Problem, aber vielleicht hilft es anderen, die wie ich auch auf diesen Tread gestoßen sind, in der Hoffnung, eine Möglichkeit zu finden, alle Daten über "InternetReadFile" abzurufen. Bisher hatte da ja hier keiner eine Lösung.

Ich habe die Lösung bei MS gefunden:
"To ensure all data is retrieved, an application must continue to call the InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero."

Also einfach den Rückgabewert von "InternetReadFile" zusammen mit dem Wert in "Result" auswerten und eine Schleife drumherum bauen. Ergebnis: an eine String-Variable wird so oft der zurückgegebene Puffer angehängt, bis der Rückgabewert oder das "Result" 0 ist.

Bei obigem Beispiel sähe das dann also so aus:

...
hFile = InternetOpenUrl(hOpen, Text2.Text, vbNullString, _
ByVal 0&, INTERNET_FLAG_RELOAD, _
ByVal 0&)
Dim ReadFileOK As Boolean
Do
ReadFileOK = InternetReadFile(hFile, Buffer, l, Result&)
If ReadFileOK And Result > 0 Then
s = s & Left$(Buffer, Result)
End If
Loop While (ReadFileOK And Result > 0)

Call InternetCloseHandle(hFile)
Call InternetCloseHandle(hOpen)

Text1.Text = Buffer
...

Kommentar von Erwin Scheiber am 03.12.2007 um 16:49

Wie kann ich diese Function nutzen, wenn ich hinter einem Proxy-server mit Authentication bin?

Wie kann ich die Einstellungen (Proxy-Server name od. IP, Username, Password) an den Proxyserver übergeben?

Danke im Voraus.

cu
Erwin

Kommentar von klaus rüschke am 31.01.2006 um 21:03

hallo , noch mal ich.
habe es soeben ausprobiert. es ist leider nicht die gesuchte funktion.
ich möchte nicht den html-quelltext laden, sondern die seite aus einem selbst gebauten webbrowser mit bildern auf die festplatte laden.(mit vb6 grprogt)
biher werden die seiten immer unvollständig geladen.

danke dennoch sehr

klaus

Kommentar von Klaus Rüschke am 31.01.2006 um 19:50

hallo,
ich hätte gern die api-function, um auf die "speichern_unter" funktion des ie6 (aber die für komplette webseite)
die funktion, die ich nutze lädt keine bilder

danke

Kommentar von Wänä am 27.01.2005 um 10:11

Dieser Tipp funzt bei mir gut. Jedoch bekomme ich bei div. www-Seiten trotz Erweiterung von l auf 150000 nicht alle
Daten heruntergeladen. Woran kann das liegen ?

Kommentar von Michael am 03.10.2004 um 22:53

Hallo, ich habe auch ein problem mit dem Abschneiden der Datei.
An VB liegt es meiner Meinung nach nicht,da ich ,wenn ich es mit c realisiere auf die selben 980 kümmerlichen stellen komme.Danach schneidet er einfach ab.(Die Datei hat ca 34000 stellen)

Kommentar von jaime am 06.05.2003 um 11:14

Hallo!
Wie kann ich die Ö,Ä statt Ãœ,Ä und so weiter richtig bekommen?
Jaime

Kommentar von Raller am 18.03.2003 um 15:36

Hallo Tenchi,
ich hätte Interesse an Deinem DownloadTool, aber die angegebene Seite ist nicht erreichbar.

Kommentar von Tenchi am 05.03.2002 um 15:02

Hallo! Ich arbeite gerade an einem Download-Tool (zu finden unter http://home.arcor.de/minako.aino/Downloader/ ), was soweit auch ganz gut funktioniert, bis auf eine Sache: Manche Seiten erwarten einen Referrer, wenn man was runterladen will. Wie kann ich jetzt einen Referrer senden?

Kommentar von Arcus am 24.07.2001 um 12:38

Ich habe ein größeres Problem damit, was allerdings wohl eher ein VB-Problem ist: Ich lade per http Daten von einem httpd herunter. Diese Daten können nun den Rahmen von 100 kByte leicht sprengen, woraus mit VB ein Ergebnis liefert, bei welchem das Ende einfach fehlt. Ich dachte erst es sei ein Problem der Winsock-Zugriffe, allerdings scheint es eher ein Problem des Speichermanagements zu sein. In welche Datenstruktur kann ich eine Website laden, so daß sie auch 100 oder 200 oder mehr kByte groß sein kann?

Kommentar von Adrian Föder am 29.03.2001 um 20:18

Das Beispiel ist okay, kommt v.A. ohne direkt eingebettete msinet.ocx aus.
Aber:
mit eingebetteter inet.ocx sieht der Code so aus:
Text2.Text = Inet1.OpenURL(Text1.Text)
Oder habe ich irgendetwas falsch verstanden? Macht Euer Beispiel mehr?
Dazu noch eine Frage:
die Methodik übermittelt nur eine bestimmte maximale Größe der Datei.
kann man das irgendwie fixen?
thx
adrian

Kommentar von Clemens Siebler am 12.02.2001 um 17:18

Also erstmal SUPER TIPP! Klappt echt super nur ich hab nun eine Frage: Wie kann ich machen, dass es eine ca 20 MB große Datei aus dem Internet auf meine Festplatte abspeichert und das nicht über den IE-Dialog läuft! Vielen Dank im Voraus, Clemens Siebler