ايران ويج

نسخه‌ی کامل: دلیل هنگ هنگام استفاده از URLDownloadToFile
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام

دوستان دلیل هنگ کردن برنامه هنگاه استفاده از این ای پی آی URLDownloadToFile چیه؟

من یه سورس نمونه گذاشتم. تا وقتی که فایل کاملا دانلود و ذخیره نشه برنامه هنگ میکنه......

دانلود سورس نمونه

-----------------------------------------------------

سوال دیگه ای که دارم اینه که وقتی در یک webbrowser که navigate رو about:blank کردیم و بعد یک عکس وارد webbrowser کردیم:
کد:
webbrowser.document.body.innerhtml = "<img src=piclink>"
چطور میتونیم همین عکس رو از webbrowser ذخیره کنیم.

بدون استفاده از URLDownloadToFile, winsock یا winhttp
منظورم اینه نمیخوام فایل رو دانلود کنم. میخوام همون عکسی که در webbrowser لود شده رو ذخیره کنم. یعنی اگر عکس کاملا لود شده بود بلافاصله ذخیره بشه در دیسک سخت.

تشکر
سلام.
این api به این صورت کار میکنه. میتونی از InternetOpenUrl و InternetReadFile و ... استفاده کنی که پروگرس هم داشته باشی.

کد:
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 INTERNET_OPEN_TYPE_DIRECT = 1
Private Const INTERNET_OPEN_TYPE_PROXY = 3
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 hSession As Long

Public Sub DownloadFile(sUrl As String, strAdrs As String, blnUseProxy As Boolean)
Dim sBuffer As String * BUFFER_LEN, iResult As Integer, sData As String
Dim hInternet As Long, hSession As Long, lReturn As Long
    
    If blnUseProxy Then
        hSession = InternetOpen("Payman", INTERNET_OPEN_TYPE_PROXY, "127.0.0.1:8080", vbNullString, 1)
    Else
        hSession = InternetOpen("Payman", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 1)
    End If
    
    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)
    DoEvents
    Loop
    End
If
    iResult = InternetCloseHandle(hInternet)
    
    Open strAdrs For Binary As #1
        Put #1, , sData
    Close #1
    
    'GetUrl = sData
    'GetUrl = Replace(sData, Chr(0), "*")
End Sub
اینم هنگ میکنه متاسفانه...........
من تست کردم هنگ نمی کرد ولی اگه بهتر از این بخوای همونطور که آقا پیمان گفتن

باید از توابعی مثل InternetOpenUrl و InternetReadFile استفاده کنی.

کد:
Const scUserAgent = "API-Guide test program"
Const INTERNET_OPEN_TYPE_DIRECT = 1
Const INTERNET_OPEN_TYPE_PROXY = 3
Const INTERNET_FLAG_RELOAD = &H80000000
Const sURL = "http://www.microsoft.com/index.htm"
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
Private Sub Form_Load()


    Dim hOpen As Long, hFile As Long, sBuffer As String, Ret As Long
    'Create a buffer for the file we're going to download
    sBuffer = Space(1000)
    'Create an internet connection
    hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
    'Open the url
    hFile = InternetOpenUrl(hOpen, sURL, vbNullString, ByVal 0&, INTERNET_FLAG_RELOAD, ByVal 0&)
    'Read the first 1000 bytes of the file
    InternetReadFile hFile, sBuffer, 1000, Ret
    'clean up
    InternetCloseHandle hFile
    InternetCloseHandle hOpen
    'Show our file
    MsgBox sBuffer
End Sub
وقتی واسه عکس میخوای از این دستور استفاده کنی و هنگ میکنه یه روش خیلی ساده به کار ببر.
1 بروزر بذار تو برنامه و لینک رو با وب بروزر باز کن
کد:
WB.Navigate "LINK"
و در documentComplet
وقتی وب بروزر کامل لود شد URLDownloadToFile رو برای WB.document.URL استفاده کن
بدون هنگ کار میکنه...

این هم نمونه:
آقا واقعا ممنون. عالی بود
این شد جواب سوال من..