elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Gestor de descargas en VB
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Gestor de descargas en VB  (Leído 7,791 veces)
aaronduran2


Desconectado Desconectado

Mensajes: 790



Ver Perfil WWW
Gestor de descargas en VB
« en: 30 Agosto 2008, 23:00 pm »

Hola. Quisiera saber si existe alguna forma de hacer un gestor de descargas en VB, en el que aparezcan las descargas actuales, poder pausarlas y reanudarlas, etc... Al estilo del gestor que tiene Firefox.

Gracias de antemano.


En línea

APOKLIPTICO


Desconectado Desconectado

Mensajes: 3.871


Toys in the attic.


Ver Perfil
Re: Gestor de descargas en VB
« Respuesta #1 en: 31 Agosto 2008, 01:45 am »

La capacidad de manejo de datos en internet de Vb es bastante limitada, no funciona muy bien, no se si habrá algun control que haga mejor uso del winsock, pero no me parece que VB sea el lenguaje indicado para un gestor de descargas  :-\.

Un abrazo
APOKLIPTICO


En línea

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Gestor de descargas en VB
« Respuesta #2 en: 31 Agosto 2008, 07:00 am »

La capacidad de manejo de datos en internet de Vb es bastante limitada, no funciona muy bien, no se si habrá algun control que haga mejor uso del winsock, pero no me parece que VB sea el lenguaje indicado para un gestor de descargas  :-\.

Un abrazo
APOKLIPTICO
no lo creo nada es limitado almenos que estemos desinformados pero aun asi si hay limitaciones pero siempre es por la desinformacion.
En línea

The Dark Shadow is my passion.
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Gestor de descargas en VB
« Respuesta #3 en: 31 Agosto 2008, 07:14 am »

Aca un Source ojala te sirva de algo:

Requiere un formulario y un "Modulo clase" llamado: jrDownload

Código
  1. Option Explicit
  2. Private Protocolo As String, Servidor As String, Objeto As String, Servicio As Long
  3. Private URLCorrecta As Boolean, TipoConexion As Long
  4. Private hInternetSession As Long, hInternetConnect As Long, hHttpOpenRequest As Long
  5.  
  6.  
  7. Public Enum jrDownTipoAccion
  8.    jrDownSoloInformacion = 0
  9.    jrDownDescargar = 1
  10. End Enum
  11.  
  12. 'constantes de error
  13. Private Const ERROR_URL As Long = 1
  14. Private Const ERROR_INTERNETOPEN = 2
  15. Private Const ERROR_INTERNETCONNECT = 3
  16. Private Const ERROR_INTERNETOPENREQUEST = 4
  17. Private Const ERROR_INTERNETSENDREQUEST = 5
  18. Private Const ERROR_INTERNETQUERYINFO = 6
  19. Private Const ERROR_INTERNETREADFILE = 7
  20. Private Const ERROR_FICHERO = 8
  21. Private Const ERROR_DESCARGA = 999
  22. Private Const ERROR_CANCELADO = 998
  23.  
  24.  
  25. 'declaraciones del API
  26. Const scUserAgent = "jrDownload"
  27. Const INTERNET_OPEN_TYPE_PRECONFIG = 0
  28. Const INTERNET_OPEN_TYPE_DIRECT = 1
  29. Const INTERNET_OPEN_TYPE_PROXY = 3
  30. Const INTERNET_FLAG_RELOAD = &H80000000
  31. Const HTTP_QUERY_CONTENT_TYPE = 1
  32. Const HTTP_QUERY_CONTENT_LENGTH = 5
  33. Const HTTP_QUERY_EXPIRES = 10
  34. Const HTTP_QUERY_LAST_MODIFIED = 11
  35. Const HTTP_QUERY_PRAGMA = 17
  36. Const HTTP_QUERY_VERSION = 18
  37. Const HTTP_QUERY_STATUS_CODE = 19
  38. Const HTTP_QUERY_STATUS_TEXT = 20
  39. Const HTTP_QUERY_RAW_HEADERS = 21
  40. Const HTTP_QUERY_RAW_HEADERS_CRLF = 22
  41. Const HTTP_QUERY_FORWARDED = 30
  42. Const HTTP_QUERY_SERVER = 37
  43. Const HTTP_QUERY_USER_AGENT = 39
  44. Const HTTP_QUERY_SET_COOKIE = 43
  45. Const HTTP_QUERY_REQUEST_METHOD = 45
  46. Const HTTP_QUERY_FLAG_REQUEST_HEADERS = &H80000000
  47. 'Puertos por defecto
  48. Const INTERNET_DEFAULT_FTP_PORT = 21
  49. Const INTERNET_DEFAULT_GOPHER_PORT = 70
  50. Const INTERNET_DEFAULT_HTTP_PORT = 80
  51. Const INTERNET_DEFAULT_HTTPS_PORT = 443
  52. Const INTERNET_DEFAULT_SOCKS_PORT = 1080
  53. ' Tipos de servicios
  54. Const INTERNET_SERVICE_FTP = 1
  55. Const INTERNET_SERVICE_GOPHER = 2
  56. Const INTERNET_SERVICE_HTTP = 3
  57. 'funciones del API para internet
  58. 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
  59. Private Declare Function InternetCloseHandle Lib "wininet" (ByVal hInet As Long) As Integer
  60. Private Declare Function InternetReadFile Lib "wininet" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
  61. Private Declare Function InternetConnect Lib "wininet.dll" Alias _
  62.        "InternetConnectA" (ByVal InternetSession As Long, _
  63.        ByVal sServerName As String, ByVal nServerPort As Integer, _
  64.        ByVal sUsername As String, ByVal sPassword As String, _
  65.        ByVal lService As Long, ByVal lFlags As Long, _
  66.        ByVal lContext As Long) As Long
  67. Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias _
  68.        "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal sVerb As _
  69.        String, ByVal sObjectName As String, ByVal sVersion As String, _
  70.        ByVal sReferer As String, ByVal something As Long, ByVal lFlags _
  71.        As Long, ByVal lContext As Long) As Long
  72. Private Declare Function HttpSendRequest Lib "wininet.dll" Alias _
  73.        "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders _
  74.        As String, ByVal lHeadersLength As Long, sOptional As Any, _
  75.        ByVal lOptionalLength As Long) As Integer
  76. Private Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" _
  77.        (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, _
  78.        ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer
  79. 'para crear un nombre de fichero temporal y único
  80. Private Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
  81. 'para obtener descripción de errores del sistema
  82. Private Declare Function GetLastError Lib "kernel32" () As Long
  83. Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" _
  84.    (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, _
  85.    ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, _
  86.    Arguments As Long) As Long
  87. Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
  88. 'para obtener el tiempo de descarga
  89. Private Declare Function GetTickCount Lib "kernel32" () As Long
  90. 'variables locales para almacenar los valores de las propiedades
  91. Private mvarURL As String 'copia local
  92. Private mvarHuboError As Boolean 'copia local
  93. Private mvarStatusCode As String 'copia local
  94. Private mvarStatusText As String 'copia local
  95. Private mvarUsarProxy As String 'copia local
  96. Private mvarNoUsarProxy As String 'copia local
  97. Private mvarUsuario As String 'copia local
  98. Private mvarPassword As String 'copia local
  99. Private mvarFichero As String 'copia local
  100. Private mvarContenidoDescargado As String 'copia local
  101. Private mvarPuerto As Long 'copia local
  102. Private mvarQContentType As Boolean 'copia local
  103. Private mvarQContentLength As Boolean 'copia local
  104. Private mvarQLastModified As Boolean 'copia local
  105. Private mvarQVersion As Boolean 'copia local
  106. Private mvarQRawHeaders As Boolean 'copia local
  107. Private mvarQRawHeadersCrLf As Boolean 'copia local
  108. Private mvarQForwarded As Boolean 'copia local
  109. Private mvarQServer As Boolean 'copia local
  110. Private mvarQRequestMethod As Boolean 'copia local
  111. Private mvarQPragma As Boolean 'copia local
  112. Private mvarQContentLengthStr As String 'copia local
  113. Private mvarQContentTypeStr As String 'copia local
  114. Private mvarQForwardedStr As String 'copia local
  115. Private mvarQLastModifiedStr As String 'copia local
  116. Private mvarQPragmaStr As String 'copia local
  117. Private mvarQRawHeadersStr As String 'copia local
  118. Private mvarQRequestMethodStr As String 'copia local
  119. Private mvarQServerStr As String 'copia local
  120. Private mvarQVersionStr As String 'copia local
  121. Private mvarQRawHeadersCrLfStr As String 'copia local
  122. Private mvarQExpires As Boolean 'copia local
  123. Private mvarQExpiresStr As String 'copia local
  124. Private mvarBytesBloqueDescarga As Long 'copia local
  125.  
  126. 'Para activar este evento, use RaiseEvent con la siguiente sintaxis:
  127. 'RaiseEvent Progreso[(arg1, arg2, ... , argn)]
  128. Public Event Progreso(ByVal BytesTotales As Long, ByVal BytesRecibidos As Long, ByVal Porcentaje As Double, ByVal SegundosTranscurridos As Long, ByVal SegundosRestantes As Double, BytesPorSegundo As Long, Cancelar As Boolean)
  129.  
  130. Public Property Let BytesBloqueDescarga(ByVal vData As Long)
  131. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  132. 'Syntax: X.BytesBloqueDescarga = 5
  133.    mvarBytesBloqueDescarga = vData
  134. End Property
  135.  
  136.  
  137. Public Property Get BytesBloqueDescarga() As Long
  138. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  139. 'Syntax: Debug.Print X.BytesBloqueDescarga
  140.    BytesBloqueDescarga = mvarBytesBloqueDescarga
  141. End Property
  142.  
  143.  
  144.  
  145.  
  146. Private Function LastSystemError() As String
  147. Dim sError As String * 500, lErrNum As Long, lErrMsg As Long
  148.  
  149. lErrNum = GetLastError()
  150. lErrMsg = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, _
  151.  ByVal 0&, lErrNum, 0, sError, Len(sError), 0)
  152. LastSystemError = Left(sError, InStr(sError, Chr(0) - 1))
  153. End Function
  154.  
  155. Private Sub CierraConexiones()
  156. If hHttpOpenRequest <> 0 Then InternetCloseHandle hHttpOpenRequest
  157. If hInternetConnect <> 0 Then InternetCloseHandle hInternetConnect
  158. If hInternetSession <> 0 Then InternetCloseHandle hInternetSession
  159. End Sub
  160.  
  161. Public Property Let QExpiresStr(ByVal vData As String)
  162. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  163. 'Syntax: X.QExpiresStr = 5
  164.    mvarQExpiresStr = vData
  165. End Property
  166.  
  167.  
  168. Public Property Get QExpiresStr() As String
  169. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  170. 'Syntax: Debug.Print X.QExpiresStr
  171.    QExpiresStr = mvarQExpiresStr
  172. End Property
  173.  
  174.  
  175.  
  176. Public Property Let QExpires(ByVal vData As Boolean)
  177. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  178. 'Syntax: X.QExpires = 5
  179.    mvarQExpires = vData
  180. End Property
  181.  
  182.  
  183. Public Property Get QExpires() As Boolean
  184. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  185. 'Syntax: Debug.Print X.QExpires
  186.    QExpires = mvarQExpires
  187. End Property
  188.  
  189.  
  190.  
  191.  
  192. Public Property Let QRawHeadersCrLfStr(ByVal vData As String)
  193. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  194. 'Syntax: X.QRawHeadersCrLfStr = 5
  195.    mvarQRawHeadersCrLfStr = vData
  196. End Property
  197.  
  198.  
  199. Public Property Get QRawHeadersCrLfStr() As String
  200. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  201. 'Syntax: Debug.Print X.QRawHeadersCrLfStr
  202.    QRawHeadersCrLfStr = mvarQRawHeadersCrLfStr
  203. End Property
  204.  
  205.  
  206.  
  207.  
  208. Private Sub InicializaCabecerasStr()
  209. mvarQContentLengthStr = ""
  210. mvarQContentTypeStr = ""
  211. mvarQForwardedStr = ""
  212. mvarQLastModifiedStr = ""
  213. mvarQPragmaStr = ""
  214. mvarQRawHeadersStr = ""
  215. mvarQRequestMethodStr = ""
  216. mvarQServerStr = ""
  217. mvarQVersionStr = ""
  218. mvarQRawHeadersCrLfStr = ""
  219. End Sub
  220.  
  221.  
  222. Public Property Get QVersionStr() As String
  223. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  224. 'Syntax: Debug.Print X.QVersionStr
  225.    QVersionStr = mvarQVersionStr
  226. End Property
  227.  
  228.  
  229.  
  230.  
  231.  
  232. Public Property Get QServerStr() As String
  233. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  234. 'Syntax: Debug.Print X.QServerStr
  235.    QServerStr = mvarQServerStr
  236. End Property
  237.  
  238.  
  239.  
  240.  
  241.  
  242. Public Property Get QRequestMethodStr() As String
  243. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  244. 'Syntax: Debug.Print X.QRequestMethodStr
  245.    QRequestMethodStr = mvarQRequestMethodStr
  246. End Property
  247.  
  248.  
  249.  
  250.  
  251.  
  252. Public Property Get QRawHeadersStr() As String
  253. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  254. 'Syntax: Debug.Print X.QRawHeadersStr
  255.    QRawHeadersStr = mvarQRawHeadersStr
  256. End Property
  257.  
  258.  
  259.  
  260.  
  261.  
  262. Public Property Get QPragmaStr() As String
  263. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  264. 'Syntax: Debug.Print X.QPragmaStr
  265.    QPragmaStr = mvarQPragmaStr
  266. End Property
  267.  
  268.  
  269.  
  270.  
  271.  
  272. Public Property Get QLastModifiedStr() As String
  273. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  274. 'Syntax: Debug.Print X.QLastModifiedStr
  275.    QLastModifiedStr = mvarQLastModifiedStr
  276. End Property
  277.  
  278.  
  279.  
  280.  
  281.  
  282. Public Property Get QForwardedStr() As String
  283. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  284. 'Syntax: Debug.Print X.QForwardedStr
  285.    QForwardedStr = mvarQForwardedStr
  286. End Property
  287.  
  288.  
  289.  
  290.  
  291.  
  292. Public Property Get QContentTypeStr() As String
  293. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  294. 'Syntax: Debug.Print X.QContentTypeStr
  295.    QContentTypeStr = mvarQContentTypeStr
  296. End Property
  297.  
  298.  
  299.  
  300.  
  301.  
  302. Public Property Get QContentLengthStr() As String
  303. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  304. 'Syntax: Debug.Print X.QContentLengthStr
  305.    QContentLengthStr = mvarQContentLengthStr
  306. End Property
  307.  
  308.  
  309.  
  310. Public Property Let QPragma(ByVal vData As Boolean)
  311. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  312. 'Syntax: X.QPragma = 5
  313.    mvarQPragma = vData
  314. End Property
  315.  
  316.  
  317. Public Property Get QPragma() As Boolean
  318. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  319. 'Syntax: Debug.Print X.QPragma
  320.    QPragma = mvarQPragma
  321. End Property
  322.  
  323.  
  324.  
  325. Public Property Let QRequestMethod(ByVal vData As Boolean)
  326. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  327. 'Syntax: X.QRequestMethod = 5
  328.    mvarQRequestMethod = vData
  329. End Property
  330.  
  331.  
  332. Public Property Get QRequestMethod() As Boolean
  333. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  334. 'Syntax: Debug.Print X.QRequestMethod
  335.    QRequestMethod = mvarQRequestMethod
  336. End Property
  337.  
  338.  
  339.  
  340. Public Property Let QServer(ByVal vData As Boolean)
  341. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  342. 'Syntax: X.QServer = 5
  343.    mvarQServer = vData
  344. End Property
  345.  
  346.  
  347. Public Property Get QServer() As Boolean
  348. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  349. 'Syntax: Debug.Print X.QServer
  350.    QServer = mvarQServer
  351. End Property
  352.  
  353.  
  354.  
  355. Public Property Let QForwarded(ByVal vData As Boolean)
  356. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  357. 'Syntax: X.QForwarded = 5
  358.    mvarQForwarded = vData
  359. End Property
  360.  
  361.  
  362. Public Property Get QForwarded() As Boolean
  363. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  364. 'Syntax: Debug.Print X.QForwarded
  365.    QForwarded = mvarQForwarded
  366. End Property
  367.  
  368.  
  369.  
  370. Public Property Let QRawHeadersCrLf(ByVal vData As Boolean)
  371. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  372. 'Syntax: X.QRawHeadersCrLf = 5
  373.    mvarQRawHeadersCrLf = vData
  374. End Property
  375.  
  376.  
  377. Public Property Get QRawHeadersCrLf() As Boolean
  378. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  379. 'Syntax: Debug.Print X.QRawHeadersCrLf
  380.    QRawHeadersCrLf = mvarQRawHeadersCrLf
  381. End Property
  382.  
  383.  
  384.  
  385. Public Property Let QRawHeaders(ByVal vData As Boolean)
  386. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  387. 'Syntax: X.QRawHeaders = 5
  388.    mvarQRawHeaders = vData
  389. End Property
  390.  
  391.  
  392. Public Property Get QRawHeaders() As Boolean
  393. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  394. 'Syntax: Debug.Print X.QRawHeaders
  395.    QRawHeaders = mvarQRawHeaders
  396. End Property
  397.  
  398.  
  399.  
  400. Public Property Let QVersion(ByVal vData As Boolean)
  401. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  402. 'Syntax: X.QVersion = 5
  403.    mvarQVersion = vData
  404. End Property
  405.  
  406.  
  407. Public Property Get QVersion() As Boolean
  408. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  409. 'Syntax: Debug.Print X.QVersion
  410.    QVersion = mvarQVersion
  411. End Property
  412.  
  413.  
  414.  
  415. Public Property Let QLastModified(ByVal vData As Boolean)
  416. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  417. 'Syntax: X.QLastModified = 5
  418.    mvarQLastModified = vData
  419. End Property
  420.  
  421.  
  422. Public Property Get QLastModified() As Boolean
  423. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  424. 'Syntax: Debug.Print X.QLastModified
  425.    QLastModified = mvarQLastModified
  426. End Property
  427.  
  428.  
  429.  
  430. Public Property Let QContentLength(ByVal vData As Boolean)
  431. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  432. 'Syntax: X.QContentLength = 5
  433.    mvarQContentLength = vData
  434. End Property
  435.  
  436.  
  437. Public Property Get QContentLength() As Boolean
  438. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  439. 'Syntax: Debug.Print X.QContentLength
  440.    QContentLength = mvarQContentLength
  441. End Property
  442.  
  443.  
  444.  
  445. Public Property Let QContentType(ByVal vData As Boolean)
  446. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  447. 'Syntax: X.QContentType = 5
  448.    mvarQContentType = vData
  449. End Property
  450.  
  451.  
  452. Public Property Get QContentType() As Boolean
  453. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  454. 'Syntax: Debug.Print X.QContentType
  455.    QContentType = mvarQContentType
  456. End Property
  457.  
  458.  
  459.  
  460. Public Sub Descargar(Optional TipoAccion As jrDownTipoAccion = jrDownDescargar)
  461. Dim BytesTotales As Long, BytesRecibidos As Long, BytesRecibidosTotales As Long, Porcentaje As Double
  462. Dim sBuffer As String, Res As Integer, UsarPuerto As Long, NumBloques As Long
  463. Dim FileName As String, Fich As Long, Contenido As String, aux As String
  464. Dim Cancelar As Boolean
  465. Dim TiempoTranscurrido As Long, TiempoRestante As Double, TiempoInicio As Long, BytesSegundo As Double
  466.  
  467. On Error Resume Next
  468.  
  469. Dim ChunkSize As Long
  470.  
  471. ChunkSize = mvarBytesBloqueDescarga
  472.  
  473. 'inicializo propiedades
  474. InicializaCabecerasStr
  475. mvarHuboError = False
  476. mvarStatusCode = ""
  477. mvarStatusText = ""
  478. mvarContenidoDescargado = ""
  479. Cancelar = False
  480.  
  481. 'compruebo que la URL esté introdocida y sea sintácticamente correcta
  482. URLCorrecta = ProcesaURL()
  483. If Not URLCorrecta Then
  484.    mvarHuboError = True
  485.    Exit Sub
  486. End If
  487. 'Creo buffer para recibir el fichero
  488. sBuffer = Space(ChunkSize)
  489. 'Creo una conexión a internet
  490. If TipoConexion = INTERNET_OPEN_TYPE_PROXY Then
  491.    hInternetSession = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PROXY, mvarUsarProxy, mvarNoUsarProxy, 0)
  492. Else
  493.    hInternetSession = InternetOpen(scUserAgent, TipoConexion, vbNullString, vbNullString, 0)
  494. End If
  495. If hInternetSession = 0 Then
  496.    ProcesaError ERROR_INTERNETOPEN
  497.    Exit Sub
  498. End If
  499. 'me conecto con el servidor
  500. UsarPuerto = Puerto
  501. hInternetConnect = InternetConnect(hInternetSession, Servidor, UsarPuerto, mvarUsuario, mvarPassword, Servicio, 0, 0)
  502. If hInternetConnect = 0 Then
  503.    ProcesaError ERROR_INTERNETCONNECT
  504.    Exit Sub
  505. End If
  506. 'abro una petición para el fichero solicitado
  507. hHttpOpenRequest = HttpOpenRequest(hInternetConnect, "GET", Objeto, "HTTP/1.0", vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
  508. If hHttpOpenRequest = 0 Then
  509.    ProcesaError ERROR_INTERNETOPENREQUEST
  510.    Exit Sub
  511. End If
  512. 'envío la petición
  513. Res = HttpSendRequest(hHttpOpenRequest, vbNullString, 0, 0, 0)
  514. If Res = 0 Then
  515.    ProcesaError ERROR_INTERNETSENDREQUEST
  516.    Exit Sub
  517. End If
  518. 'miro la cabecera para ver si el fichero existe
  519. If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_STATUS_TEXT, sBuffer) Then
  520.    mvarStatusText = sBuffer
  521. Else
  522.    ProcesaError ERROR_INTERNETQUERYINFO
  523.    Exit Sub
  524. End If
  525. If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_STATUS_CODE, sBuffer) Then
  526.    mvarStatusCode = sBuffer
  527.    If Left(sBuffer, 1) <> "2" Then
  528.        ProcesaError CLng(mvarStatusCode)
  529.        Exit Sub
  530.    End If
  531. Else
  532.    ProcesaError ERROR_INTERNETQUERYINFO
  533.    Exit Sub
  534. End If
  535. 'miro la longitud del contenido a descargar
  536. If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_CONTENT_LENGTH, sBuffer) Then
  537.    If IsNumeric(sBuffer) Then
  538.        BytesTotales = CLng(sBuffer)
  539.    Else
  540.        BytesTotales = -1
  541.    End If
  542.    If mvarQContentLength Then mvarQContentLengthStr = sBuffer
  543. Else
  544.    BytesTotales = -1
  545. End If
  546. 'busco el resto de valores de la cabecera, si lo ha solicitado el usuario
  547. If mvarQContentType Then
  548.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_CONTENT_TYPE, sBuffer) Then mvarQContentTypeStr = sBuffer
  549. End If
  550. If mvarQExpires Then
  551.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_EXPIRES, sBuffer) Then mvarQExpiresStr = sBuffer
  552. End If
  553. If mvarQLastModified Then
  554.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_LAST_MODIFIED, sBuffer) Then mvarQLastModifiedStr = sBuffer
  555. End If
  556. If mvarQPragma Then
  557.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_PRAGMA + HTTP_QUERY_FLAG_REQUEST_HEADERS, sBuffer) Then mvarQPragmaStr = sBuffer
  558. End If
  559. If mvarQVersion Then
  560.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_VERSION, sBuffer) Then mvarQVersionStr = sBuffer
  561. End If
  562. If mvarQRawHeaders Then
  563.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_RAW_HEADERS, sBuffer) Then mvarQRawHeadersStr = sBuffer
  564. End If
  565. If mvarQRawHeadersCrLf Then
  566.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_RAW_HEADERS_CRLF, sBuffer) Then mvarQRawHeadersCrLfStr = sBuffer
  567. End If
  568. If mvarQForwarded Then
  569.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_FORWARDED, sBuffer) Then mvarQForwardedStr = sBuffer
  570. End If
  571. If mvarQServer Then
  572.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_SERVER, sBuffer) Then mvarQServerStr = sBuffer
  573. End If
  574. If mvarQRequestMethod Then
  575.    If GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_FLAG_REQUEST_HEADERS + HTTP_QUERY_REQUEST_METHOD, sBuffer) Then mvarQRequestMethodStr = sBuffer
  576. End If
  577. 'si sólo queríamos información del archivo, ya acabamos
  578. If TipoAccion = jrDownSoloInformacion Then
  579.    CierraConexiones
  580.    Exit Sub
  581. End If
  582. 'si tengo que grabar un fichero
  583. If mvarFichero <> "" Then
  584.    'obtengo un nombre de fichero temporal para guardar lo que descargue
  585.    FileName = Space(260)
  586.    GetTempFileName DameDirectorio(mvarFichero), "jrD", 0, FileName
  587.    FileName = Left(FileName, InStr(FileName, Chr$(0)) - 1)
  588.    'abro el fichero
  589.    Fich = FreeFile()
  590.    Open FileName For Binary As Fich
  591. Else
  592.    'si conozco la longitud del archivo dimensiono el string porque se gana mucho en velocidad
  593.    If BytesTotales <> -1 Then mvarContenidoDescargado = Space(BytesTotales)
  594. End If
  595. 'leo el archivo de internet
  596. 'inicio el contador de tiempo
  597. TiempoInicio = GetTickCount()
  598. 'inicio los bytes recibidos y el espacio a leer de cada vez
  599. BytesRecibidosTotales = 0
  600. Res = 1: BytesRecibidos = ChunkSize
  601. sBuffer = Space(ChunkSize): NumBloques = 0
  602. While Res <> 0 And BytesRecibidos <> 0 And Not Cancelar
  603.    Res = InternetReadFile(hHttpOpenRequest, sBuffer, ChunkSize, BytesRecibidos)
  604.    If Res = 0 Then
  605.        mvarStatusText = LastSystemError()
  606.        mvarStatusCode = "999"
  607.    Else
  608.        If BytesRecibidos > 0 Then
  609.            aux = Left(sBuffer, BytesRecibidos)
  610.            'si estoy grabando un fichero...
  611.            If mvarFichero <> "" Then
  612.                Put Fich, , aux
  613.            Else
  614.                'si conozco el tamaño del archivo
  615.                If BytesTotales <> -1 Then
  616.                    Mid(mvarContenidoDescargado, (NumBloques * ChunkSize) + 1, BytesRecibidos) = aux
  617.                    NumBloques = NumBloques + 1
  618.                Else
  619.                    mvarContenidoDescargado = mvarContenidoDescargado + aux
  620.                End If
  621.            End If
  622.            BytesRecibidosTotales = BytesRecibidosTotales + BytesRecibidos
  623.            TiempoTranscurrido = GetTickCount() - TiempoInicio
  624.            BytesSegundo = BytesRecibidosTotales / (TiempoTranscurrido / 1000)
  625.            'calcular el porcentaje descargado y lanzar el evento progreso
  626.            If BytesTotales <> -1 Then
  627.                Porcentaje = (BytesRecibidosTotales * 100) / BytesTotales
  628.                TiempoRestante = (BytesTotales / BytesSegundo) - (TiempoTranscurrido / 1000)
  629.            Else
  630.                Porcentaje = 0
  631.                TiempoRestante = 0
  632.            End If
  633.            If TiempoRestante < 0 Then TiempoRestante = 0
  634.            RaiseEvent Progreso(BytesTotales, BytesRecibidosTotales, Porcentaje, CLng(TiempoTranscurrido / 1000), CLng(TiempoRestante), CLng(BytesSegundo), Cancelar)
  635.            DoEvents
  636.        End If
  637.    End If
  638. Wend
  639. 'cierro el fichero
  640. If mvarFichero <> "" Then Close Fich
  641. 'si el usuario canceló borro el fichero
  642. If Cancelar Then
  643.    If mvarFichero <> "" Then
  644.        If Dir(FileName) <> "" Then Kill FileName
  645.    End If
  646.    ProcesaError ERROR_CANCELADO
  647.    Exit Sub
  648. Else
  649.    'si acabó por un error borro el fichero (dejo la variable por si el contenido sirviera para algo)
  650.    If Res = 0 Then
  651.        If mvarFichero <> "" Then
  652.            If Dir(FileName) <> "" Then Kill FileName
  653.        End If
  654.        ProcesaError ERROR_DESCARGA
  655.        Exit Sub
  656.    Else
  657.        'cambio el nombre al fichero
  658.        If mvarFichero <> "" Then
  659.            If Dir(mvarFichero) <> "" Then Kill mvarFichero
  660.        End If
  661.        Name FileName As mvarFichero
  662.    End If
  663. End If
  664. CierraConexiones
  665. End Sub
  666.  
  667. Private Function DameDirectorio(Archivo As String) As String
  668. Dim i As Long
  669.  
  670. 'busco la última barra
  671. i = InStrRev(Archivo, "\")
  672. If i = 0 Then
  673.    DameDirectorio = CurDir()
  674. Else
  675.    DameDirectorio = Left(Archivo, i - 1)
  676. End If
  677. End Function
  678.  
  679. Private Function GetQueryInfo(ByVal hHttpRequest As Long, ByVal iInfoLevel As Long, Valor As String) As Boolean
  680. Dim sBuffer As String * 1024, lBufferLength As Long
  681.  
  682. lBufferLength = Len(sBuffer)
  683. GetQueryInfo = CBool(HttpQueryInfo(hHttpRequest, iInfoLevel, ByVal sBuffer, lBufferLength, 0))
  684. lBufferLength = InStr(sBuffer, Chr(0))
  685. Valor = Left(sBuffer, lBufferLength - 1)
  686. End Function
  687.  
  688.  
  689.  
  690. Public Property Let Puerto(ByVal vData As Long)
  691. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  692. 'Syntax: X.Puerto = 5
  693.    mvarPuerto = vData
  694. End Property
  695.  
  696.  
  697. Public Property Get Puerto() As Long
  698. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  699. 'Syntax: Debug.Print X.Puerto
  700. If mvarPuerto = 0 Then
  701.    Select Case Protocolo
  702.        Case "http": Puerto = INTERNET_DEFAULT_HTTP_PORT
  703.        Case "https": Puerto = INTERNET_DEFAULT_HTTPS_PORT
  704.    End Select
  705. Else
  706.    Puerto = mvarPuerto
  707. End If
  708. End Property
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715. Public Property Get ContenidoDescargado() As String
  716. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  717. 'Syntax: Debug.Print X.ContenidoDescargado
  718.    ContenidoDescargado = mvarContenidoDescargado
  719. End Property
  720.  
  721.  
  722.  
  723. Public Property Let Fichero(ByVal vData As String)
  724. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  725. 'Syntax: X.Fichero = 5
  726.    mvarFichero = vData
  727. End Property
  728.  
  729.  
  730. Public Property Get Fichero() As String
  731. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  732. 'Syntax: Debug.Print X.Fichero
  733.    Fichero = Trim(mvarFichero)
  734. End Property
  735.  
  736.  
  737.  
  738. Public Property Let Password(ByVal vData As String)
  739. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  740. 'Syntax: X.Password = 5
  741.    mvarPassword = vData
  742. End Property
  743.  
  744.  
  745. Public Property Get Password() As String
  746. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  747. 'Syntax: Debug.Print X.Password
  748.    Password = mvarPassword
  749. End Property
  750.  
  751.  
  752.  
  753. Public Property Let Usuario(ByVal vData As String)
  754. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  755. 'Syntax: X.Usuario = 5
  756.    mvarUsuario = vData
  757. End Property
  758.  
  759.  
  760. Public Property Get Usuario() As String
  761. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  762. 'Syntax: Debug.Print X.Usuario
  763.    Usuario = mvarUsuario
  764. End Property
  765.  
  766.  
  767.  
  768.  
  769. Public Property Let NoUsarProxy(ByVal vData As String)
  770. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  771. 'Syntax: X.NoUsarProxy = 5
  772.    mvarNoUsarProxy = vData
  773.    If mvarUsarProxy = "" And mvarNoUsarProxy = "" Then
  774.        TipoConexion = INTERNET_OPEN_TYPE_PRECONFIG
  775.    Else
  776.        TipoConexion = INTERNET_OPEN_TYPE_PROXY
  777.    End If
  778. End Property
  779.  
  780.  
  781. Public Property Get NoUsarProxy() As String
  782. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  783. 'Syntax: Debug.Print X.NoUsarProxy
  784.    NoUsarProxy = mvarNoUsarProxy
  785. End Property
  786.  
  787.  
  788.  
  789. Public Property Let UsarProxy(ByVal vData As String)
  790. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  791. 'Syntax: X.UsarProxy = 5
  792.    mvarUsarProxy = vData
  793.    If mvarUsarProxy = "" And mvarNoUsarProxy = "" Then
  794.        TipoConexion = INTERNET_OPEN_TYPE_PRECONFIG
  795.    Else
  796.        TipoConexion = INTERNET_OPEN_TYPE_PROXY
  797.    End If
  798.  
  799. End Property
  800.  
  801.  
  802. Public Property Get UsarProxy() As String
  803. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  804. 'Syntax: Debug.Print X.UsarProxy
  805.    UsarProxy = mvarUsarProxy
  806. End Property
  807.  
  808.  
  809.  
  810.  
  811. Private Sub ProcesaError(Numero As Long)
  812.  
  813. mvarStatusCode = Format(Numero, "000")
  814.  
  815. Select Case Numero
  816.    Case ERROR_URL: mvarStatusText = "URL incorrecta."
  817.    Case ERROR_INTERNETOPEN: mvarStatusText = "Error en InternetOpen."
  818.    Case ERROR_INTERNETCONNECT: mvarStatusText = "Error en InternetConnect."
  819.    Case ERROR_INTERNETOPENREQUEST: mvarStatusText = "Error en InternetOpenRequest."
  820.    Case ERROR_INTERNETSENDREQUEST: mvarStatusText = "Error en InternetSendRequest."
  821.    Case ERROR_INTERNETQUERYINFO: mvarStatusText = "Error en InternetQueryInfo."
  822.    Case ERROR_INTERNETREADFILE: mvarStatusText = "Error en InternetReadFile."
  823.    Case ERROR_FICHERO: mvarStatusText = "No se ha podido crear el fichero de destino."
  824.    Case ERROR_DESCARGA: mvarStatusText = "Ha ocurrido un error durante la descarga."
  825.    Case ERROR_CANCELADO: mvarStatusText = "Descarga cancelada por el usuario."
  826. End Select
  827. CierraConexiones
  828. mvarHuboError = True
  829. End Sub
  830.  
  831. Public Property Get StatusText() As String
  832. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  833. 'Syntax: Debug.Print X.StatusText
  834.    StatusText = mvarStatusText
  835. End Property
  836.  
  837.  
  838.  
  839.  
  840.  
  841. Public Property Get StatusCode() As String
  842. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  843. 'Syntax: Debug.Print X.StatusCode
  844.    StatusCode = mvarStatusCode
  845. End Property
  846.  
  847.  
  848.  
  849.  
  850.  
  851. Public Property Get HuboError() As Boolean
  852. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  853. 'Syntax: Debug.Print X.HuboError
  854.    HuboError = mvarHuboError
  855. End Property
  856.  
  857.  
  858.  
  859. Public Property Let URL(ByVal vData As String)
  860. 'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
  861. 'Syntax: X.URL = 5
  862. Dim i As Long, j As Long
  863.  
  864. mvarURL = vData
  865. URLCorrecta = ProcesaURL()
  866.  
  867. End Property
  868.  
  869. Public Property Get URL() As String
  870. 'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
  871. 'Syntax: Debug.Print X.URL
  872.    URL = mvarURL
  873. End Property
  874.  
  875.  
  876.  
  877. Private Function ProcesaURL() As Boolean
  878. Dim i As Long, j As Long
  879.  
  880. On Error GoTo ProcesaURL_Err
  881.  
  882. ProcesaURL = False
  883. 'descomponemos la url en protocolo, servidor y objeto
  884. 'busco el protocolo
  885. i = InStr(mvarURL, "://")
  886. If i = 0 Then
  887.    'si no existe asumimos que es http
  888.    Protocolo = "http"
  889.    i = 1
  890. Else
  891.    Protocolo = LCase(Mid(mvarURL, 1, i - 1))
  892.    i = i + 3
  893. End If
  894. 'sólo permitimos http
  895. Select Case Protocolo
  896.    Case "http":
  897.    Case "https":
  898.    Case Else: ProcesaError ERROR_URL
  899. End Select
  900. 'busco el servidor
  901. j = InStr(i, mvarURL, "/")
  902. If j = 0 Then j = Len(mvarURL) + 1
  903. Servidor = Mid(mvarURL, i, j - i)
  904. i = j + 1
  905. 'busco el objeto a descargar
  906. If i > Len(mvarURL) Then
  907.    Objeto = vbNullString
  908. Else
  909.    Objeto = "/" & Mid(mvarURL, i)
  910. End If
  911. ProcesaURL = True
  912.  
  913. ProcesaURL_End:
  914.    Exit Function
  915.  
  916. ProcesaURL_Err:
  917.    ProcesaError ERROR_URL
  918.    Resume ProcesaURL_End
  919.  
  920. End Function
  921.  
  922. Private Sub Class_Initialize()
  923. TipoConexion = INTERNET_OPEN_TYPE_PRECONFIG
  924. mvarQContentLength = True
  925. Servicio = INTERNET_SERVICE_HTTP
  926. mvarBytesBloqueDescarga = 512
  927. End Sub
  928.  
  929.  
  930. Private Sub Class_Terminate()
  931. CierraConexiones
  932. End Sub
  933.  

En un Formulario:
agregar:
2 textbox llamados "PUrl y PRecibido" este ultimo propiedad multile=true
3 botones llamados "btnDescargar, btnInformación, btnCancelar"
1 picture llamado "Picture1" (este actuara como ProgressBar)
6 Label's llamados "PHuboError, PStatusCode, PStatusText, PTiempoTranscurrido, PTiempoRestante y PBytesSegundo"


Código
  1. Option Explicit
  2. Dim WithEvents Down As jrDownload
  3. Dim CancelaDescarga As Boolean
  4.  
  5. Private Sub btnCancelar_Click()
  6. CancelaDescarga = True
  7. End Sub
  8.  
  9. Private Sub btnDescargar_Click()
  10.  
  11. CancelaDescarga = False
  12. PRecibido = "": PHuboError = "": PStatusCode = "": PStatusText = ""
  13. Picture1.Cls
  14. DoEvents
  15. Set Down = New jrDownload
  16. Down.URL = PUrl
  17. btnCancelar.Enabled = True
  18. Screen.MousePointer = 11
  19. Down.Descargar
  20. PHuboError = Down.HuboError
  21. PStatusCode = Down.StatusCode
  22. PStatusText = Down.StatusText
  23. If Not Down.HuboError Then PRecibido = Left(Down.ContenidoDescargado, 32567)
  24. btnCancelar.Enabled = False
  25. Screen.MousePointer = 0
  26. Close
  27. Open "File.tmp" For Output As #1
  28. Print #1, Down.ContenidoDescargado
  29. Close
  30. Set Down = Nothing
  31. End Sub
  32.  
  33.  
  34.  
  35.  
  36. Private Sub btnInformación_Click()
  37.  
  38. CancelaDescarga = False
  39. PRecibido = "": PHuboError = "": PStatusCode = "": PStatusText = ""
  40. Picture1.Cls
  41. Screen.MousePointer = 11
  42. DoEvents
  43. Set Down = New jrDownload
  44. With Down
  45.    .URL = PUrl
  46.    .QContentLength = True
  47.    .QContentType = True
  48.    .QExpires = True
  49.    .QForwarded = True
  50.    .QLastModified = True
  51.    .QPragma = True
  52.    .QRawHeaders = True
  53.    .QRawHeadersCrLf = True
  54.    .QRequestMethod = True
  55.    .QServer = True
  56.    .QVersion = True
  57.    .Descargar jrDownSoloInformacion
  58. End With
  59. PHuboError = Down.HuboError
  60. PStatusCode = Down.StatusCode
  61. PStatusText = Down.StatusText
  62. PRecibido = "QContentLengthStr=" & Down.QContentLengthStr & vbCrLf
  63. PRecibido = PRecibido & "QContentTypeStr=" & Down.QContentTypeStr & vbCrLf
  64. PRecibido = PRecibido & "QExpiresStr=" & Down.QExpiresStr & vbCrLf
  65. PRecibido = PRecibido & "QForwardedStr=" & Down.QForwardedStr & vbCrLf
  66. PRecibido = PRecibido & "QLastModifiedStr=" & Down.QLastModifiedStr & vbCrLf
  67. PRecibido = PRecibido & "QPragmaStr=" & Down.QPragmaStr & vbCrLf
  68. PRecibido = PRecibido & "QRawHeadersStr=" & Down.QRawHeadersStr & vbCrLf
  69. PRecibido = PRecibido & "QRawHeadersCrLfStr=" & Down.QRawHeadersCrLfStr & vbCrLf
  70. PRecibido = PRecibido & "QRequestMethodStr=" & Down.QRequestMethodStr & vbCrLf
  71. PRecibido = PRecibido & "QServerStr=" & Down.QServerStr & vbCrLf
  72. PRecibido = PRecibido & "QVersionStr=" & Down.QVersionStr & vbCrLf
  73. Set Down = Nothing
  74. Screen.MousePointer = 0
  75. End Sub
  76.  
  77.  
  78.  
  79. Sub BarraProgreso(Picture As Control, ByVal Porcentaje As Long)
  80.    Dim num$
  81.    If Not Picture.AutoRedraw Then
  82.        Picture.AutoRedraw = -1
  83.    End If
  84.    Picture.Cls
  85.    Picture.ScaleWidth = 100
  86.    Picture.DrawMode = 10
  87.    num$ = Format$(Porcentaje, "###") + "%"
  88.    Picture.CurrentX = 50 - Picture.TextWidth(num$) / 2
  89.    Picture.CurrentY = (Picture.ScaleHeight - Picture.TextHeight(num$)) / 2
  90.    Picture.Print num$
  91.    Picture.Line (0, 0)-(Porcentaje, Picture.ScaleHeight), , BF
  92.    Picture.Refresh
  93. End Sub
  94.  
  95. Private Sub Down_Progreso(ByVal BytesTotales As Long, ByVal BytesRecibidos As Long, ByVal Porcentaje As Double, ByVal SegundosTranscurridos As Long, ByVal SegundosRestantes As Double, BytesPorSegundo As Long, Cancelar As Boolean)
  96. If CancelaDescarga Then
  97.    Cancelar = CancelaDescarga
  98.    PStatusText = "Deteniendo la descarga..."
  99. Else
  100.    If BytesTotales <> -1 Then BarraProgreso Picture1, Porcentaje
  101.    PTiempoTranscurrido = SegundosTranscurridos
  102.    PTiempoRestante = SegundosRestantes
  103.    PBytesSegundo = BytesPorSegundo
  104. End If
  105. DoEvents
  106.  
  107. End Sub
  108.  

Solo falta que lo adaptes y veas como reanudarlo

este codigo fuente es de un zi llamado "JrDownloader.zip"  autor no lo recuerdo ja xP El codigo fuente lo pongo tal cual es. me parece que si se puede reanudar las descargas editando unas cuantas lineas y posiblemente agregando una funcion que verifiquela posision de la descarga actual (desde que byte empezar a descargar algo asi como cuando uno abre un archivo x del disco duro desde un "X" byte)
« Última modificación: 31 Agosto 2008, 07:25 am por ░▒▓BlackZeroҖ▓▒░ » En línea

The Dark Shadow is my passion.
byway

Desconectado Desconectado

Mensajes: 181


^^,


Ver Perfil
Re: Gestor de descargas en VB
« Respuesta #4 en: 31 Agosto 2008, 07:29 am »

wow y eso que es... ;D ;D...

mira este link tiene lo que pides un  Completo Multi Downloader (usando multithreads)... tiene hasta para 20 descargas simultaneas y sin usar controles.. pero eso de pausar y reanudar esta como dificil...

Enlace[url]
En línea

aaronduran2


Desconectado Desconectado

Mensajes: 790



Ver Perfil WWW
Re: Gestor de descargas en VB
« Respuesta #5 en: 31 Agosto 2008, 14:39 pm »

Gracias a los dos por el código. Intentaré averiguar más.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Fallo al bajar cualquier archivo mediante gestor de descargas
Redes
lhc 1 2,521 Último mensaje 3 Enero 2012, 21:39 pm
por madpitbull_99
Orbit Downloader 4.1.1.3: Gestor de descargas gratuito de la web 2.0 con ...
Noticias
wolfbcn 0 1,551 Último mensaje 30 Octubre 2012, 22:52 pm
por wolfbcn
borrar gestor de descargas de chrome
Windows
franfis 3 3,463 Último mensaje 4 Junio 2013, 03:28 am
por franfis
Analizamos FlareGet, el gestor de descargas
Noticias
wolfbcn 0 1,863 Último mensaje 29 Diciembre 2013, 22:43 pm
por wolfbcn
Gestor de descargas en Blogger
Desarrollo Web
scott_ 3 1,897 Último mensaje 21 Agosto 2014, 01:40 am
por #!drvy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines