|
-
Jun 5th, 2002, 01:26 AM
#1
Thread Starter
Hyperactive Member
InternetOpenURL(), InternetReadFile() problem... download running away (wininet dll)
I have a program that downloads files from the web (automatically) and stores them. I do the downloading with the code below (give to me by someone else on this board!) and it works great... for no reason at all - sometimes the downloads just seem like they don't even try to DL and my program just goes through page after page (kinda like it runs away). Since these are compiled instances I can't see what's wrong... I'm trying to test it in the development environment to see what's up but it's not recreating the problem.
I am on a cable modem and I have multiple instances of the software working... it'll work fine (sometimes hours after starting, and others just minutes after starting) and then the program will just start running away and going through pages it needs to download... acting like they downloaded but they definately didn't.
I know I have give nothing to base a hypothesis of what's wrong on, but I was jsut wondering if anyone knows of an inherit problem with this code, something that the cable modem/ISP could do to trigger this behavior, or something I might be doing wrong that could cause this.
Thanks
VB Code:
'downloading for the 'download' bit
Option Explicit
Private Declare Function InternetOpen Lib "wininet.dll" 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 InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal sURL As String, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
Private Const IF_FROM_CACHE = &H1000000
Private Const IF_MAKE_PERSISTENT = &H2000000
Private Const IF_NO_CACHE_WRITE = &H4000000
Private Const BUFFER_LEN = 256
Dim source As String
Public Function GetURLSource(sURL As String)
On Error GoTo ErrorHandler
Dim sBuffer As String * BUFFER_LEN, iResult As Integer, sData As String
Dim hInternet As Long, hSession As Long, lReturn As Long
hSession = InternetOpen("vb wininet", 1, vbNullString, vbNullString, 0)
If hSession Then hInternet = InternetOpenUrl(hSession, sURL, vbNullString, 0, IF_NO_CACHE_WRITE, 0)
If hInternet Then
iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, lReturn)
sData = sBuffer
Do While lReturn <> 0
iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, lReturn)
sData = sData + Mid(sBuffer, 1, lReturn)
Loop
End If
iResult = InternetCloseHandle(hInternet)
GetURLSource = sData
Exit Function
ErrorHandler:
'MsgBox "Sub/Function: GetURLSource" & vbCrLf & vbCrLf & "Encountered error #" & Err.Number & vbCrLf & Err.Description
Resume Next
End Function
PS: When I unplug my ethernet cable they all 'wait' and stop where they are... then when I plug it back in they resume... this is a great feature but it means that it isn't because the internet connection might be lost or timeout.
-
Jun 5th, 2002, 02:30 AM
#2
You only check the lReturn value. If lReturn = 0 you assume the download is complete. I guess there are other circumstances where the number of bytes read can be zero, without reaching the eof (connection problems for instance).
MSDN says eof is reached when the number of bytes read returns 0 and the function returns True (I guess this is a C++ True, so it will return a 1)
Try if changing:
Do While lReturn <> 0
into
Do Untill (lReturn = 0 And iResult = 1)
will solve your problem.
-
Jun 5th, 2002, 09:05 AM
#3
Oh, I just noticed you only close the urlhandle. You should close the sessionhandle as well. This could be the cause of your problem.
After you close the URL handle, add this line:
iResult = InternetCloseHandle(hSession)
BTW, you could use the same session for other downloads as well, that way you don't need to open a new session every time.
This could improve your performance as well. Just don't forget to close the handle when your done.
-
Jun 5th, 2002, 09:08 AM
#4
GetLastError does not work as expected from VB, because Visual Basic will call this function automatically after an API call. VB returns this value in Err.LastDLLError.
Change:
If GetLastError <> 0 Then
to
If Err.LastDllError <> 0
-
Jun 5th, 2002, 02:57 PM
#5
Thread Starter
Hyperactive Member
Ahhh! I see what you are saying... it's interesting because I guess I 'used up' all my sessions but there must be a ton of sessions given to a program because I went through like 2000 downloads before it happened! Are hSessions allocated per program instance... because if you started another instance of my download prog it would work.
I have posted my new code below, tell me how it looks/if you would change anything. I noticed this code floating around this message board and that's how I got it but I guess it's wrong so hopefully this will help some other people out too :-).
VB Code:
Public mySession As Long
Public Function openInternetSession()
' This function opens the internet session when the program starts (instead of everytime)
' remember to close the session or you will get runaways!
Dim hSession As Long
hSession = InternetOpen("vb wininet", 1, vbNullString, vbNullString, 0)
If Err.LastDllError <> 0 Then
MsgBox "Download Module: GetURLSource, error opening internet session" & vbCrLf & vbCrLf & "Error:" & vbCrLf & GetLastError
End If
If hSession Then
mySession = hSession ' now we will use the global variable 'mySession' to access this internet session
Else
MsgBox "Error: Couldn't open internet session!"
End If
End Function
Public Function closeInternetSession()
' Close the internet session
Dim iResult As Integer
iResult = InternetCloseHandle(mySession)
End Function
Public Function GetURLSource(sURL As String)
On Error GoTo ErrorHandler
Dim sBuffer As String * BUFFER_LEN, iResult As Integer, sData As String
Dim hInternet As Long, lReturn As Long
hInternet = InternetOpenUrl(mySession, sURL, vbNullString, 0, IF_NO_CACHE_WRITE, 0)
If hInternet Then
iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, lReturn)
sData = sBuffer
Do While lReturn <> 0
iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, lReturn)
sData = sData + Mid(sBuffer, 1, lReturn)
Loop
End If
iResult = InternetCloseHandle(hInternet)
GetURLSource = sData
Exit Function
ErrorHandler:
MsgBox "Sub/Function: GetURLSource" & vbCrLf & vbCrLf & "Encountered error #" & Err.Number & vbCrLf & Err.Description
Resume Next
End Function
That look about right?
Thanks a lot franz!
-
Jun 6th, 2002, 01:11 AM
#6
Originally posted by davem
That look about right?
Thanks a lot franz!
I think it looks about right, but I guess the real question would be: Did it solve your problem?
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|