软件版本比较不用ini记录的另一种方法

处理可执行文件版本号的类。实现代码如下:
 TMFileVersion = class
    private
     FMajor   : Integer;
        FMinor   : Integer;
        FRelease : Integer;
        FBuild   : Integer;
        Function  GetVerStr : String;
        Procedure SetVerStr( aVerStr : String );
 public
  constructor Create;
  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 ) ) Then
     FBuild := 1;
 nSize := GetFileVersionInfoSize( PChar( aFileName ), h );
    If ( nSize = 0 ) Then
        Exit;
    GetMem( pData, nSize );
    Try
     GetFileVersionInfo( PChar( aFileName ), h, nSize, pData );
        If ( VerQueryValue( pData, '/', Pointer( pffiData ), nffiSize ) ) Then
        Begin
            FMajor   := ( pffiData^.dwFileVersionMS ) SHR 16;
            FMinor   := ( pffiData^.dwFileVersionMS ) AND $FFFF;
            FRelease := ( pffiData^.dwFileVersionLS ) SHR 16;
            FBuild   := ( pffiData^.dwFileVersionLS ) AND $FFFF;
        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 < n2 ) Then
     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 < n2 ) Then
         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   := StrToInt( sTemp.Strings[0] );
            FMinor   := StrToInt( sTemp.Strings[1] );
            FRelease := StrToInt( sTemp.Strings[2] );
         FBuild   := StrToInt( sTemp.Strings[3] );
        Except
            //  Do nothing
        End;
    Finally
     sTemp.Free;
    End;
End;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值