[VB6] Download progress tonen

Pagina: 1
Acties:

  • WimB
  • Registratie: Juli 2001
  • Laatst online: 30-03-2024
Ik zou graag in Visual Basic bestanden kunnen downloaden en door middel van een voortgangsindicator tonen hoeveel er al gedownload is. De downloads zouden zowel http als ftp moeten kunnen zijn.

Eerst heb ik heel wat zitten frutsen met de Inet control van VB6. Maar ik kon er maar geen voortgangsindicator aan vastkrijgen. Verder heb ik nog wat Winsock-code zien voorbijkomen, maar die was te ingewikkeld om te kunnen begrijpen.

Toen ondekte ik dit. Een C++ programma dat gewoon Internet Explorer gebruikt. Leek me zeer handig. Na een tijdje kreeg ik de C++ functieaanroep omgevormd naar Visual Basic:

code:
1
2
3
4
5
6
7
8
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
    (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
    ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Private Sub Command1_Click()
    Dim llRetVal As Long
    llRetVal = URLDownloadToFile(0, "http://www.test.com", "C:\test.txt", 0, 0)
End Sub

Met bovenstaande code kan ik zonder problemen een bestand downloaden. Nu zou ik echter de functie OnProgress moeten gebruiken om de voortgang te verkrijgen. Maar ik weet niet hoe dit in Visual Basic te implementeren.

Heeft er iemand een idee hoe ik een voortgangsindicator van een download voor elkaar krijg in Visual Basic?

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 23-05 21:15

Sponge

Serious Game Developer

Misschien heb je hier iets aan. Mvps.org rules :)

http://www.mvps.org/emorcillo/vb6/inet/adl.shtml

Overigens gok ikdat je het kunt doen met AddressOf, die dan in de laatste argument mee gaat van die Downloadtofile functie. Check AddressOf maar even op google, wordt vaak gebruikt bij callback/enumerations e.d.

[ Voor 52% gewijzigd door Sponge op 17-06-2004 23:22 ]


  • WimB
  • Registratie: Juli 2001
  • Laatst online: 30-03-2024
Ik ben het aan 't bekijken, maar dat ziet er niet zo eenvoudig uit.

edit:
Ik heb het getest, en het werkt. Het enige probleem is dat je een bestand maar één keer kan downloaden. Daarna wil hij het niet meer doen totdat ik de tijdelijke internetbestanden heb geleegd. Dat is natuurlijk ook niet de bedoeling.
Overigens gok ikdat je het kunt doen met AddressOf, die dan in de laatste argument mee gaat van die Downloadtofile functie. Check AddressOf maar even op google, wordt vaak gebruikt bij callback/enumerations e.d.
In combinatie met C++ vind ik veel, maar met Visual Basic is 't maar pover.

[ Voor 19% gewijzigd door WimB op 18-06-2004 09:11 ]


  • WimB
  • Registratie: Juli 2001
  • Laatst online: 30-03-2024
Na grondiger onderzoek blijkt dit niet te werken voor grotere bestanden. Heel het bestand wordt namelijk opgeslagen in een array. En dat kan hij na een tijdje niet meer aan. Er zal dus een andere oplossing uit de bus moeten komen.

Ik ben in ieder geval al tot de conclusie gekomen dat downloaden met een progressbar onder Visual Basic niet vanzelfsprekend is.

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Kan je dit niet gebruiken?

Visual Basic:
1
2
3
4
5
Private Declare Function DoFileDownload Lib "shdocvw.dll" (ByVal lpszFile As String) As Long

Private Sub Command1_Click()
    DoFileDownload StrConv("http://www.test.com", vbUnicode)
End Sub

[ Voor 14% gewijzigd door LuCarD op 18-06-2004 13:18 ]

Programmer - an organism that turns coffee into software.


  • WimB
  • Registratie: Juli 2001
  • Laatst online: 30-03-2024
Ik ben bovenstaande code aan 't bewerken geweest en nu is het mij gelukt. Ik heb alles van het opslaan in het geheugen eruit gegooid. Ik heb in die Class Module van bijna 650 regels uiteindelijk enkel deze code behouden:
code:
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
Implements IBindStatusCallback

Event DownloadComplete()
Event Progress(Percent As Long)

Sub Download(URL As String, FileName As String)
   URLDownloadToFileW Me, URL, FileName, 0, Me
End Sub

Private Sub IBindStatusCallback_OnProgress(ByVal ulProgress As Long, _
        ByVal ulProgressMax As Long, _
        ByVal ulStatusCode As olelib.BINDSTATUS, _
        ByVal szStatusText As Long)
   Dim lPercent As Long
   If ulProgressMax <> 0 Then lPercent = ulProgress * 100 / ulProgressMax
   RaiseEvent Progress(lPercent)
End Sub

Private Sub IBindStatusCallback_OnStopBinding(ByVal hresult As Long, _
        ByVal szError As Long)
   RaiseEvent DownloadComplete()
End Sub

Private Sub IBindStatusCallback_GetBindInfo(grfBINDF As olelib.BINDF, _
        pbindinfo As olelib.BINDINFO)
End Sub

Private Function IBindStatusCallback_GetPriority() As Long
End Function

Private Sub IBindStatusCallback_OnDataAvailable(ByVal grfBSCF As olelib.BSCF, _
        ByVal dwSize As Long, _
        pformatetc As olelib.FORMATETC, _
        pstgmed As olelib.STGMEDIUM)
End Sub

Private Sub IBindStatusCallback_OnLowResource(ByVal reserved As Long)
End Sub

Private Sub IBindStatusCallback_OnObjectAvailable(riid As olelib.UUID, _
        ByVal punk As stdole.IUnknown)
End Sub

Private Sub IBindStatusCallback_OnStartBinding(ByVal dwReserved As Long, _
        ByVal pib As olelib.IBinding)
End Sub

Graag zou ik die lege functies ook nog verwijderen, maar dan krijg ik een foutmelding in deze stijl:
Object module needs to implement 'OnStartBinding' for interface 'IBindStatusCallback'
Als ik nu een bestand wil downloaden, roep ik dit zo op:
code:
1
2
Set oADL = New AsyncDownload
oADL.Download strURL, strLocatie

En de ProgressBar werkt zo:
code:
1
2
3
4
5
Private Sub oADL_Progress(Percent As Long)
    prgVooruitgang.Value = Percent
    lblStatus.Caption = "Bezig met downloaden van bestand (" & CStr(Percent) & "%)"
    DoEvents
End Sub

Ik heb er veel tijd in gestoken, maar ik ben blij met het resultaat :)

edit:
Je hebt wel OLELIB.TLB nodig om dit werkend te krijgen

[ Voor 18% gewijzigd door WimB op 20-06-2004 14:55 ]


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Nice.... _/-\o_

Copy paste to private lib... :) thx... Niet direct nodig maar dit gaat zeker een keer van pas komen...

[ Voor 5% gewijzigd door LuCarD op 19-06-2004 18:41 ]

Programmer - an organism that turns coffee into software.


  • WimB
  • Registratie: Juli 2001
  • Laatst online: 30-03-2024
LuCarD schreef op 19 juni 2004 @ 18:41:
[...]


Nice.... _/-\o_

Copy paste to private lib... :) thx... Niet direct nodig maar dit gaat zeker een keer van pas komen...
Bedankt voor de complimenten. Je mag trouwens opnieuw copy-pasten naar je private lib, want ik heb nog een paar kleinigheden gewijzigd.

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 23-05 21:15

Sponge

Serious Game Developer

"Object module needs to implement 'OnStartBinding' for interface 'IBindStatusCallback'"

is een fout die wel vaker voorkomt. Het component verwacht dat je alle events in je code hebt staan. Zelfde geval is bij DirectPlay8. Dit hoort gewoon zo. :)
Pagina: 1