⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 version_u.pas

📁 全功能windows 资源编程器。 Delphi 编写 Windows 界面.
💻 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 + -