Handle the class of the executable version number. The implementation code is as follows:
TMFileVersion = Class
Private
Fmajor: integer;
FMINOR: Integer;
Frelease: Integer;
FBUILD: Integer;
Function Getverstr: String;
Procedure setVerstr (averstr: string);
public
Constructor crete;
DESTRUCTOR DESTROY; OVERRIDE;
Procedure getversionFromFile (AfileName: String);
Function Compare (AVER: TMFileVersion): Integer;
Property Verstr: String Read Getverstr Write setVerstr;
END;
{TMFileVersion}
// init
Constructor TMFileVersion.create;
Begin
Inherited;
FMAJOR: = 0;
FMINOR: = 0;
FRELEASE: = 0;
FBUILD: = 0;
END;
Destructor TMFileVersion.destroy;
Begin
Inherited;
END;
// Get Version Info from a file
Procedure TMFileVersion.getVersionFromFile (AfileName: String);
Type
PVS_FIXEDFILEINFO = ^ vs_fixedfileinfo;
VAR
H: cardinal; // a Handle, Ignore
nsize: cardinal; // version info size
PDATA: POINTER; // Version Info Data
PFFIDATA: PVS_FIXEDFILEINFO; / / FIXED File Info Data
NFFISIZE: cardinal; // fixed file info size
Begin
FMAJOR: = 0;
FMINOR: = 0;
FRELEASE: = 0;
FBUILD: = 0;
IF (FileExists (AfileName).
FBUILD: = 1;
nsize: = getfileversionInfosize (Pchar (AfileName), H);
IF (nsize = 0) THEN
EXIT;
GetMem (PDATA, NSIZE);
Try
GetFileVersionInfo (Pchar (AfileName), H, NSIZE, PDATA);
IF (PDATA, '/', Pointer (PfFFIDATA), NFFISIZE)) THEN
Begin
Fmajor: = (pfFFIDATA ^ .dwfileversionms) SHR 16;
Fminor: = (pfFFIDATA ^ .dwfileversionms) and $ fff;
Frelease: = (pffidata ^ .dwfileversionls) SHR 16;
FBUILD: = (pffiData ^ .dwfileversionls) and $ fff;
END;
Finally
FreeMem (PDATA);
END;
END;
// Compare Two Version Info
Function TMFileVersion.comPare (AVER: TMFileVersion): Integer;
VAR
N1, N2: cardinal
Begin
N1: = (Fmajor SHL 16) OR FMINOR;
With aver do
N2: = (Fmajor SHL 16) OR FMINOR;
IF (n1> n2) THEN
Result: = 1
ELSE IF (N1 Result: = -1 Else Begin N1: = (FRELEASE SHL 16) or FBuild; With aver do N2: = (Frelease SHL 16) or FBuild; IF (n1> n2) THEN Result: = 1 ELSE IF (N1 Result: = -1 Else Result: = 0; END; END; // Get / set Property - Verstr Function TMFileVersion.getVerstr: String; Begin Result: = format ('% D,%. 02d,% D,%. 02d', [FMAJOR, FMINOR, FRELEASE, FBUILD]); END; Procedure TMFileVersion.setverstr (Averstr: String); VAR Stemp: tstrings; Begin FMAJOR: = 0; FMINOR: = 0; FRELEASE: = 0; FBUILD: = 0; STEMP: = TSTRINGLIST.CREATE; Try STEMP.COMMATEXT: = AVERSTR; Try Fmajor: = start (STEMP.STRINGS [0]); Fminor: = start (STEMP.STRINGS [1]); FRELEASE: = STRTOINT (STEMP.STRINGS [2]); FBUILD: = STRTOINT (STEMP.STRINGS [3]); Except // do nothing END; Finally STEMP.FREE; END; END;