发新话题
打印

[SDK/API/系统] 如何提取应用程序的版本信息

如何提取应用程序的版本信息

复制内容到剪贴板
代码:
unit siverinfo;

interface

uses
Windows, Classes, SysUtils;

type
TVersionInfo = class(TObject)
private
   FData: Pointer;
   FSize: Cardinal;
   FCompanyName: string;
   FFileDescription: string;
   FFileVersion: string;
   FInternalName: string;
   FLegalCopyright: string;
   FLegalTrademarks: string;
   FOriginalFilename: string;
   FProductName: string;
   FProductVersion: string;
   FComments: string;
public
   constructor Create(FileName: string);
   destructor Destroy; override;
   property CompanyName: string read FCompanyName;
   property FileDescription: string read FFileDescription;
   property FileVersion: string read FFileVersion;
   property InternalName: string read FInternalName;
   property LegalCopyright: string read FLegalCopyright;
   property LegalTrademarks: string read FLegalTrademarks;
   property OriginalFilename: string read FOriginalFilename;
   property ProductName: string read FProductName;
   property ProductVersion: string read FProductVersion;
   property Comments: string read FComments;
end;

implementation
{ TVersionInfo }

constructor TVersionInfo.Create(FileName: string);
var
sz, lpHandle, tbl: Cardinal;
lpBuffer: Pointer;
str: PChar;
strtbl: string;
int: PInteger;
hiW, loW: Word;
begin
inherited Create;
FSize := GetFileVersionInfoSize(PChar(FileName), lpHandle);
FData := AllocMem(FSize);
GetFileVersionInfo(PChar(FileName), lpHandle, FSize, FData);
VerQueryValue(FData, '\VarFileInfo\Translation', lpBuffer, sz);
int := lpBuffer;
hiW := HiWord(int^);
loW := LoWord(int^);
tbl := (loW shl 16) or hiW;
strtbl := Format('%x', [tbl]);
if Length(strtbl) < 8 then strtbl := '0' + strtbl;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\CompanyName'), lpBuffer, sz);
str := lpBuffer;
FCompanyName := str;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\FileDescription'), lpBuffer, sz);
str := lpBuffer;
FFileDescription := str;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\FileVersion'), lpBuffer, sz);
str := lpBuffer;
FFileVersion := str;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\InternalName'), lpBuffer, sz);
str := lpBuffer;
FInternalName := str;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\LegalCopyright'), lpBuffer, sz);
str := lpBuffer;
FLegalCopyright := str;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\LegalTrademarks'), lpBuffer, sz);
str := lpBuffer;
FLegalTrademarks := str;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\OriginalFilename'), lpBuffer, sz);
str := lpBuffer;
FOriginalFilename := str;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\ProductName'), lpBuffer, sz);
str := lpBuffer;
FProductName := str;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\ProductVersion'), lpBuffer, sz);
str := lpBuffer;
FProductVersion := str;
VerQueryValue(FData, PChar('\StringFileInfo\'+strtbl+'\Comments'), lpBuffer, sz);
str := lpBuffer;
FComments := str;
end;

destructor TVersionInfo.Destroy;
begin
FreeMem(FData);
inherited;
end;

end.
妖城欢迎您!

TOP

最近转的几篇帖子全是代码

没别的捷径的,啃代码啃下去。只要你的基础达到一定的程度,就只有啃代码才能取得更大的进步
妖城欢迎您!

TOP

发新话题