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:
- 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).
- 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;