A função a seguir ( fonte: DtDelphi ) pega informações do exe ( desde que você faça o compilador do incluí-las com a Opção Version Info do projeto )
function FileVerInfo(const FileName: string;var FileInfo: TStringList): Boolean; // // Obtem diversas informações de um arquivo executável // // Requer um StringList criado antes de executar a função // deve ser declarado na clausula Var no inicio da Unit // StrLst := TStringList.Create; // // const Key: array[1..9] of string =('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'OriginalFilename', 'ProductName', 'ProductVersion', 'Comments'); KeyBr: array [1..9] of string = ('Empresa..........................', 'Descricao........................', 'Versao do Arquivo...........', 'Nome Interno...................', 'Copyright..........................', 'Nome Original do Arquivo.', 'Produto.............................', 'Versao do Produto............', 'Comentarios...............:'); var Dummy : THandle; BufferSize, Len : Integer; Buffer : PChar; LoCharSet, HiCharSet : Word; Translate, Return : Pointer; StrFileInfo, Flags : string; TargetOS, TypeArq : string; FixedFileInfo : Pointer; i : Byte; begin Result := False; If not FileExists(FileName) then begin showmessage('Arquivo não encontrado'); Result := False; exit; end; BufferSize := GetFileVersionInfoSize(PChar(FileName), Dummy); if BufferSize <> 0 then begin GetMem(Buffer, Succ(BufferSize)); try if GetFileVersionInfo(PChar(FileName), 0, BufferSize,Buffer) then begin if VerQueryValue(Buffer, '\VarFileInfo\Translation', Translate, UINT(Len)) then begin LoCharSet := LoWord(Longint(Translate^)); HiCharSet := HiWord(Longint(Translate^)); for i := 1 to 9 do begin StrFileInfo := Format('\StringFileInfo\0%x0%x\%s',[LoCharSet, HiCharSet, Key[i]]); ifVerQueryValue(Buffer,PChar(StrFileInfo), Return,UINT(Len)) then begin FileInfo.Add(KeyBr[i] + ': ' + PChar(Return)); end; end; if VerQueryValue(Buffer,'\',FixedFileInfo, UINT(Len)) then withTVSFixedFileInfo(FixedFileInfo^) do begin Flags := ''; if (dwFileFlags and VS_FF_DEBUG) = VS_FF_DEBUG then begin Flags := Concat(Flags,'*Debug* '); end; if (dwFileFlags and VS_FF_SPECIALBUILD) = VS_FF_SPECIALBUILD then begin Flags := Concat(Flags, '*Special Build* '); end; if (dwFileFlags and VS_FF_PRIVATEBUILD) = VS_FF_PRIVATEBUILD then begin Flags := Concat(Flags, '*Private Build* '); end; if (dwFileFlags and VS_FF_PRERELEASE) = VS_FF_PRERELEASE then begin Flags := Concat(Flags, '*Pre-Release Build* '); end; if (dwFileFlags and VS_FF_PATCHED) = VS_FF_PATCHED then begin Flags := Concat(Flags, '*Patched* '); end; if Flags <> '' then begin FileInfo.Add('Atributos: ' + Flags); end; TargetOS := 'Plataforma (OS): '; case dwFileOS of VOS_UNKNOWN : TargetOS := Concat(TargetOS, 'Desconhecido'); VOS_DOS : TargetOS := Concat(TargetOS, 'MS-DOS'); VOS_OS216 : TargetOS := Concat(TargetOS, '16-bit OS/2'); VOS_OS232 : TargetOS := Concat(TargetOS, '32-bit OS/2'); VOS_NT : TargetOS := Concat(TargetOS, 'Windows NT'); VOS_NT_WINDOWS32, 4: TargetOS := Concat(TargetOS, 'Win32 API'); VOS_DOS_WINDOWS16: TargetOS := Concat(TargetOS, '16-bit Windows ','sob MS-DOS'); else TargetOS := Concat(TargetOS, 'Fora do Padrão. Código: ', IntToStr(dwFileOS)); end; FileInfo.Add(TargetOS); TypeArq := 'Tipo de Arquivo: '; case dwFileType of VFT_UNKNOWN : TypeArq := Concat(TypeArq,'Desconhecido'); VFT_APP : TypeArq := Concat(TypeArq,'Aplicacao'); VFT_DLL : TypeArq := Concat(TypeArq,'Dynamic-Link Lib.'); VFT_DRV : begin TypeArq := Concat(TypeArq,'Device driver - Driver '); case dwFileSubtype of VFT2_UNKNOWN : TypeArq := Concat(TypeArq,'Desconhecido'); VFT2_DRV_PRINTER : TypeArq := Concat(TypeArq,'de Impressao'); VFT2_DRV_KEYBOARD : TypeArq := Concat(TypeArq,'de Teclado'); VFT2_DRV_LANGUAGE : TypeArq := Concat(TypeArq,'de Idioma'); VFT2_DRV_DISPLAY : TypeArq := Concat(TypeArq,'de Vídeo'); VFT2_DRV_MOUSE : TypeArq := Concat(TypeArq,'de Mouse'); VFT2_DRV_NETWORK : TypeArq := Concat(TypeArq,'de Rede'); VFT2_DRV_SYSTEM : TypeArq := Concat(TypeArq,'de Sistema'); VFT2_DRV_INSTALLABLE : TypeArq := Concat(TypeArq,'Instalavel'); VFT2_DRV_SOUND : TypeArq := Concat(TypeArq,'Multimida'); end; end; VFT_FONT : begin TypeArq := Concat(TypeArq,'Fonte - Fonte '); case dwFileSubtype of VFT2_UNKNOWN : TypeArq := Concat(TypeArq, 'Desconhecida'); VFT2_FONT_RASTER : TypeArq := Concat(TypeArq,'Raster'); VFT2_FONT_VECTOR : TypeArq := Concat(TypeArq,'Vetorial'); VFT2_FONT_TRUETYPE : TypeArq := Concat(TypeArq,'TrueType'); end; end; VFT_VXD : TypeArq := Concat(TypeArq,'Virtual Device'); VFT_STATIC_LIB: TypeArq := Concat(TypeArq,'Static-Link Lib.'); end; FileInfo.Add(TypeArq); end; end; end; finally FreeMem(Buffer, Succ(BufferSize)); Result := FileInfo.Text <> ''; end; end; end; Em 22/02/08, Carlos <[EMAIL PROTECTED]> escreveu: > > Ta... entendo > > Mas como faço isso? Alguem tem algum exemplo prático? > > obrigado > > Consultores Software <[EMAIL PROTECTED]<consultoressoftware%40gmail.com>> > escreveu: > Pelo menos nas empresas onde trabalhei, essa solução de manter um só exe > no > servidor funciona muito bem. O único problema é fazer com que os usuários > ( > cerca de 50, em média) fechem o aplicativo no momento da atualização, o > que > pode ser contornado se as atualizações puderem ser feitas em horários em > que > o sistema não é utilizado. > > Agora, se não tiver jeito mesmo, melhor comparar as versões dos arquivos > exe > ( servidor e local ) e fazer a cópia, caso necessário. > > Em 22/02/08, Guionardo Furlan <[EMAIL PROTECTED] <guionardo%40gmail.com>> > escreveu: > > > > Será mesmo uma boa idéia? Discordo. > > > > Eu deixaria uma versão do executável no servidor, com um arquivo texto > > indicando a versão. > > Nos clientes, um aplicativo inicializador compararia a versão do > > executável local com a versão do executável remoto. Em caso de > > diferença, copiará do servidor. > > Por último, o aplicativo inicializador chama o executável localmente. > > > > Em 22/02/08, Consultores Software <[EMAIL > > PROTECTED]<consultoressoftware%40gmail.com> > <consultoressoftware%40gmail.com>> > > escreveu: > > > > > > Antes de pensar num atualizador, não seria mais fácil deixar um > > executável > > > só no servidor e mapear para que cada usuário tenha acesso a ele via > > rede, > > > do que distribuir várias cópias ? Assim, você teria que atualizar uma > > vez > > > só. Um ponto crítico aí é que, para atualizar esse aplicativo, todos > os > > > usuários terão que sair dele em suas máquinas, a menos que o servidor > > seja > > > linux, que permite sobrescrever o exe mesmo que ele esteja em uso . > > > > > > Em 22/02/08, Carlos <[EMAIL PROTECTED]<ca_programador007%40yahoo.com.br> > <ca_programador007%40yahoo.com.br>> > > escreveu: > > > > > > > > Olá amigos, > > > > > > > > Tenho um aplicativo onde o banco de dados fica no servidor e cada > > maquina > > > > tem um executavel .exe para acessar o banco de dados. > > > > Muitas vezes eu preciso atualizar o .exe e preciso ir de máquina em > > > > máquina para atualizar o arquivo, e isso é muito chato porque são > > várias > > > > máquinas. > > > > Eu sei que existe uma forma fácil de resolver isso, utilizando um > > > > atualizador automático que fica direto no servidor e todos os > usuarios > > > > quando executam o executavel busca a atualizacao no servidor. > > > > Gostaria de saber como faz isso. Alguem me ajuda a começar? Nem sei > > por > > > > onde começar. > > > > > > > > Obrigado e aguardo ajuda. > > > > Carlos > > > > > > > > -- > > Timeo hominem unius libri > > Cogito ergo sum - Carpe diem > > > > []s > > Guionardo Furlan > > http://guionardo.blogspot.com > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > --------------------------------- > Abra sua conta no Yahoo! Mail, o único sem limite de espaço para > armazenamento! > > [As partes desta mensagem que não continham texto foram removidas] > > > [As partes desta mensagem que não continham texto foram removidas]