Recentemente fiz algo muito parecido do que o Adriano mencionou. No
meu caso, eu criei um aplicativo a parte que faz a verificação,
atualiza se necessário, e ao final chama o aplicativo principal. Logo,
o aplicativo principal não estará em uso durante a atualização.

No meu caso eu atualizo o arquivo .ini que é utilizado no sistema e o
executável.

Segue o código:

procedure TFrmPrincipal.FormCreate(Sender: TObject);
var
   exepastaBackup, inipastaBackup, exeLocal, exeRede, iniLocal,
iniRede, Mensagem : String;
   ini : TIniFile;
   exeDataLocal, exeDataRede, iniDataLocal, iniDataRede : String;
Begin
   ini := 
TIniFile.Create(ExtractFilePath(Application.Exename)+'Meu_Sistema.ini');

   //exeLocal é o caminho completo (Caminho + Nome) do executavel
local do usuário.
   //exeRede é o caminho completo (Caminho + Nome) do executavel da
Rede Versão mais atualizada.

   exeLocal := ExtractFilePath(Application.ExeName)+ 'Meu_Sistema.exe';
   exeRede  := ini.ReadString('Atualizador', 'exeRede','');

   //iniLocal é o caminho completo (Caminho + Nome) do arquivo ini
local do usuário.
   //iniRede é o caminho completo (Caminho + Nome) do arquivo ini da
Rede Versão mais atualizada.

   iniLocal := ExtractFilePath(Application.ExeName)+ 'Meu_Sistema.ini';
   iniRede  := ini.ReadString('Atualizador', 'iniRede','');

   //inipastaBackup é a pasta onde será armazenada o backup da versão
antiga do arquivo ini antes da atualização
   //exepastaBackup é a pasta onde será armazenada o backup da versão
antiga do executavel antes da atualização

   inipastaBackup  := ExtractFilePath(Application.ExeName)+
'_VersaoAnterior\Meu_Sistema.ini';
   exepastaBackup  := ExtractFilePath(Application.ExeName)+
'_VersaoAnterior\Meu_Sistema.exe';

   // exeDataLocal recebe a DataHora do arquivo local.
   // exeDataRede recebe a DataHora do arquivo do servidor.
   try
      if FileExists(exeLocal) then
         exeDataLocal := FormatDateTime('dd/mm/yyyy hh:mm:ss',
FileDateToDateTime(FileAge(exeLocal)));
      if FileExists(exeRede) then
         exeDataRede := FormatDateTime('dd/mm/yyyy hh:mm:ss',
FileDateToDateTime(FileAge(exeRede)));
   except
   end;

   // iniDataLocal recebe a DataHora do arquivo local.
   // iniDataRede recebe a DataHora do arquivo do servidor.
   try
      if FileExists(iniLocal) then
         iniDataLocal := FormatDateTime('dd/mm/yyyy hh:mm:ss',
FileDateToDateTime(FileAge(iniLocal)));
      if FileExists(iniRede) then
         iniDataRede := FormatDateTime('dd/mm/yyyy hh:mm:ss',
FileDateToDateTime(FileAge(iniRede)));
   except
   end;
   ini.Destroy;

   // Verifica se a versão da Local do EXECUTÁVEL é menor do que a
disponível no Servidor
   // Se for, o sistema vai executar um aplicativo chamado
   // Atualizador.exe que estará no servidor e encerrará o
   // seu sistema, para que o mesmo seja atualizado.
   If exeDataLocal < exeDataRede then
      begin
         Try
            Mensagem := 'Foi detectada uma nova versão do Sistema Pecroll.'+#13+
            'O sistema será atualizado.  ' + #13 + #13;
            Application.MessageBox(PChar(Mensagem), 'Sistema Pecroll',
MB_OK+MB_ICONEXCLAMATION);

         // A linha abaixo fará com que o aplicativo tente atualizar o
sistema (Copiando e Sobreescrevendo da rede para a
         // maquina local). Após a atualização o sistema é executado e
este aplicativo (Atualizador) será finalizado.
            CopyFile(Pchar(exeLocal),Pchar(exepastaBackup), False);
            CopyFile(Pchar(exeRede),Pchar(exeLocal), False);

         Except
            Mensagem := 'Não foi possível efetuar a atualização disponível.! '+
                         #13 + #13 + 'Entre em contato com o
Administrador do Sistema.';
            Application.MessageBox(PChar(Mensagem), 'Erro', MB_OK+MB_ICONERROR);
            Abort;
         End;
      End; //Fim de procedimentos de Atualização do executável


   // Verifica se a versão da Local do arquivo INI é menor do que a
disponível no Servidor
   // Se for, o sistema vai executar um aplicativo chamado
   // Atualizador.exe que estará no servidor e encerrará o
   // seu sistema, para que o mesmo seja atualizado.
   If iniDataLocal < iniDataRede then
      begin
         Try
         // A linha abaixo fará com que o aplicativo tente atualizar o
sistema (Copiando e Sobreescrevendo da rede para a
         // maquina local). Após a atualização o sistema é executado e
este aplicativo (Atualizador) será finalizado.
            CopyFile(Pchar(iniLocal),Pchar(inipastaBackup), False);
            CopyFile(Pchar(iniRede),Pchar(iniLocal), False);
         Except
            Abort;
         End;
      End; //Fim de procedimentos de Atualização do arquivo INI

   WinExec(PChar(exeLocal), SW_SHOWNORMAL);
   Application.Terminate;
end;

[]
Andrei

Em 05/06/07, Luis Lopes<[EMAIL PROTECTED]> escreveu:
> Adriano,
>
> A nivel de curiosidade: como vc atualiza o arquivo .exe que está sendo 
> executado?
>
> []´s
> Luis Alberto P. Lopes
> Desenvolvimento de Sistemas
> Belo Horizonte - Minas Gerais
>
>
>
>
> ----- Mensagem original ----
> De: Adriano de Oliveira <[EMAIL PROTECTED]>
> Para: delphi-br@yahoogrupos.com.br
> Enviadas: Terça-feira, 5 de Junho de 2007 15:47:00
> Assunto: Re: [delphi-br] Atualização de Versão de Sistema em Rede
>
> Aqui eu desenvolvi um atualizador que verifica em um diretorio na rede os 
> arquivos existentes e
> compara com o diretorio do aplicativo na maquina cliente.
> Caso encontre algum arquivo na rede que não exista no cliente ele copia.
> Se o arquivo já existir eu comparo a data/hora dos arquivos e se o arquivo da 
> rede
> for mais novo eu copio ele substituindo o arquivo local.
>
> Com isso eu só atualizo os arquivos na rede.
>
> []'s
> Adriano
>
>   ----- Original Message -----
>   From: Claudiney-listas
>   To: delphi-br@yahoogrupos.com.br
>   Sent: Tuesday, June 05, 2007 3:18 PM
>   Subject: RES: [delphi-br] Atualização de Versão de Sistema em Rede
>
>
>   Olá Raphael...
>
>   Eu não tenho a matéria em mãos pra poder te dar mais detalhes, mas na
>   ClubeDelphi deste mês tem uma matéria sobre deploy automático. Acho que é
>   bem isso que vc precisa... um aplicativo de manutenção da versão e outro de
>   atualização, que mantém os terminais sempre na mesma versão do servidor.
>   Acho que é algo mais ou menos assim. Mas dá uma olhada na revista ou no site
>   da clubedelphi que tenho certeza que vai te ajudar.
>
>   Abraço
>
>   _____________________________________
>
>   Claudiney Cogo
>
>   N2 Sistemas e Soluções em Informática
>
>   Av. São Paulo, 172 - 15º Andar - Sala 1505
>
>   Maringá - Paraná
>
>   www.n2solutions.com.br
>
>   De: delphi-br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em
>   nome de Raphae Fonseca
>   Enviada em: terça-feira, 5 de junho de 2007 14:52
>   Para: delphi-br@yahoogrupos.com.br
>   Assunto: [delphi-br] Atualização de Versão de Sistema em Rede
>
>   Boa tarde amigos da lista.
>
>   Estou precisando desenvolver um atualizador de executáveis do sistema via
>   rede.
>   Algum amigo já desenvolveu algo parecido e poderia me dar algumas dicas???
>   No aguardo
>   Raphael

Responder a