Software version compares another method without INI record

xiaoxiao2021-03-06  55

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;

转载请注明原文地址:https://www.9cbs.com/read-76699.html

New Post(0)