Se você está cansado de tanto atualizar estações cliente em uma rede local, depois de atualizar o servidor, implemente a solução deste artigo.


Crie um novo projeto no Delphi.

Adicione uma nova unit e a salve como uVerificaVersao.

Substitua todo o código, pelo código abaixo:

unit uVerificaVersao;

interface

 uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles,  ShellAPI;



 Function GetCaminhoIniFile:String;
 function GetVersion(sFileName:string): string;
 function EncontrouIni :Boolean;
 function  ValidaArquivos(exeLocal, exeRemoto:String): Boolean;
 function  CopyData(const fromDir, toDir: string): Boolean;
 procedure  CopiarNovaVersao(exeLocal, exeRemoto:String);

implementation


//Retorna o caminho do arquivo INI
Function GetCaminhoIniFile:String;
begin
  result:= ExtractFileDir(Application.ExeName)+'\ConfigArquivos.ini';
end;

function  EncontrouIni: Boolean;
begin
  result :=True;
 //se não encontrar o arquivo ini, retorna falseo e exibe mesnagem
  if not FileExists(GetCaminhoIniFile) then
  begin
     Application.MessageBox(Pchar('O arquivo de configurações não foi encontrado.'+#13+
                               GetCaminhoIniFile), 'Atenção', MB_OK+MB_ICONEXCLAMATION);
     result :=False;
  end;
end;

function  ValidaArquivos(exeLocal, exeRemoto:String): Boolean;
begin
  result:=True;
   //verifica se se o arquivo local existe
   if not FileExists(exeLocal) then
   begin
       Application.MessageBox(Pchar('O arquivo local não foi encontrado.'+#13+
                                exeLocal), 'Atenção', MB_OK+MB_ICONEXCLAMATION);
       result :=False;
   end else
   //verifica se o arquivo remoto existe
   if not FileExists(exeRemoto) then
   begin
       Application.MessageBox(Pchar('O arquivo Remoto não foi encontrado.'+#13+
                                exeRemoto), 'Atenção', MB_OK+MB_ICONEXCLAMATION);
       result :=False;
   end;
end;

//Função usada para copiar arquivos
function  CopyData(const fromDir, toDir: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc  := FO_COPY;
    fFlags := {FOF_SILENT or} FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    pFrom  := PChar(fromDir + #0);
    pTo    := PChar(toDir);
  end;
  Result := (0 = ShFileOperation(fos));
end;


{Função que retorna a versão do executável
para ativar o controle de versões de seu executável, no delphi, com o projeto aberto,
vá em Project=>Options=>Version Info e marque a opção Include version information in project}
function GetVersion(sFileName:string): string;
var
  VerInfoSize  : DWORD;
  VerInfo      : Pointer;
  VerValueSize : DWORD;
  VerValue     : PVSFixedFileInfo;
  Dummy        : DWORD;
begin
try
  VerInfoSize := GetFileVersionInfoSize(PChar(sFileName), Dummy);
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PChar(sFileName), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
  with VerValue^ do
  begin
    Result := IntToStr(dwFileVersionMS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
    Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);
  end;
  FreeMem(VerInfo, VerInfoSize);
  except //se ocorrer um erro retorna a versão 1.0.0.0, vai ocoorer um erro se o arquivo não tiver versão
    Result:='1.0.0.0';
 end;
end;


procedure  CopiarNovaVersao(exeLocal, exeRemoto:String);
begin
  Application.MessageBox(pchar('Foi encontrada uma nova versão do programa no servidor.'+#13+
                               'Versão Atual : '+GetVersion(exeLocal)+#13+
                               'Nova versão  : '+GetVersion(exeRemoto)), 'Atenção', MB_OK+MB_ICONERROR);

//faz um backup do arquivo velho para o fomato arquivo.exeDD_MM_yyyy
 if RenameFile(exeLocal, (exeLocal+FormatDateTime('dd_mm_yyyy', date))) then
   if not  CopyData(exeRemoto, exeLocal) then //copia o arquivo
      Application.MessageBox('Ocorreu um erro ao copiar nova versão do servidor.',
                                   'Atenção', MB_OK+MB_ICONERROR);
end;

end.


Em seguida vá no Menu project=>View Source substitua o código pelo código abaixo:

program verificaVersao;

uses
  Forms,
  IniFiles,
  Windows,
  uVerificaVersao in 'uVerificaVersao.pas';

{$R *.res}
var
  ini       :TIniFile;
  exeLocal  :String;
  exeRemoto :string;
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := False;

  //Se encontrou o arquivo ini
  if EncontrouIni then
  begin
    //cria o  IniFile
    ini       :=TIniFile.Create(GetCaminhoIniFile);
    //passa para as variáveis os caminhso dos arquivos
    exeLocal  :=ini.ReadString('ARQUIVOS', 'exeLocal', '');
    exeRemoto :=ini.ReadString('ARQUIVOS', 'exeRemoto', '');
    //valida os arquivos
    if ValidaArquivos(exeLocal, exeRemoto) then
    begin
      if GetVersion(exeLocal) <>  GetVersion(exeRemoto)  then
        copiarNovaVersao(exeLocal, exeRemoto);
      //executa o arquivo local
      WinExec(pchar(exeLocal), 1);
    end;
    ini.Free; //remove o objeto
  end;
  Application.Terminate;
end.


Em seguida crie um arquivo de texto e o salve dentro da pasta do seu projeto (este projeto), com o nome de ConfigArquivos.ini.

Este arquivo deve conter o seguinte:

[ARQUIVOS]
exeLocal=C:\pastaDoSeuAplicativo\seuAplicativo.exe
exeRemoto=\\nomeServidorNaRede\pastaCompartilhadaDoSeuPrograma\seuAplicativo.exe


Para que a verificação seja executada cada vez que o programa é executado numa estação cliente, em vez de criar um atalho para C:\pastaDoSeuAplicativo\seuAplicativo.exe na área de trabalho, ou menu iniciar => Programas crie um atalho para o aplicativo que você acabou de criar, pois ele fará a verificação de versão e chamará seu aplicativo em seguida.


Devo agradecer a meu amigo Romeu Cornelius Jr, pois este artigo foi  baseado num projeto dele.