xe2 tokyo embarcadero borland delphi version

tokyo - delphi xe2



Cómo determinar la versión de la aplicación Delphi (6)

Desea obtener el número de compilación de la aplicación Delphi y publicarlo en la barra de título


Así es como lo hago. Puse esto en casi todas mis pequeñas utilidades:

procedure GetBuildInfo(var V1, V2, V3, V4: word); var VerInfoSize, VerValueSize, Dummy: DWORD; VerInfo: Pointer; VerValue: PVSFixedFileInfo; begin VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy); if VerInfoSize > 0 then begin GetMem(VerInfo, VerInfoSize); try if GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo) then begin VerQueryValue(VerInfo, ''/', Pointer(VerValue), VerValueSize); with VerValue^ do begin V1 := dwFileVersionMS shr 16; V2 := dwFileVersionMS and $FFFF; V3 := dwFileVersionLS shr 16; V4 := dwFileVersionLS and $FFFF; end; end; finally FreeMem(VerInfo, VerInfoSize); end; end; end; function GetBuildInfoAsString: string; var V1, V2, V3, V4: word; begin GetBuildInfo(V1, V2, V3, V4); Result := IntToStr(V1) + ''.'' + IntToStr(V2) + ''.'' + IntToStr(V3) + ''.'' + IntToStr(V4); end; procedure TForm1.FormCreate(Sender: TObject); begin Form1.Caption := Form1.Caption + '' - v'' + GetBuildInfoAsString; end;


De http://www.martinstoeckli.ch/delphi/delphi.html#AppVersion

Con esta función, puede obtener la versión de un archivo, que contiene un recurso de versión. De esta forma, puede mostrar el número de versión de su aplicación en un diálogo de información. Para incluir un recurso de versión en su aplicación Delphi, configure "Versioninfo" en las opciones del proyecto.


Gracias a las publicaciones anteriores, hice mi propia biblioteca para este propósito.

Creo que es un poco más correcto que todas las otras soluciones aquí, así que lo comparto, siéntete libre de reutilizarlo ...

unit KkVersion; interface function FileDescription: String; function LegalCopyright: String; function DateOfRelease: String; // Proprietary function ProductVersion: String; function FileVersion: String; implementation uses Winapi.Windows, System.SysUtils, System.Classes, Math; (* function GetHeader(out AHdr: TVSFixedFileInfo): Boolean; var BFixedFileInfo: PVSFixedFileInfo; RM: TMemoryStream; RS: TResourceStream; BL: Cardinal; begin Result := False; RM := TMemoryStream.Create; try RS := TResourceStream.CreateFromID(HInstance, 1, RT_VERSION); try RM.CopyFrom(RS, RS.Size); finally FreeAndNil(RS); end; // Extract header if not VerQueryValue(RM.Memory, ''//', Pointer(BFixedFileInfo), BL) then Exit; // Prepare result CopyMemory(@AHdr, BFixedFileInfo, Math.Min(sizeof(AHdr), BL)); Result := True; finally FreeAndNil(RM); end; end; *) function GetVersionInfo(AIdent: String): String; type TLang = packed record Lng, Page: WORD; end; TLangs = array [0 .. 10000] of TLang; PLangs = ^TLangs; var BLngs: PLangs; BLngsCnt: Cardinal; BLangId: String; RM: TMemoryStream; RS: TResourceStream; BP: PChar; BL: Cardinal; BId: String; begin // Assume error Result := ''''; RM := TMemoryStream.Create; try // Load the version resource into memory RS := TResourceStream.CreateFromID(HInstance, 1, RT_VERSION); try RM.CopyFrom(RS, RS.Size); finally FreeAndNil(RS); end; // Extract the translations list if not VerQueryValue(RM.Memory, ''//VarFileInfo//Translation'', Pointer(BLngs), BL) then Exit; // Failed to parse the translations table BLngsCnt := BL div sizeof(TLang); if BLngsCnt <= 0 then Exit; // No translations available // Use the first translation from the table (in most cases will be OK) with BLngs[0] do BLangId := IntToHex(Lng, 4) + IntToHex(Page, 4); // Extract field by parameter BId := ''//StringFileInfo//' + BLangId + ''//' + AIdent; if not VerQueryValue(RM.Memory, PChar(BId), Pointer(BP), BL) then Exit; // No such field // Prepare result Result := BP; finally FreeAndNil(RM); end; end; function FileDescription: String; begin Result := GetVersionInfo(''FileDescription''); end; function LegalCopyright: String; begin Result := GetVersionInfo(''LegalCopyright''); end; function DateOfRelease: String; begin Result := GetVersionInfo(''DateOfRelease''); end; function ProductVersion: String; begin Result := GetVersionInfo(''ProductVersion''); end; function FileVersion: String; begin Result := GetVersionInfo(''FileVersion''); end; end.


Hacemos esto para todas nuestras aplicaciones, pero usamos un componente de Raize, RzVersioninfo. funciona bastante bien solo necesita usar el siguiente código

en la forma de crear

Leyenda: = RzVersioninfo1.filedescripion + '':'' + RzVersionInfo1.FileVersion;

obviamente, si no desea que ninguno de los otros componentes funcione, use una de las opciones anteriores, ya que los componentes de Raize tienen un costo.


Pase el nombre de archivo completo de su EXE a esta función, y devolverá una cadena como: 2.1.5.9, o cualquiera que sea su versión #.

function GetFileVersion(exeName : string): string; const c_StringInfo = ''StringFileInfo/040904E4/FileVersion''; var n, Len : cardinal; Buf, Value : PChar; begin Result := ''''; n := GetFileVersionInfoSize(PChar(exeName),n); if n > 0 then begin Buf := AllocMem(n); try GetFileVersionInfo(PChar(exeName),0,n,Buf); if VerQueryValue(Buf,PChar(c_StringInfo),Pointer(Value),Len) then begin Result := Trim(Value); end; finally FreeMem(Buf,n); end; end; end;

Después de definir eso, puede usarlo para configurar el título de su formulario de la siguiente manera:

procedure TForm1.FormShow(Sender: TObject); begin //ParamStr(0) is the full path and file name of the current application Form1.Caption := Form1.Caption + '' version '' + GetFileVersion(ParamStr(0)); end;


Recomiendo encarecidamente no utilizar GetFileVersion cuando quiera saber la versión del ejecutable que se está ejecutando actualmente. Tengo dos buenas razones para hacer esto:

  1. El ejecutable puede ser inaccesible (unidad desconectada / compartir) o cambiado (.exe renombrado a .bak y reemplazado por un nuevo .exe sin que se detenga el proceso en ejecución).
  2. Los datos de la versión que está tratando de leer ya se han cargado en la memoria y están disponibles para usted cargando este recurso, que siempre es mejor que realizar operaciones de disco adicionales (relativamente lentas).

Para cargar el recurso de versión en Delphi, uso un código como este:

uses Windows,Classes,SysUtils; var verblock:PVSFIXEDFILEINFO; versionMS,versionLS:cardinal; verlen:cardinal; rs:TResourceStream; m:TMemoryStream; p:pointer; s:cardinal; begin m:=TMemoryStream.Create; try rs:=TResourceStream.CreateFromID(HInstance,1,RT_VERSION); try m.CopyFrom(rs,rs.Size); finally rs.Free; end; m.Position:=0; if VerQueryValue(m.Memory,''/',pointer(verblock),verlen) then begin VersionMS:=verblock.dwFileVersionMS; VersionLS:=verblock.dwFileVersionLS; AppVersionString:=Application.Title+'' ''+ IntToStr(versionMS shr 16)+''.''+ IntToStr(versionMS and $FFFF)+''.''+ IntToStr(VersionLS shr 16)+''.''+ IntToStr(VersionLS and $FFFF); end; if VerQueryValue(m.Memory,PChar(''//StringFileInfo//'+ IntToHex(GetThreadLocale,4)+IntToHex(GetACP,4)+''//FileDescription''),p,s) or VerQueryValue(m.Memory,''//StringFileInfo//040904E4//FileDescription'',p,s) then //en-us AppVersionString:=PChar(p)+'' ''+AppVersionString; finally m.Free; end; end;