📄 versioninfo.pas
字号:
unit VersionInfo;
interface
uses
Windows, SysUtils,Classes;
const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription',
'FileVersion', 'InternalName',
'LegalCopyright', 'LegalTradeMarks',
'OriginalFileName', 'ProductName',
'ProductVersion', 'Comments');
type
TVerInfo = record
CompanyName: array[0..40] of char;
FileDescription: array[0..100] of char;
FileVersion: array[0..10] of char;
InternalName: array[0..10] of char;
LegalCopyright: array[0..40] of char;
LegalTradeMarks: array[0..40] of char;
OriginalFileName: array[0..10] of char;
ProductName: array[0..20] of char;
ProductVersion: array[0..20] of char;
Comments: array[0..40] of char;
end;
PVerInfo = ^TVerInfo;
TAppVersionInfo = class
private
FAppExeName: string;
FLanguageSet: string;
FVerInfo: TVerInfo;
function GetAppVerInfo: Boolean;
public
constructor Create;
destructor Destroy; override;
function GetAppVersionInfo: Boolean;
published
property AppExeName: string read FAppExeName write FAppExeName;
property LanguageSet: string read FLanguageSet write FLanguageSet;
property VerInfo: TVerInfo read FVerInfo;
end;
implementation
constructor TAppVersionInfo.Create;
begin
FAppExeName := '';
FLanguageSet := '080403A8';
end;
destructor TAppVersionInfo.Destroy;
begin
;
end;
function TAppVersionInfo.GetAppVersionInfo: Boolean;
begin
Result := GetAppVerInfo;
end;
function TAppVersionInfo.GetAppVerInfo: Boolean;
var
n, Len: DWORD;
Buf: PChar;
LanguageID: PDWORD;
Value: PChar;
begin
Result := False;
if FAppExeName = '' then Exit;
try
n := GetFileVersionInfoSize(PChar(FAppExeName), n);
if n > 0 then
begin
Buf := AllocMem(n);
try
GetFileVersionInfo(PChar(FAppExeName), 0, n, Buf);
//语言ID与StringFileInfo的UniCode编码不同。
VerQueryValue(Buf,PChar('VarFileInfo\Translation'),Pointer(LanguageID),Len);
n := LanguageID^;
FLanguageSet := IntToHex(HiByte(LoWord(n)),2) + IntToHex(LoByte(LoWord(n)),2);
FLanguageSet := FLanguageSet + IntToHex(HiByte(HiWord(n)),2) + IntToHex(LoByte(HiWord(n)),2);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\CompanyName'),
Pointer(Value), Len);
StrCopy(FVerInfo.CompanyName, Value);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\FileDescription'),
Pointer(Value), Len);
StrCopy(FVerInfo.FileDescription, Value);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\FileVersion'),
Pointer(Value), Len);
StrCopy(FVerInfo.FileVersion, Value);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\InternalName'),
Pointer(Value), Len);
StrCopy(FVerInfo.InternalName, Value);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\LegalCopyright'),
Pointer(Value), Len);
StrCopy(FVerInfo.LegalCopyright, Value);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\.LegalTradeMarks'),
Pointer(Value), Len);
StrCopy(FVerInfo.LegalTradeMarks, Value);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\OriginalFileName'),
Pointer(Value), Len);
StrCopy(FVerInfo.OriginalFileName, Value);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\ProductName'),
Pointer(Value), Len);
StrCopy(FVerInfo.ProductName, Value);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\ProductVersion'),
Pointer(Value), Len);
StrCopy(FVerInfo.ProductVersion, Value);
VerQueryValue(Buf, PChar('StringFileInfo\'+FLanguageSet+'\Comments'),
Pointer(Value), Len);
StrCopy(FVerInfo.Comments, Value);
finally
FreeMem(Buf, n);
end;
Result := True;
end;
except
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -