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