Criando um auto-update para o seu sistema
Danilo Buzar (e-mail) trabalha com programação web desde 2001, principalmente com as linguagens cliente-servidor ASP e IntraWeb. Também possui conhecimentos em DHTML, Java Script, PHP, CSS, SQL Server e Access.
Olá leitores do iMasters!
É com grande satisfação que escrevo meu primeiro artigo para o iMasters. Meu desafio foi escrever um artigo que fosse útil e ao mesmo tempo fácil de ser implementado e/ou modificado por vocês. Espero que vocês gostem da qualidade da matéria e, nas próximas, continuarei me esforçando para manter o bom nível de escrita e didática nelas!
Bom, nesta matéria falo sobre um assunto que muitos de nós ficamos com dúvidas de como começar a implementar, o ambiente a se distribuir e qual forma mais eficaz de fazê-lo. Estamos falando em como atualizar dinamicamente sistemas feitos em VB 6 e que, na maioria das vezes, estas aplicações estão sendo utilizadas em ambientes críticos e não podem haver bugs que causam implicações na dinâmica dos trabalhos.
Abaixo temos o cenário do nosso ambiente de rede fictício:
01 Servidor
05 Máquinas cliente em ambiente de produção01 Máquina de desenvolvimento do aplicativo
Temos abaixo os componentes usados em nosso programa:
Formulários: frmPrincipal.frm
Componentes: pBar (Progress Bar) e *txtLog (TextBox)Classes (Módulos): ModPrincipal.bas
* Usado para armazenar as informações em run-time do atualizador e posteriormente serem gravadas em arquivo.
Já vimos o básico para o início do projeto, então, mãos a obra!
** Nesta parte irei explicar somente os pontos mais importantes do código para resumir a matéria e não deixá-la muito extensa. Em anexo você encontra o projeto para download.
frmPrincipal
Private Sub Form_Load()
'Configurações iniciais
PodeFechar = False
Me.Visible = False
CentralizaForm Me
Me.MousePointer = 11
pBar.Max = 100
pBar.Min = 0
pBar.Value = 0
LocalFile = App.Path "\Aplicacao.exe"
NetFile = "\\Servidor\Aplicacao\MinhaAplicacao.exe"
'Inicia o processo de verificação entre datas de arquivos
VerificaSeExisteAtualizacao
End Sub
No Load do Form eu faço todas as configurações iniciais como inibição do form, centralização e o principal: atribuição dos caminhos dos arquivos a serem atualizados.
Private Function VerificaSeExisteAtualizacao() As Boolean
'Obtém a data dos arquivos a serem atualizados
DefineDataArquivos
'Verifica se a data do arquivo local é menor do que a data do arquivo remoto
If CDate(LocalDateFile) < CDate(NetDateFile) Then
MsgBox "Existe uma nova atualização do programa!" Chr(13) _
String(10, " ") "Clique em OK para atualizar.", _
vbInformation, "Nova atualização!"
Me.Show
'Chama a subrotina que atualiza os arquivos
AtualizaPrograma
'Sai da aplicação
FinalizaAtualizador
Else
FinalizaAtualizador
End If
End Function
Nesta função, o programa compara as datas dos arquivos a serem atualizados. Caso a condição seja satisfeita o programa chama a subrotina que atualiza os arquivos, caso contrário o atualizador se auto-finaliza.
Private Sub FechaPrograma()
Dim WinHndl As Long
On Error GoTo Erro_Handle
WinHndl = FindWindow(vbNullString, "Arquivo.txt - Bloco de Notas")
If WinHndl > 0 Then
PostMessage WinHndl, WM_CLOSE, 0, 0
End If
Exit Sub
Erro_Handle:
MsgBox "Impossível definir o Handle!", vbCritical, "ERRO!"
Escreve_Log ("Impossível definir o Handle!")
Escreve_Log (Err.Number " - " Err.Description)
GeraLog ("Log.txt")
FinalizaAtualizador
End Sub
Nesta Sub o programa utiliza a API [sigla]FindWindow[/sigla] do Windows para verificar o Handle da janela informada e caso encontre, automaticamente fecha a aplicação informada.
Private Sub CriaBackup()
Dim ExtensaoArquivo As String
On Error GoTo Erro_CriaBackup
'Define nome do Backup
NomeArquivoBackup = Mid(LocalFile, 1, Len(LocalFile) - 4)
ExtensaoArquivo = Right(LocalFile, 4)
NomeArquivoBackup = NomeArquivoBackup AdicionaZero(Day(Now())) _
AdicionaZero(Month(Now())) Right(Year(Now()), 2) "_" _
AdicionaZero(Hour(Now())) AdicionaZero(Minute(Now())) _
ExtensaoArquivo
'Gera o Backup
FileCopy LocalFile, NomeArquivoBackup
'Deleta o arquivo atual
Kill LocalFile
Exit Sub
Erro_CriaBackup:
MsgBox "Erro ao criar o backup!", vbCritical, "ERRO!"
Escreve_Log ("Erro ao criar o backup!")
Escreve_Log (Err.Number " - " Err.Description)
GeraLog ("Log.txt")
FinalizaAtualizador
End Sub
Esta sub é importante para manter o backup dos arquivos atualizados e caso haja algum problema de atualização, basta reverter o processo.
Abaixo temos o fluxograma do cenário exemplo
Fluxograma do cenário
Portanto, vimos na matéria que esta aplicação não é algo de difícil de desenvolver, porém, este processo envolve alguns outros pontos importantes que temos que nos atentar, como: Horário de atualização, quantidade de atualizações e se for o caso, analisar uma distribuição ordenada.
Pessoal, a matéria chegou ao seu fim, e espero que este artigo tenha um bom proveito para vocês. Espero vê-los em uma próxima ocasião. Até mais!