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ção

01 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_imt.jpg

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!