而SeparateVerStr()函数是将得到字符串形式的升级版本信息转换为简化的版本信息格式: function SeparateVerStr(s:String):TSimpleVersion; const Separator='.'; { 以为'.'分割符 } var p,v1,v2,v3,v4:WORD; begin if Length(s)=0 then Exit; p:=pos(Separator, s); v1:=StrToInt(copy(s,1,p-1)); Delete(s,1,p); p:=Pos(Separator,s); v2:=StrToInt(copy(s,1,p-1)); Delete(s,1,p); p:=Pos(Separator,s); v3:=StrToInt(copy(s,1,p-1)); Delete(s,1,p); v4:=StrToInt(s); Result.dwProductVersionMS:=v1*$10000+v2; Result.dwProductVersionLS:=v3*$10000+v4; end;
最后要做的就是比较文件的版本信息,先得到自己的版本,我使用如下的函数: function GetBuildInfo(FName:string):TSimpleVersion; { 得到自身版本信息 } var VerInfoSize: DWORD; VerInfo: Pointer; VerValueSize: DWORD; VerValue: PVSFixedFileInfo; Dummy: DWORD; begin VerInfoSize := GetFileVersionInfoSize(PChar(FName), Dummy); GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize); with VerValue^ do begin Result.dwProductVersionMS := dwFileVersionMS; { 主版本 } Result.dwProductVersionLS := dwFileVersionLS; { 辅版本 } end; FreeMem(VerInfo, VerInfoSize); end;
然后使用如下的函数比较网站的升级版本和现在的版本,如果返回TRUE,说明有新版本文件: function VersionCheck(OriVer,NewVer:TSimpleVersion):Boolean; begin if (OriVer.dwProductVersion_MS=NewVer.dwProductVersionMS) then begin Result:=OriVer.dwProductVersionLS<NewVer.dwProductVersionLS; end else begin Result:=OriVer.dwProductVersionMS<NewVer.dwProductVersionMS end; end;