Visual Basic - Baixando arquivos da Web usando a API URLDownloadToFile


Existem muitas maneiras de fazer download de arquivos na rede mundial usando a linguagem Visual Basic 6.

Neste artigo eu vou mostrar a opção quer usa a API URLDownloadToFile.

Esta API esta disponível em todas as versões do sistema operacional Windows (exceto Win3, WinNT3.x ). Sua utilização é bem simples: basta passar o nome do arquivo remoto a ser baixado e o caminho e nome do arquivo local de destino que a API faz o download do arquivo salvando o com o nome e no local indicado.

A API funciona com todos os tipos de arquivos - arquivos textos, imagens, arquivos mpg, wav, zip, etc., sem modificação da rotina ou preocupação com o arquivo que está sendo baixado, e também não há restrição de tamanho.

Após baixar o arquivo ele pode ser aberto e exibido no programa Visual Basic diretamente ou você pode informar o nome e caminho do arquivo baixado para ser aberto por um programa associado à extensão do arquivo usando as funções ShellExecute ou ShellExecuteEx.

Podemos fazer o download de múltiplos arquivos que serão baixados um de cada vez e ao final será retornado true se o download de cada arquivo foi realizado com sucesso.

Sintaxe e informação sobre parâmetros da função:

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

Onde temos:

  1. pCaller - Endereço de controle da interface IUnknown da chamada do componente ActiveX. Se a aplicação que faz a chamada não é um componente ActiveX este valor deve ser definido como NULL;
  2. szURL - Endereço de um valor string contendo a URL a ser baixada. Não pode ser NULL;
  3. szFileName - Endereço de um valor string contendo o nome do arquivo de destino a ser criado para receber os bits que estão sendo baixados;
  4. dwReserved - Reservado. Deve ser informado o valor Zero (0).
  5. IpfnCB - Endereço da interface IBindStatusCallback do chamador. A API chama o método  IBindStatusCallback::OnProgress  desta interface em uma conexão ativa incluindo a chegada dos dados.(Implementar a interface IBindStatusCallback::OnProgress permite ao programa chamador definir interface de usuário ou outra funcionalidade de monitoramento do progresso do download. Permitindo também que a operação de download seja cancelada, retornando E_ABORT a partir da chamada de IBindStatusCallback:: OnProgress.)
  6. Retorno da API :
    1. E_OUTOFMEMORY - O tamanho do buffer é inválido ou não havia memória suficiente para completar a operação;
    2. S_OK - A operação foi realizada com sucesso.

Nota: A API URLDownloadToFile transporta o arquivo até o cache do IE , em seguida, copia o arquivo para o do sistema de arquivos local ou remoto de destino que você especificou. Dessa forma uma segunda chamada para o download do mesmo arquivo vai trazer o arquivo do cache e não a cópia do local de origem. Para ter certeza de que o download esta sendo feito a partir do local de origem você tem que remover a cópia do arquivo do cache. Para resolver este problema podemos usar a função DeleteUrlCacheEntry.

Bem depois dessa teoria toda vamos à prática.

Baixando um arquivo da internet usando a API URLDownloadToFile

Neste primeiro exemplo vamos baixar o arquivo imagem  maco10.gif do site Macoratti.net a partir da URL: http://www.macoratti.net e exibir o arquivo baixado em um controle PictureBox.

Abra o Visual Basic 6 e clique em Standard EXE.

A seguir altere o nome do formulário form1.frm para frmDownload.frm e inclua a partir da ToolBox os seguintes controles no formulário:

Disponha os controles conforme o leiaute mostrado na figura abaixo:

No início do formulário vamos fazer a declaração da API

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

A seguir vamos definir o código no evento Click do botão de comando Baixar e Exibir Arquivo:

Private Sub cmdDownload_Click()
On Error GoTo trataErro
    'baixar o arquivo
    URLDownloadToFile 0, txtUrl.Text & "\" & txtArquivo.Text, txtDestino.Text, 0, 0
    'exibir o arquivo baixado no picturebox
    picImagem.Picture = LoadPicture(txtDestino.Text)
    
    Exit Sub
    
trataErro:
    MsgBox Err.Description
End Sub

Executando o programa iremos obter:

Baixando um arquivo da internet usando a API URLDownloadToFile - Limpando o Cache

Neste exemplo eu vou baixar um arquivo HTML do site Macoratti.net. Escolhi baixar o arquivo bancos.htm do endereço http://www.macoratti.net.

Eu vou baixar o arquivo HTML e exibir o seu conteúdo em um controle TextBox.

Vamos usar a função DeleteUrlCacheEntry para remover o arquivo associado ao nome do arquivo de destino do cache se o arquivo existir.

Você pode baixar qualquer arquivo de qualquer endereço remoto usando essa API, por isso fique a vontade para adaptar o exemplo.

No menu Project clique em Add Form e inclua um novo formulário salvando-o com o nome de frmDownload2.frm e  a seguir inclua os seguintes controles neste formulário: (vou usar basicamente os mesmos controles do formulário anterior):

Disponha os controles conforme o leiaute mostrado na figura abaixo:

No início do formulário vamos fazer a declaração da API

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

A seguir vamos declarar a função DeleteUrlCacheEntry e variáveis associadas para que o arquivo de destino seja removido do cache:

Private Declare Function DeleteUrlCacheEntry Lib "Wininet.dll" _
                       Alias "DeleteUrlCacheEntryA" _
                       (ByVal lpszUrlName As String) As Long

Private Const ERROR_SUCCESS As Long = 0
Private Const BINDF_GETNEWESTVERSION As Long = &H10
Private Const INTERNET_FLAG_RELOAD As Long = &H80000000

Para exibir o formulário frmDownload2.frm quando o programa for iniciado clique Project-> Project Properties e defina em Startup Object o nome do formulário form2:

A seguir vamos definir o código no evento Click do botão de comando Baixar e Exibir Arquivo:

Private Sub cmdDownload_Click()
On Error GoTo trataErro
    'baixar o arquivo
    URLDownloadToFile 0, txtUrl.Text & "\" & txtArquivo.Text, txtDestino.Text, 0, 0

    'exibir o arquivo baixado no textbox
    hfile = FreeFile
    Open txtDestino.Text For Input As #hfile
    txtResultado.Text = Input$(LOF(hfile), hfile)
    Close #hfile
    
    Exit Sub

trataErro:
    MsgBox Err.Description

End Sub

Executando o programa iremos obter:

E assim vimos como é simples baixar arquivos da internet usando o Visual Basic 6.

Só por curiosidade você sabia que a linguagem Visual Basic continua entre as 10 linguagens de programação mais usadas em 2013 ?

Veja neste site mais detalhes: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Abaixo uma tabela comparativa retirada do site acima:

Veja que o Visual Basic 6 esta em sétimo lugar, logo abaixo do C#, enquanto que o VB .NET está em décimo primeiro lugar, mas crescendo.

Pegue o sistema completo aqui: Dowload_Web_VB6.zip

João 6:44 Ninguém pode vir a mim, se o Pai que me enviou não o trouxer; e eu o ressuscitarei no último dia.

João 6:45 Está escrito nos profetas: E serão todos ensinados por Deus. Portanto todo aquele que do Pai ouviu e aprendeu vem a mim.

Referências:


José Carlos Macoratti