史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2008-09-27, 05:56 PM   #1
rank
註冊會員
榮譽勳章
UID - 293162
在線等級: 級別:2 | 在線時長:18小時 | 升級還需:3小時級別:2 | 在線時長:18小時 | 升級還需:3小時
註冊日期: 2008-02-12
文章: 327
精華: 0
現金: 16 金幣
資產: 16941 金幣
預設 疑問 - 如何在URLDownloadToFile下載時得知進度



--------------------
閱讀本主題的最佳解答
--------------------


爬了不少文始終不知道該如何實做IBindStatusCallback這介面
特地來問問看,是否有誰會使用
rank 目前離線  
送花文章: 362, 收花文章: 221 篇, 收花: 411 次
回覆時引用此帖
舊 2008-09-27, 08:28 PM   #2 (permalink)
註冊會員
 
飛行船大大 的頭像
榮譽勳章
UID - 282126
在線等級: 級別:14 | 在線時長:252小時 | 升級還需:33小時級別:14 | 在線時長:252小時 | 升級還需:33小時級別:14 | 在線時長:252小時 | 升級還需:33小時級別:14 | 在線時長:252小時 | 升級還需:33小時
註冊日期: 2007-10-09
文章: 165
精華: 0
現金: 298 金幣
資產: 7298 金幣
預設

引用:
作者: rank 查看文章
爬了不少文始終不知道該如何實做IBindStatusCallback這介面
特地來問問看,是否有誰會使用
你vb是用vb inet ?
若是~ 我知道如何設計 根本不必IBindStatusCallback.

此帖於 2008-09-27 09:32 PM 被 飛行船大大 編輯.
飛行船大大 目前離線  
送花文章: 175, 收花文章: 59 篇, 收花: 136 次
回覆時引用此帖
舊 2008-09-28, 09:14 AM   #3 (permalink)
註冊會員
榮譽勳章
UID - 293162
在線等級: 級別:2 | 在線時長:18小時 | 升級還需:3小時級別:2 | 在線時長:18小時 | 升級還需:3小時
註冊日期: 2008-02-12
文章: 327
精華: 0
現金: 16 金幣
資產: 16941 金幣
預設

引用:
作者: 飛行船大大 查看文章
你vb是用vb inet ?
若是~ 我知道如何設計 根本不必IBindStatusCallback.
我是用VB6,如果是VB.NET最簡單也煩請告訴我
我有可能會換開發軟體,先謝謝飛行船大大

>>你vb是用vb inet ?
這一句我還真有點看不懂,我是用URLDownloadToFile函式去下載檔案
inet好像也可以下,但我沒用

總之有任何做法,我都願意嘗試
rank 目前離線  
送花文章: 362, 收花文章: 221 篇, 收花: 411 次
回覆時引用此帖
舊 2008-09-29, 01:24 AM   #4 (permalink)
註冊會員
 
飛行船大大 的頭像
榮譽勳章
UID - 282126
在線等級: 級別:14 | 在線時長:252小時 | 升級還需:33小時級別:14 | 在線時長:252小時 | 升級還需:33小時級別:14 | 在線時長:252小時 | 升級還需:33小時級別:14 | 在線時長:252小時 | 升級還需:33小時
註冊日期: 2007-10-09
文章: 165
精華: 0
現金: 298 金幣
資產: 7298 金幣
預設



大部份的人都用winsock, inet來設計 比較少人用URLDownloadToFile
既然你inet不熟 ,我就 回答這個URLDownloadToFile

表單先加一個 進度條ProgressBar1 一個Label1
主要是在表單加上 一行Implements olelib.IBindStatusCallback
和以下2個事件 就可以了.
語法:
Implements olelib.IBindStatusCallback
Private Function StartTheStinkinDownLoad(ByVal File2DownLoad As String, ByVal File2Save As String) As Boolean

  Dim DownLoadResult As Long
  DownLoadResult = olelib.URLDownloadToFile(Nothing, File2DownLoad, File2Save, 0, Me)
    StartTheStinkinDownLoad = (DownLoadResult = olelib.S_OK)
End Function

Private Sub IBindStatusCallback_OnProgress(ByVal ulProgress As Long, ByVal ulProgressMax As Long, ByVal ulStatusCode As olelib.BINDSTATUS, ByVal szStatusText As Long)
    On Error GoTo BadDeal
    If ulProgressMax <= 0 Then Exit Sub
     ProgressBar1.Max = CSng(ulProgressMax) ' set the progress bar's max value after it is known for sure
     ProgressBar1.Value = CSng(ulProgress) ' set the current level of progress
    DoEvents 'force a refresh... even though this slows things down
    
Exit Sub
BadDeal:
    Form1.Text3.Text = Form1.Text3.Text & "下載出錯: " & ulProgress & "/" & ProgressBar1.Value & "/" & ulProgressMax & "/" & ProgressBar1.Max & vbCrLf
    Resume Next
End Sub
語法:
Public Function ShowDownLoad(FileList As String, Optional Owner As Object)
    Dim i, X As Integer
   i = Split(FileList, ",")

   Me.Print "正在下載... 請稍候..."
   Label1.Caption = "檢查複製緩存..."
   If IsMissing(Owner) = False Then
      Me.Show
   Else
      Me.Show vbModeless, Owner
   End If
   Me.Refresh
   Dim File2DownLoad As String, File2Save As String, DeleteCache As Boolean, TopLimit As Integer, TempDelete As String, OffSet As Integer
   TopLimit = (UBound(i) - 2) / 3
   OffSet = 0
   For X = 0 To TopLimit
      File2DownLoad = i(OffSet)
      File2Save = i(OffSet + 1)
      TempDelete = i(OffSet + 2)
      If TempDelete = "1" Then
         DeleteCache = True
      Else
         DeleteCache = False
      End If
      OffSet = OffSet + 3
      ProgressBar1.Value = 0
      Form1.Text3.Text = Form1.Text3.Text & "開始下載文件..." & vbCrLf
      Form1.Text3.Text = Form1.Text3.Text & File2DownLoad & vbCrLf
      If DeleteCache Then
         If DeleteUrlCacheEntry(File2DownLoad) = 1 Then
            Form1.Text3.Text = Form1.Text3.Text & "找到上次下載緩存文件刪除..." & vbCrLf
         Else
            Form1.Text3.Text = Form1.Text3.Text & "沒有緩存文件存在" & vbCrLf
         End If
      End If
      Label1.Caption = File2DownLoad
      If StartTheStinkinDownLoad(File2DownLoad, File2Save) Then
         Form1.Text3.Text = Form1.Text3.Text & "文件下載完畢: " & File2DownLoad & vbCrLf & vbCrLf
         ShowDownLoad = True
      Else
         Form1.Text3.Text = Form1.Text3.Text & "文件下載失敗!" & vbCrLf
         ShowDownLoad = False
      End If
   Next
   Form1.Text3.Text = Form1.Text3.Text & "結束下載文件..." & vbCrLf
   
   Unload Me
   Set frmDnLoad = Nothing
   
End Function
呼叫的方式: 在Form1 中按Command1 即可

Private Sub Command1_Click()
Dim FileList As String
FileList = Text1.Text & "," & Text2.Text & "," & "1"
Call frmDnLoad.ShowDownLoad(FileList, Me)

End Sub

此帖於 2008-09-29 01:49 AM 被 飛行船大大 編輯.
飛行船大大 目前離線  
送花文章: 175, 收花文章: 59 篇, 收花: 136 次
回覆時引用此帖
向 飛行船大大 送花的會員:
rank (2008-09-29)
感謝您發表一篇好文章
舊 2008-09-29, 04:52 AM   #5 (permalink)
註冊會員
榮譽勳章
UID - 293162
在線等級: 級別:2 | 在線時長:18小時 | 升級還需:3小時級別:2 | 在線時長:18小時 | 升級還需:3小時
註冊日期: 2008-02-12
文章: 327
精華: 0
現金: 16 金幣
資產: 16941 金幣
預設

請問飛行船大大
Implements olelib.IBindStatusCallback
我這一行一直編譯不過到底是發生什麼原因
一直無法通過
rank 目前離線  
送花文章: 362, 收花文章: 221 篇, 收花: 411 次
回覆時引用此帖
舊 2008-09-29, 06:02 AM   #6 (permalink)
註冊會員
榮譽勳章
UID - 293162
在線等級: 級別:2 | 在線時長:18小時 | 升級還需:3小時級別:2 | 在線時長:18小時 | 升級還需:3小時
註冊日期: 2008-02-12
文章: 327
精華: 0
現金: 16 金幣
資產: 16941 金幣
預設

我找到元件了,可以跑了
可是問題來了,我的進度表那裡一直弄不好,能否幫我看看
一直常發生溢位和錯誤


語法:
Implements olelib.IBindStatusCallback

Private Function StartTheStinkinDownLoad(ByVal File2DownLoad As String, ByVal File2Save As String) As Boolean

  Dim DownLoadResult As Long
  DownLoadResult = olelib.URLDownloadToFile(Nothing, File2DownLoad, File2Save, 0, Me)
    StartTheStinkinDownLoad = (DownLoadResult = olelib.S_OK)
End Function

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_OnProgress(ByVal ulProgress As Long, ByVal ulProgressMax As Long, ByVal ulStatusCode As olelib.BINDSTATUS, ByVal szStatusText As Long)
   ProgressBar1.Min = 0
   ProgressBar1.Max = 100
    If ulProgressMax <> 0 Then
        ProgressBar1.Value = CInt(100 * (ulProgress / ulProgressMax))
    End If
    If ulProgressMax <> 0 Then
        Debug.Print ulProgress
        Debug.Print ulProgressMax
        Debug.Print ulProgress / ulProgressMax
    End If
End Sub
Private Sub Command1_Click()
StartTheStinkinDownLoad "http://www.google.com.tw/", "C:/abc.txt"
End Sub

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

End Sub

Private Sub IBindStatusCallback_OnStopBinding(ByVal hresult As Long, ByVal szError As Long)

End Sub
rank 目前離線  
送花文章: 362, 收花文章: 221 篇, 收花: 411 次
回覆時引用此帖
舊 2008-09-29, 11:54 AM   #7 (permalink)
註冊會員
 
mraaa711128 的頭像
榮譽勳章

勳章總數
UID - 277024
在線等級: 級別:3 | 在線時長:25小時 | 升級還需:7小時級別:3 | 在線時長:25小時 | 升級還需:7小時級別:3 | 在線時長:25小時 | 升級還需:7小時
註冊日期: 2007-08-16
文章: 51
精華: 0
現金: 105 金幣
資產: 125 金幣
預設

引用:
作者: rank 查看文章
我找到元件了,可以跑了
可是問題來了,我的進度表那裡一直弄不好,能否幫我看看
一直常發生溢位和錯誤
是什麼樣情況下會發生溢位
可否說明一下??
是跑到最後了才發生
還是不一定??
mraaa711128 目前離線  
送花文章: 34, 收花文章: 20 篇, 收花: 26 次
回覆時引用此帖
舊 2008-09-29, 10:58 PM   #8 (permalink)
註冊會員
榮譽勳章
UID - 293162
在線等級: 級別:2 | 在線時長:18小時 | 升級還需:3小時級別:2 | 在線時長:18小時 | 升級還需:3小時
註冊日期: 2008-02-12
文章: 327
精華: 0
現金: 16 金幣
資產: 16941 金幣
預設

引用:
作者: mraaa711128 查看文章
是什麼樣情況下會發生溢位
可否說明一下??
是跑到最後了才發生
還是不一定??
ProgressBar1.Value = CInt(100 * (ulProgress / ulProgressMax))
是這一行會發生錯誤,照理說ulProgressMax應該會比ulProgress大
但事實跑起來並不然,使得我的ProgressBar1.Value 的值超出100而超出範圍造成錯誤
而且從頭到尾的數值改變只有變動一次...我把我Debug 印的PO上來好了

[1] Progress event received: 0 of 0, StatusCode: 34
[2] Progress event received: 0 of 0, StatusCode: 1
[3] Progress event received: 0 of 0, StatusCode: 2
[4] Progress event received: 0 of 0, StatusCode: 11
[5] Progress event received: 0 of 0, StatusCode: 24
[6] Progress event received: 0 of 0, StatusCode: 13
[7] Progress event received: 6779 of 3115, StatusCode: 4
[8] Progress event received: 6779 of 3115, StatusCode: 14
[9] Progress event received: 6779 of 3115, StatusCode: 6

以上就是我Debug印出來的狀態
rank 目前離線  
送花文章: 362, 收花文章: 221 篇, 收花: 411 次
回覆時引用此帖
舊 2008-10-08, 02:29 PM   #9 (permalink)
註冊會員
榮譽勳章
UID - 293162
在線等級: 級別:2 | 在線時長:18小時 | 升級還需:3小時級別:2 | 在線時長:18小時 | 升級還需:3小時
註冊日期: 2008-02-12
文章: 327
精華: 0
現金: 16 金幣
資產: 16941 金幣
預設

可以了!好像下載google的頁面會怪怪的
如果有後續解決方案,麻煩各位大大告知
rank 目前離線  
送花文章: 362, 收花文章: 221 篇, 收花: 411 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
如何在w2k底下看下載的DVDrip?(無DVDRom) darren52d 一般電腦疑難討論區 2 2003-07-23 06:52 AM
如何讓ftp軟體在下載時有續傳的功能 左非 一般電腦疑難討論區 0 2003-03-08 11:27 PM
請問IE如何取消下載的時間限制,或更改下載時間限制? vivivi 軟體應用問題討論區 4 2003-02-22 03:33 AM


所有時間均為台北時間。現在的時間是 06:29 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1