📄 version_u.pas
字号:
unit Version_u;
interface
uses
Windows, Messages, SysUtils, dialogs, inifiles, wininet,classes;
type
TVersionInfo = record
MainV,SubV,Release,Build:byte;
end;
function GetFileVersion(const FileName: String): TVersionInfo;
function GetNewVersion:TVersionInfo;
function CompareVersions(vi_old,vi_new:TVersionInfo):boolean;
function VersionToStr(vi:TVersionInfo):string;
function VersionInfo(MainV,SubV,Release,Build:Byte):TVersionInfo;
implementation
uses localize;
function VersionInfo(MainV,SubV,Release,Build:Byte):TVersionInfo;
begin
result.MainV:=MainV;
result.SubV:=SubV;
result.Release:=Release;
result.Build:=Build;
end;
function DownloadFile(url,filename: string) : Boolean ;
var
Stream : TFileStream ;
NetHandle : HINTERNET ;
UrlHandle : HINTERNET;
BytesRead : DWORD ; // DWORD, not cardinal
Buffer : array[0..1024] of Char ;
begin
Result := false ;
NetHandle := InternetOpen('Delphi download function',
INTERNET_OPEN_TYPE_DIRECT,
Nil,Nil,0);
if Assigned(NetHandle) then
begin
UrlHandle := InternetOpenUrl(NetHandle, PChar(url), nil, 0,
INTERNET_FLAG_RELOAD, 0);
if Assigned(UrlHandle) then
begin
FillChar(Buffer, SizeOf(Buffer), 0);
Stream := TFileStream.Create(filename,fmCreate);
try
while InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead) and (BytesRead > 0) do
Stream.WriteBuffer(Buffer, BytesRead);
Result := TRUE;
finally
Stream.Free;
end;
end; // if Assigned(UrlHandle)
InternetCloseHandle(UrlHandle);
end;
InternetCloseHandle(NetHandle);
end;
function parseVersionInfo(versionstr:string): TVersionInfo;
var i,p:integer;
b:byte;
s:string;
begin
s:=versionstr;
for i:=0 to 3 do
begin
p:=pos('.',s);
if p=0 then p:=length(s)+1;
try
b:=strToInt(copy(s,1,p-1));
case i of
0: result.MainV:=b;
1: result.SubV:=b;
2: result.Release:=b;
3: result.Build:=b;
end;
except
Abort;
end;
delete(s,1,p);
end;
end;
function CompareVersions(vi_old,vi_new:TVersionInfo):boolean;
var Vold,Vnew:integer;
begin
Vold:=(vi_old.MainV shl 24) or (vi_old.SubV shl 16) or (vi_old.Release shl 8) or vi_old.Build;
Vnew:=(vi_new.MainV shl 24) or (vi_new.SubV shl 16) or (vi_new.Release shl 8) or vi_new.Build;
result:=vnew>vold;
end;
function VersionToStr(vi:TVersionInfo):string;
begin
result:=inttostr(vi.MainV)+'.'+inttostr(vi.SubV)+'.'+
inttostr(vi.Release)+'.'+inttostr(vi.build);
end;
function GetFileVersion(const FileName: String): TVersionInfo;
var
VersionInfoSize, VersionInfoValueSize, Zero: DWord;
VersionInfo, VersionInfoValue: Pointer;
begin
if not FileExists(FileName) then
begin
Result.MainV:=0;
Result.SubV:=0;
Result.Release:=0;
Result.Build:=0;
Exit;
end;
VersionInfoSize := GetFileVersionInfoSize(PChar(FileName), Zero);
if VersionInfoSize = 0 then Exit;
GetMem(VersionInfo, VersionInfoSize);
try
if GetFileVersionInfo(PChar(FileName), 0, VersionInfoSize, VersionInfo) and
VerQueryValue(VersionInfo, '\', VersionInfoValue,
VersionInfoValueSize) and (0 <> LongInt(VersionInfoValueSize)) then
begin
with TVSFixedFileInfo(VersionInfoValue^) do
begin
Result.MainV:=HiWord(dwFileVersionMS);
Result.SubV:=LoWord(dwFileVersionMS);
Result.Release:=HiWord(dwFileVersionLS);
Result.Build:=LoWord(dwFileVersionLS);
end;
end;
finally
FreeMem(VersionInfo);
end;
end;
function GetNewVersion:TVersionInfo;
const
SourceFile='http://rfe.sourceforge.net/version.ini';
var
DestFile,s:string;
ini:Tinifile;
begin
result:=Versioninfo(0,0,0,0);
DestFile:=extractfilepath(paramstr(0))+'version.ini';
if DownloadFile(SourceFile,DestFile) then
begin
ini:=TInifile.Create(DestFile);
try
s:=ini.ReadString('versioninfo','last','error');
if s<>'error' then
result:=ParseVersionInfo(s);
finally
WritePrivateProfileString(nil,nil,nil,PCHAR(DestFile));
ini.free;
deletefile(DestFile);
end;
end else
showmessage(LocalizeString('Msg_GetVersionError')+#13#13+SysErrorMessage(GetLastError));
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -