unit VersionControl; {$MODE Delphi} {$codepage UTF8} interface uses LCLIntf, LCLType, LMessages, SysUtils, StrUtils, Forms, Classes, {$IFDEF WINDOWS}PJVersionInfo{$ENDIF}; type TSmallVersionInfo = record sviMajor, sviMinor: int64; end; type TVersionInfo = record viMajor, viMinor, viRelease, viBuild: integer; end; function SmallVersionInfoToStr (const Value: TSmallVersionInfo): string; stdcall; function VersionInfoToStr (const Value: TVersionInfo): string; stdcall; function VersionInfoToSmallVersionInfo (const Value: TVersionInfo): TSmallVersionInfo; stdcall; function SmallVersionInfoToVersionInfo (const Value: TSmallVersionInfo; const ANilValue: integer = 0): TVersionInfo; stdcall; function StrToVersionInfo (const AString: string): TVersionInfo; stdcall; function StrToSmallVersionInfo (const AString: string): TSmallVersionInfo; stdcall; function CompareVersionInfo (const AVersionInfo1, AVersionInfo2: TVersionInfo): integer; stdcall; function CompareSmallVersionInfo (const ASmallVersionInfo1, ASmallVersionInfo2: TSmallVersionInfo): integer; stdcall; {$IFDEF WINDOWS}function GetApplicationVersionInfoStr (const AFileName, AVersionSTR: string): string; STDCALL;{$ENDIF} const NilVersionInfo: TVersionInfo = (viMajor: 0; viMinor: 0; viRelease: 0; viBuild: 0); NilSmallVersionInfo: TSmallVersionInfo = (sviMajor: 0; sviMinor: 0); implementation function SmallVersionInfoToStr (const Value: TSmallVersionInfo): string; const Mask: string = '%d.%d'; begin Result:= Format(Mask, [Value.sviMajor, Value.sviMinor]); end; function VersionInfoToStr (const Value: TVersionInfo): string; const Mask: string = '%d.%d.%d.%d'; begin Result:= Format(Mask, [Value.viMajor, Value.viMinor, Value.viRelease, Value.viBuild]); end; function VersionInfoToSmallVersionInfo (const Value: TVersionInfo): TSmallVersionInfo; begin Result.sviMajor:= Value.viMajor; Result.sviMinor:= Value.viMinor; end; function SmallVersionInfoToVersionInfo (const Value: TSmallVersionInfo; const ANilValue: integer = 0): TVersionInfo; begin Result.viMajor:= Value.sviMajor; Result.viMinor:= Value.sviMinor; Result.viRelease:= ANilValue; Result.viBuild:= ANilValue; end; function StrToVersionInfo (const AString: string): TVersionInfo; var stringver: string; CurrDelim, NextDelim, CurrIndex: Integer; StrArray: array [1..4] of string; begin stringver:= AString; CurrDelim:= 1; CurrIndex:= 1; repeat NextDelim:= PosEx('.', stringver, CurrDelim); if NextDelim = 0 then NextDelim:= Length(stringver) + 1; StrArray[CurrIndex]:= Copy(stringver, CurrDelim, NextDelim - CurrDelim); CurrDelim:= NextDelim + 1; CurrIndex:= CurrIndex + 1; until CurrDelim > Length(stringver); Result.viMajor:= StrToInt(StrArray[1]); Result.viMinor:= StrToInt(StrArray[2]); Result.viRelease:= StrToInt(StrArray[3]); Result.viBuild:= StrToInt(StrArray[4]); end; function StrToSmallVersionInfo (const AString: string): TSmallVersionInfo; var stringver: string; CurrDelim, NextDelim: Integer; StrArray: array [1..2] of string; begin stringver:= AString; NextDelim:= PosEx('.', stringver, 1); if NextDelim = 0 then begin StrArray[1]:= stringver; Exit; end; StrArray[1]:= Copy(stringver, 1, NextDelim - 1); CurrDelim:= NextDelim + 1; NextDelim:= PosEx('.', stringver, CurrDelim); if NextDelim = 0 then NextDelim:= Length(stringver) + 1; StrArray[2]:= Copy(stringver, CurrDelim, NextDelim - CurrDelim); Result.sviMajor:= StrToInt(StrArray[1]); Result.sviMinor:= StrToInt(StrArray[2]); end; function CompareVersionInfo (const AVersionInfo1, AVersionInfo2: TVersionInfo): integer; //Result: // 0 - AVersionInfo1 = AVersionInfo2 // -1 - AVersionInfo1 > AVersionInfo2 // 1 - AVersionInfo1 < AVersionInfo2 begin //by default this versions are equal Result:= 0; //equal if ((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and (AVersionInfo1.viMinor = AVersionInfo2.viMinor) and (AVersionInfo1.viRelease = AVersionInfo2.viRelease) and (AVersionInfo1.viBuild = AVersionInfo2.viBuild)) then Result:= 0; //more if ((AVersionInfo1.viMajor > AVersionInfo2.viMajor) or ((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and (AVersionInfo1.viMinor > AVersionInfo2.viMinor)) or ((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and (AVersionInfo1.viMinor = AVersionInfo2.viMinor) and (AVersionInfo1.viRelease > AVersionInfo2.viRelease)) or ((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and (AVersionInfo1.viMinor = AVersionInfo2.viMinor) and (AVersionInfo1.viRelease = AVersionInfo2.viRelease) and (AVersionInfo1.viBuild > AVersionInfo2.viBuild))) then Result:= -1; //less if ((AVersionInfo1.viMajor < AVersionInfo2.viMajor) or ((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and (AVersionInfo1.viMinor < AVersionInfo2.viMinor)) or ((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and (AVersionInfo1.viMinor = AVersionInfo2.viMinor) and (AVersionInfo1.viRelease < AVersionInfo2.viRelease)) or ((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and (AVersionInfo1.viMinor = AVersionInfo2.viMinor) and (AVersionInfo1.viRelease = AVersionInfo2.viRelease) and (AVersionInfo1.viBuild < AVersionInfo2.viBuild))) then Result:= 1; end; function CompareSmallVersionInfo (const ASmallVersionInfo1, ASmallVersionInfo2: TSmallVersionInfo): integer; var AVI1, AVI2: TVersionInfo; begin AVI1:= SmallVersionInfoToVersionInfo(ASmallVersionInfo1); AVI2:= SmallVersionInfoToVersionInfo(ASmallVersionInfo2); Result:= CompareVersionInfo(AVI1, AVI2); end; {$IFDEF WINDOWS} function GetApplicationVersionInfoStr (const AFileName, AVersionSTR: string): string; var VIC: TPJVersionInfo; begin VIC:= TPJVersionInfo.Create(nil); VIC.FileName:= AFileName; Result:= VIC.StringFileInfo[AVersionSTR]; VIC.Free; end; {$ENDIF WINDOWS} end.