// Goes right after the VS_FIXEDFILEINFO structure function TAPIMisc.FileInfo( const FileName :String ) : TFixedFileInfo; var dwHandle, dwVersionSize : DWORD; strSubBlock : String; pTemp : Pointer; pData : Pointer; begin strSubBlock := '\'; // get version information values dwVersionSize := GetFileVersionInfoSize( PChar( FileName ), // pointer to filename string dwHandle ); // pointer to variable to receive zero // if GetFileVersionInfoSize is successful if dwVersionSize <> 0 then begin GetMem( pTemp, dwVersionSize ); try if GetFileVersionInfo( PChar( FileName ), // pointer to filename string dwHandle, // ignored dwVersionSize, // size of buffer pTemp ) then // pointer to buffer to receive file-version info. if VerQueryValue( pTemp, // pBlock - address of buffer for version resource PChar( strSubBlock ), // lpSubBlock - address of value to retrieve pData, // lplpBuffer - address of buffer for version pointer dwVersionSize ) then // puLen - address of version-value length buffer Result := PFixedFileInfo( pData )^; finally FreeMem( pTemp ); end; // try end; // if dwVersionSize end;function TAPIMisc.GetFileInformation( const FileName, Value : String ): String; var dwHandle, dwVersionSize : DWORD; strLangCharSetInfoString : String; pcBuffer : PChar; pTemp : Pointer; begin ////////////////////////////////////////////////////////////////////////////////// // The Win32 API contains the following predefined version information strings: // ////////////////////////////////////////////////////////////////////////////////// // CompanyName FileDescription FileVersion // // InternalName LegalCopyright OriginalFilename // // ProductName ProductVersion Comments // // LegalTrades // ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// // Decription of lpSubBlock from the Win32 API (sLangCharSet) // ////////////////////////////////////////////////////////////////////////////////// // Specifies a value in a language-specific structure. The lang-charset name is // // a concatenation of a language and character-set identifier pair found in the // // translation table for the resource. The lang-charset name must be specified // // as a hexadecimal string. The string-name name is one of the predefined // // strings described in the following Res section. // ////////////////////////////////////////////////////////////////////////////////// strLangCharSetInfoString := '\StringFileInfo\040904E4\' + Value; // get version information values dwVersionSize := GetFileVersionInfoSize( PChar( FileName ), // pointer to filename string dwHandle ); // pointer to variable to receive zero // if GetFileVersionInfoSize is successful if dwVersionSize <> 0 then begin GetMem( pcBuffer, dwVersionSize ); try if GetFileVersionInfo( PChar( FileName ), // pointer to filename string dwHandle, // ignored dwVersionSize, // size of buffer pcBuffer ) then // pointer to buffer to receive file-version info. if VerQueryValue( pcBuffer, // pBlock - address of buffer for version resource PChar( strLangCharSetInfoString ), // lpSubBlock - address of value to retrieve pTemp, // lplpBuffer - address of buffer for version pointer dwVersionSize ) then // puLen - address of version-value length buffer Result := PChar( pTemp ); finally FreeMem( pcBuffer ); end; // try end;// if dwVersionSize end; // GetFileInformation_____________________ http://lysoft.7u7.net
主要用到几个函数: 1、GetFileVersionInfo:用来获取包含在指定文件中的版本信息 function GetFileVersionInfo(lptstrFilename: PChar; // 文件名 dwHandle: DWORD; // 忽略 dwLen: DWORD; // 缓冲区大小 lpData: Pointer // 版本信息缓冲区 ): BOOL; stdcall;2、GetFileVersionInfoSize:是否能够从指定文件中获取版本信息。如果存在版本信息,便返回以字节为单位的这些信息所占用空间的大小 3、VerQueryValue函数被用来从指定的版本信息资源中获取指定版本信息 function VerQueryValue(pBlock: Pointer; // 存放版本资源的缓冲区 lpSubBlock: PChar; // 期望获取的值 var lplpBuffer: Pointer; // 指向存放版本值缓冲区的指针 var puLen: UINT // 版本信息长度 ): BOOL; stdcall; pBlock,一个指向用于存储版本信息资源的缓冲区的指针,这个版本信息资源是从GetFileVersionInfo函数返回的。lpSubBlock,指向一个零结尾的字符串,指定到底获得哪个版本信息值。这个字符串必须由被反斜线符号(\)分开的名字组成如下格式之一:→“\”,指定根区域。函数将返回一个指向VS_FIXEDFIELDFILEINFO结构的版本信息资源。→“\VarFileInfo\Translation”,指定一个保存在可变类型变量信息的结构中的转换阵列。函数返回一个指向语言和代码页标识符数组的指针。应用程序可以使用这些标识符来访问存储在版本信息资源中的特定语言字符串表结构。→“\StringFileInfo\lang-codepage\string-name”,指定存储在特定语言字符串表中结构的值。其中,lang-codepage的书写格式是:用双字(DWORD)表示的、保存在资源中的转换阵列的语言与代码页标识符对,并且需要书写成十六进制形式的字符串;string-name必须是在后面注释中预定义的字符串之一。函数根据指定的语言与代码页,返回一个与之相关的字符串。这些函数定义在Version.dll中,调用顺序为:GetFileVersionInfoSize,GetFileVerSionInfo,VerQueryValue。 procedure TForm1.Button1Click(Sender: TObject); var S: string; InfoStr: array [1..9] of string = ('ProductName', 'ProductVersion', 'FileDescription', 'LegalCopyright', 'FileVersion', 'CompanyName', 'LegalTradeMarks', 'InternalName', 'OriginalFileName'); BufSize, Len: DWORD; Buf: PChar; Value: PChar; begin S := Application.ExeName; BufSize := GetFileVersionInfoSize(PChar(S), BufSize); if BufSize > 0 then begin Buf := AllocMem(BufSize); GetFileVersionInfo(PChar(S), 0, BufSize, Buf); if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[1]), Pointer(Value), Len) then ProductName.Caption := Value; if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then ProductVersion.Caption := '产品版本: ' + Value; if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then FileDescription.Caption := '文件说明: ' + Value; if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then LegalCopyright.Caption := '合法版权: ' + Value; if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then FileVersion.Caption := '文件版本: ' + Value; if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then CompanyName.Caption := '公司名称: ' + Value; if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then LegalTrades.Caption := '合法商标: ' + Value; if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then InternalName.Caption := '内部名称: ' + Value; if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then OriginalFilename.Caption := '原文件名: ' + Value; FreeMem(Buf, BufSize); end; end;
function TAPIMisc.FileInfo( const FileName :String ) : TFixedFileInfo;
var
dwHandle, dwVersionSize : DWORD;
strSubBlock : String;
pTemp : Pointer;
pData : Pointer;
begin
strSubBlock := '\'; // get version information values
dwVersionSize := GetFileVersionInfoSize( PChar( FileName ), // pointer to filename string
dwHandle ); // pointer to variable to receive zero // if GetFileVersionInfoSize is successful
if dwVersionSize <> 0 then
begin
GetMem( pTemp, dwVersionSize );
try
if GetFileVersionInfo( PChar( FileName ), // pointer to filename string
dwHandle, // ignored
dwVersionSize, // size of buffer
pTemp ) then // pointer to buffer to receive file-version info. if VerQueryValue( pTemp, // pBlock - address of buffer for version resource
PChar( strSubBlock ), // lpSubBlock - address of value to retrieve
pData, // lplpBuffer - address of buffer for version pointer
dwVersionSize ) then // puLen - address of version-value length buffer
Result := PFixedFileInfo( pData )^;
finally
FreeMem( pTemp );
end; // try
end; // if dwVersionSize
end;function TAPIMisc.GetFileInformation( const FileName, Value : String ): String;
var
dwHandle, dwVersionSize : DWORD;
strLangCharSetInfoString : String;
pcBuffer : PChar;
pTemp : Pointer;
begin
//////////////////////////////////////////////////////////////////////////////////
// The Win32 API contains the following predefined version information strings: //
//////////////////////////////////////////////////////////////////////////////////
// CompanyName FileDescription FileVersion //
// InternalName LegalCopyright OriginalFilename //
// ProductName ProductVersion Comments //
// LegalTrades //
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
// Decription of lpSubBlock from the Win32 API (sLangCharSet) //
//////////////////////////////////////////////////////////////////////////////////
// Specifies a value in a language-specific structure. The lang-charset name is //
// a concatenation of a language and character-set identifier pair found in the //
// translation table for the resource. The lang-charset name must be specified //
// as a hexadecimal string. The string-name name is one of the predefined //
// strings described in the following Res section. //
////////////////////////////////////////////////////////////////////////////////// strLangCharSetInfoString := '\StringFileInfo\040904E4\' + Value; // get version information values
dwVersionSize := GetFileVersionInfoSize( PChar( FileName ), // pointer to filename string
dwHandle ); // pointer to variable to receive zero // if GetFileVersionInfoSize is successful
if dwVersionSize <> 0 then
begin
GetMem( pcBuffer, dwVersionSize );
try
if GetFileVersionInfo( PChar( FileName ), // pointer to filename string
dwHandle, // ignored
dwVersionSize, // size of buffer
pcBuffer ) then // pointer to buffer to receive file-version info. if VerQueryValue( pcBuffer, // pBlock - address of buffer for version resource
PChar( strLangCharSetInfoString ), // lpSubBlock - address of value to retrieve
pTemp, // lplpBuffer - address of buffer for version pointer
dwVersionSize ) then // puLen - address of version-value length buffer Result := PChar( pTemp );
finally
FreeMem( pcBuffer );
end; // try
end;// if dwVersionSize
end; // GetFileInformation_____________________
http://lysoft.7u7.net
1、GetFileVersionInfo:用来获取包含在指定文件中的版本信息
function GetFileVersionInfo(lptstrFilename: PChar; // 文件名
dwHandle: DWORD; // 忽略
dwLen: DWORD; // 缓冲区大小
lpData: Pointer // 版本信息缓冲区
): BOOL; stdcall;2、GetFileVersionInfoSize:是否能够从指定文件中获取版本信息。如果存在版本信息,便返回以字节为单位的这些信息所占用空间的大小
3、VerQueryValue函数被用来从指定的版本信息资源中获取指定版本信息
function VerQueryValue(pBlock: Pointer; // 存放版本资源的缓冲区
lpSubBlock: PChar; // 期望获取的值
var lplpBuffer: Pointer; // 指向存放版本值缓冲区的指针
var puLen: UINT // 版本信息长度
): BOOL; stdcall;
pBlock,一个指向用于存储版本信息资源的缓冲区的指针,这个版本信息资源是从GetFileVersionInfo函数返回的。lpSubBlock,指向一个零结尾的字符串,指定到底获得哪个版本信息值。这个字符串必须由被反斜线符号(\)分开的名字组成如下格式之一:→“\”,指定根区域。函数将返回一个指向VS_FIXEDFIELDFILEINFO结构的版本信息资源。→“\VarFileInfo\Translation”,指定一个保存在可变类型变量信息的结构中的转换阵列。函数返回一个指向语言和代码页标识符数组的指针。应用程序可以使用这些标识符来访问存储在版本信息资源中的特定语言字符串表结构。→“\StringFileInfo\lang-codepage\string-name”,指定存储在特定语言字符串表中结构的值。其中,lang-codepage的书写格式是:用双字(DWORD)表示的、保存在资源中的转换阵列的语言与代码页标识符对,并且需要书写成十六进制形式的字符串;string-name必须是在后面注释中预定义的字符串之一。函数根据指定的语言与代码页,返回一个与之相关的字符串。这些函数定义在Version.dll中,调用顺序为:GetFileVersionInfoSize,GetFileVerSionInfo,VerQueryValue。
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
InfoStr: array [1..9] of string = ('ProductName',
'ProductVersion',
'FileDescription',
'LegalCopyright',
'FileVersion',
'CompanyName',
'LegalTradeMarks',
'InternalName',
'OriginalFileName');
BufSize, Len: DWORD;
Buf: PChar;
Value: PChar;
begin
S := Application.ExeName; BufSize := GetFileVersionInfoSize(PChar(S), BufSize); if BufSize > 0 then
begin
Buf := AllocMem(BufSize);
GetFileVersionInfo(PChar(S), 0, BufSize, Buf); if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[1]), Pointer(Value), Len) then
ProductName.Caption := Value;
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then
ProductVersion.Caption := '产品版本: ' + Value;
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then
FileDescription.Caption := '文件说明: ' + Value;
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then
LegalCopyright.Caption := '合法版权: ' + Value;
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then
FileVersion.Caption := '文件版本: ' + Value;
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then
CompanyName.Caption := '公司名称: ' + Value;
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then
LegalTrades.Caption := '合法商标: ' + Value;
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then
InternalName.Caption := '内部名称: ' + Value;
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then
OriginalFilename.Caption := '原文件名: ' + Value; FreeMem(Buf, BufSize);
end;
end;