Olá, pessoal, estou de volta com mais um artigo técnico!
Hoje em dia é comum encontrar aplicativos que são atualizados automaticamente pela internet sem a intervenção do usuário. Na verdade, estes aplicativos possuem rotinas específicas que os permitem ser capazes de gerenciar suas próprias atualizações.
Já pensou em implementar essa funcionalidade no seu projeto?
Essa série de artigos, divididas em 3 partes, apresenta um passo-a-passo para codificar uma atualização automática simples, porém, funcional, em Delphi com FTP!
Introdução
Se você utiliza o CCleaner, TeamViewer, Notepad++, Skype, entre outros, já deve ter recebido uma notificação de que uma nova versão estava disponível, não é? Enquanto alguns destes aplicativos disponibilizam um botão para acessar o link direto para download da nova versão, outros são capazes de baixar a atualização e instalá-la automaticamente no computador. Estes últimos sempre me chamaram a atenção. Refleti sobre como seria possível implementar essa funcionalidade com Delphi sem muita complexidade. Uma das formas mais simples que idealizei, na qual apresentarei nessa série de artigos, é através de arquivos INI e uma conexão FTP.
Ao meu ver, uma das maiores vantagens da atualização automática é dispensar a morosidade do trabalho de atualizar o software em cada cliente, um por um. Antes de implementar essa funcionalidade em um dos meus projetos, era necessário acessar o computador do cliente remotamente e transferir o novo executável para cada versão liberada. Algumas vezes, eu demorava aproximadamente meio período para concluir a atualização em todos os usuários. Agora, apenas faço o upload da versão para uma área FTP e vou descansar. 🙂
Servidor FTP
Pois bem, pessoal, vamos ao trabalho!
O primeiro passo é adquirir um acesso FTP em algum serviço de hospedagem. Mas, atenção: nem todas hospedagens fornecem conexões FTP e, aquelas que fornecem, geralmente não aceitam uploads de executáveis (.exe) por questões de segurança. Esse foi um dos problemas que lidei ao prosseguir com essa implementação, mas falaremos disso mais tarde.
Após algumas pesquisas, encontrei o Free Web Hosting Area (FreeWHA) que, como o próprio nome induz, é grátis! Basta fazer um cadastro receber as configurações de acesso ao FTP. Clique neste link, digite o nome desejado para o endereço no campo “Free subdomain hosting” (para verificar a disponibilidade) , selecione “orgfree.com” na caixa ao lado e clique em “Proceed”. Para acompanhá-los no artigo e simplificar o tutorial, fiz um cadastro fictício nessa hospedagem:
Na próxima janela, preencha o e-mail e uma senha de acesso:
Pronto! Ao avançar, as informações do endereço FTP já estarão disponíveis!
Futuramente, caso seja necessário entrar no painel de controle da conta para alterar os dados ou consultar os endereços dos servidores, acesse este link.
Usando um cliente FTP
Antes de avançar apara os próximos passos, recomendo fortemente a utilização de um cliente FTP para facilitar a transferência de arquivos. Embora essa operação possa ser feita pelo Windows Explorer (ou Explorador de Arquivos, no Windows 10), um cliente FTP possui vários recursos exclusivos para trabalhar com esse tipo de conexão, como painéis de arquivos, limite de uploads/downloads, resumo de transferências, marcadores e log de mensagens.
Neste artigo, utilizarei o FileZilla. É grátis, leve e fácil de usar. Para baixá-lo, clique aqui.
Após instalá-lo, acesse o menu Arquivo > Gerenciador de Sites. Na janela exibida, clique em “Novo Site” e preencha os campos com os dados do servidor FTP, conforme ilustrado abaixo:
Para fazer um teste, clique em “Conectar”. Se tudo ocorrer como esperado, estes serão os arquivos padrão exibidos no FTP:
Criaremos, então, um novo diretório que armazenará o pacote de atualização e o arquivo INI contendo as informações da nova versão. Clique com o botão direito na lista de arquivos do diretório FTP e selecione “Criar Pasta”, nomeando-a como “atualizacao”.
Arquivos INI
Agora, criaremos dois arquivos INI no disco local, responsáveis por comparar as versões e identificar se há a necessidade de atualização:
- VersaoLocal.ini: ficará gravado localmente no mesmo diretório do programa e armazenará o número da versão que está atualmente instalada no cliente;
- VersaoFTP.ini: ficará disponível no diretório FTP e armazenará o número da versão mais recente do programa.
O conteúdo do arquivo “VersaoLocal.ini” será este:
1 2 |
[VersaoLocal] Numero=1.0.0 |
Salve-o no mesmo diretório em que se encontra o programa.
Por sua vez, o arquivo “VersaoFTP.ini” terá a mesma estrutura, diferindo apenas no nome da seção:
1 2 |
[VersaoFTP] Numero=1.0.0 |
Salve-o em uma pasta temporária e depois transfira-o para a pasta “atualizacao” no diretório FTP. Para isso, no FileZilla, basta arrastar o arquivo para dentro dela:
Perfeito!
Acompanhe a lógica: na tela de atualização do programa, acessaremos o diretório FTP para baixar o arquivo “VersaoFTP.ini”. Em seguida, faremos a leitura do conteúdo dos dois arquivos INI para comparar os números das versões. Se o número da versão local (por exemplo, “1.0.0”) for diferente (menor) do que o número da versão que está no FTP (por exemplo, “1.0.1”), então poderemos assumir que há uma nova versão disponível. Legal, hein?
Compactação do executável
Porém, lembre-se que no início do artigo mencionei que servidores FTP normalmente não aceitam uploads de executáveis. Por isso, teremos que compactar o nosso executável antes de transferi-lo para o FTP. Nesse tutorial, o arquivo compactado deverá sempre se chamar “Atualizacao.rar” para que a aplicação o encontre para baixá-lo.
Mesmo assim, encontramos mais um impasse. O Delphi não possui uma função nativa para descompactação de arquivos com extensão RAR. É necessário a utilização de aplicativos externos ou a instalação de componentes de terceiros. Para não gerar complexidade, optei pela primeira opção. Usaremos o 7-Zip! Apenas dois arquivos desse aplicativo são suficientes: o executável e uma DLL. Baixe-os aqui e, em seguida, coloque-os na mesma pasta em que está a aplicação.
Pessoal, só para confirmação, estes são os arquivos que deverão estar em uma mesma pasta:
- Executável
- VersaoLocal.ini
- 7z.exe
- 7z.dll
O outro arquivo INI (VersaoFTP.ini) será baixado para essa pasta em tempo de execução.
Bom, o próximo passo é codificar uma rotina para baixar a atualização, descompactá-la, substituir o executável existente e atualizar o número da versão para que os dois arquivos INI fiquem iguais. Nossa, como faremos tudo isso?
Bom, aguardem a segunda parte dessa série de artigos!
Abraço e até a próxima semana!
Confira as outras partes desse artigo:
[Delphi] Atualização Automática – Parte 1
[Delphi] Atualização Automática – Parte 2
[Delphi] Atualização Automática – Parte 3
Muito boa a matéria, estou aguardando a continuação , e mais uma vez obrigado por esta sempre postando conteúdo novo e atualizado . ( Obs : eu tava escrevendo e fiz só o inicio da palavra e apertei Ctrl+Espaço kkkkkkk esperando que se completasse kkkkkkkkk esqueci que nao to no Delphi.)
Boa noite, André!
A continuação foi publicada hoje. Espero que continue curtindo essa série de artigos!
Grande abraço! (Obs: também já pressionei Ctrl + Espaço enquanto digitava um texto, haha)
Parabéns André!
Ótimo artigo, muito bem explicado e ilustrado, também estou no aguardo pela continuação, este assunto é muito interessante. Boa sorte.
Fala, Jessé! Quanto tempo!
A continuação do artigo foi publicada hoje. 🙂
Espero que continue acompanhando!
Grande abraço, amigo!
Muito boa mesmo, me ajudou bastante.
Obrigado, André!
Boa noite André.
Eu aqui de novo.
Vou acompanhar os artigos, sempre quis fazer assim, incluindo os detalhes de segurança.
Mas, para mim tem um obstáculo, até mesmo pro suporte remoto: nem todos os meus clientes tem internet.
Apesar de não ser bom deixar de atender alguns clientes, no futuro próximo, quem não tiver internet, vou cancelar o contrato de suporte (não sei exatamente como proceder), ou eles instalam internet. O custo do atendimento in loco é caro ou pro Desenvolvedor ou pro Cliente.
A sua proposta de atualização automática, sem dúvida, é a melhor opção.
Sei de antemão que os artigos serão proveitosos.
Obrigado.
Olá, Gerson!
Obrigado pelo feedback!
A ideia da funcionalidade automática surgiu da dificuldade que eu me deparava ao atualizar o software em vários clientes. Vários fatores complicavam essa atividade: conexão instável com a Internet, cliente indisponível na data da atualização, necessidade de notificar os clientes de novas versões, além, claro, do tempo despendido para concluir todas as atualizações.
Com o recurso de atualização automática, uma boa conexão com a Internet torna-se indispensável, assim como você mencionou.
Abraço!
Olá André L. Celestino, como vai?
Bom, encontrei seu site em busca de uma solução para meu probleminha com Socket no Delphi XE2.
Meu projeto contém uma aplicação do tipo Chat com criptografia, tudo está funcionando perfeitamente menos a parte da aplicação que envia arquivos.
Estou tendo muita dificuldade para enviar um arquivo, de qualquer tipo, via Socket.
Você poderia postar um exemplo?
Outra dúvida…
Como eu poderia utilizar um Timer para atualizar a leitura do Cliente/Servidor remoto?
Aguardo sua resposta.
Grato pela atenção.
Adriano.
Olá, Adriano, tudo certo?
Ainda não tenho um exemplo e nem um artigo sobre sockets, mas pretendo adicionar esse tema na pauta.
Assim que possível, publicarei algo relacionado, ok?
Abraço!
Tem um site brasileiro que oferece hospedagem grátis com mais espaço para quem tem executáveis “grandinhos”, http://hospedagemlivre.com.br/
Opa, muito obrigado pela colaboração, Sávio.
Vou dar uma olhada no site e, se for conveniente, atualizo o artigo!
Abraço!
Olá André, tudo bem?
Parabéns pelo belíssimo trabalho.
Estou tendo dificuldades com o esse artigo: https://www.andrecelestino.com/delphi-funcionalidade-de-atualizacao-automatica-parte-1/
Delphi – Atualização Automática – Parte 1 – André Celestino
Primeira parte do tutorial sobre como implementar a funcionalidade de atualização automática pelo Delphi utilizando arquivos INI e o componente TIdFTP.
andrecelestino.com
Gostaria muito de solucionar os problemas que estou tendo (Delphi 7).
Erro: [Error] Unit1.pas(135): Incompatible types: ‘WideChar’ and ‘Char’
Nessa linha: sNomeArquivoAtualizacao +’ -o’ + ObterDiretorioDoExecutavel), ”, SW_SHOW);
Obrigado desde já.
Abs
Jack Lima
Olá, Jack!
Já te respondi pela página do Facebook! 🙂
Parabéns! Dias atrás comprei um componente e não me agradei muito. Irei implementar em meus projetos.
Obrigado, André!
Espero que essa série de artigos seja útil para você!
Abraço!
Parabéns ótimo artigo. Eu poderia fazer um parecido. Tenho uma aplicação que tem um banco de dados SQL Server e queria saber como é possível automatizar a atualização do banco de dados.
Olá, Erasmo, tudo bem?
Com o SQL Server, você pode usar o sqlcmd. Trata-se de um utilitário de linha de comando que permite aplicar ações em um banco de dados, como executar um script. O seu atualizador automático, portanto, poderia chamar este utilitário automaticamente, indicando o arquivo de script que foi baixado na atualização.
Na verdade, é bem parecido com a atualização de bancos de dados Firebird, no qual utiliza-se o utilitário isql.
Abraço!
André L. Celestino ficou muito massa seu exemplo, parabéns!!
Obrigado, Cid! Abraço!
Muito boa matéria. Teria algum modo do atualizador executar um novo instalador, que leve de uma vez todas as extensões? Por exemplo, importar o Setup para a pasta Atualizacao.rar, descompactar e executar?
Olá, Lucas!
Sim, é possível! Na verdade, essa é a melhor opção para casos em que é necessário atualizar vários arquivos de diferentes extensões.
Para isso, após a descompactação do arquivo baixado (demonstrado na parte 2 da série de artigos), basta executar o instalador (Setup) com o comando WinExec, ShellExecute ou preferencialmente CreateProcess. Estes comandos simulam a ação de executar um instalador com duplo clique.
Abraço!
André,
Muito bem explicado. Excelente!!!!
Surgiu uma dúvida com relação o 7Z.exe.
Como funcionaria para clientes com 32bits e 64bits?
Explicando melhor, tem programa que está instalado em Windows 7 32bits e outros com 64bits.
Tenho que instalar no cliente?
Desde já agradeço.
Olá, Dirceu, ótima pergunta!
Eu não consigo fazer o teste por não ter um Windows x86 disponível, mas acredito que você pode utilizar a versão 32-bit x86 do 7-Zip para ambas as plataformas.
Isso se deve pelo fato de que programas 32bits rodam normalmente em Windows 64Bits. Já o inverso não funciona.
Lembrando que você não precisa instalá-lo no cliente. Basta apenas distribuir o executável (7z.exe) e a DLL (7z.dll) junto com a sua aplicação.
Abraço!
Nossa, estava precisando disso André. Muito obrigado você ajuda de mais. Tudo muito bem explicado. Obrigado!
Que bom, Josimar! Fico feliz por ajudá-lo!
Abração!
Olá André. Estou convertendo meu software de IBX para Firedac. Uma das rotinas que utilizo e que funciona bem é a questão da atualização do software. Até aí tudo bem, o usuario checa se tem atualizações, se tiver, baixa e faz a atualização. Porém nesse processo existe um atualizador de scripts. Ele é feito atraves de um componente herdado do IBScript do IBX. Porém ao migrar para firedac, utilizando o FDScript, do FireDac, não consigo fazer de forma similar, ja que o componente do IBX lê e processa o script linha a linha, o que não consigo fazer com o FDScript.
Gostaria que, se possível, me desse algum exemplo de como utilizar o FDScript para isso, de forma que, ao execuar o FDScript, linha a linha, sendo varias atualizados de varias tabelas, ocorresse algum erro ele desse um rollback, e caso todas as linhas sejam executadas sem erro, desse um commit ?
E parabéns pelo post. Idéia be legal.
Olá, Marley.
Vou entrar em contato com você por e-mail.
Show !!!
Obrigado pela atenção…
Fora esse site, teria algum outro que você indica? que seja free?
Opa, Luiz, veja essa lista aqui:
https://www.filestash.app/free-ftp.html
Não testei, mas podem ser úteis também!
Abraço.