请大家指点!关于API函数的。(50分)

  • 主题发起人 主题发起人 shaozen
  • 开始时间 开始时间
S

shaozen

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在程序的about中获取程序的版本信息。
但用到VerQueryValue()函数时,有些问题。
该函数的第二个参数我有些不懂,如果这个参数是"/StringFileInfo/languagecodepage/stringname"
那么这个languagecodepage是如何设定的。
请大家指教,谢谢了
 
我说说废话:你找找有你说的功能的软件的源代码看看就知道了哦,我就这样的哦!
呵呵
 
这个要先使用如下代码:
var
VersionInfo: Pointer;
InfoSize: DWORD;
InfoPointer: Pointer;
Translation: Pointer;
unused: DWORD;
rlt:boolean;
begin
unused:=0;
InfoSize := GetFileVersionInfoSize(pchar(FileName), unused);
if InfoSize > 0 then
begin
GetMem(VersionInfo, InfoSize);
Rlt := GetFileVersionInfo(pchar(FileName), 0, InfoSize, VersionInfo);
if rlt then
VerQueryValue(VersionInfo, '/VarFileInfo/Translation', Translation, InfoSize);
//来获得一个指向语言和字符集数组的指针(在translation中返回)
//然后使用相应的操作来取得你所需要的参数,具体就是如下:
languagecodepage:=IntToHex(LoWord(Longint(Translation^)), 4) +IntToHex(HiWord(Longint(Translation^)), 4);
这样就可以使用/StringFileInfo/languagecodepage/stringname来取得想要的版本信息了

 
//------------------------------------------------------------------------------
function GetFileVersionInfomation(const FileName: string; var info: TFileInfo;UserDefine:string=''):boolean;
const
SFInfo= '/StringFileInfo/';
var
VersionInfo: Pointer;
InfoSize: DWORD;
InfoPointer: Pointer;
Translation: Pointer;
VersionValue: string;
unused: DWORD;
begin
unused := 0;
Result := False;
InfoSize := GetFileVersionInfoSize(pchar(FileName), unused);
if InfoSize > 0 then
begin
GetMem(VersionInfo, InfoSize);
Result := GetFileVersionInfo(pchar(FileName), 0, InfoSize, VersionInfo);
if Result then
begin
VerQueryValue(VersionInfo, '/VarFileInfo/Translation', Translation, InfoSize);
VersionValue := SFInfo + IntToHex(LoWord(Longint(Translation^)), 4) +
IntToHex(HiWord(Longint(Translation^)), 4) + '/';
VerQueryValue(VersionInfo, pchar(VersionValue + 'CompanyName'), InfoPointer, InfoSize);
info.CommpanyName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'FileDescription'), InfoPointer, InfoSize);
info.FileDescription := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'FileVersion'), InfoPointer, InfoSize);
info.FileVersion := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'InternalName'), InfoPointer, InfoSize);
info.InternalName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'LegalCopyright'), InfoPointer, InfoSize);
info.LegalCopyright := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'LegalTrademarks'), InfoPointer, InfoSize);
info.LegalTrademarks := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'OriginalFileName'), InfoPointer, InfoSize);
info.OriginalFileName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'ProductName'), InfoPointer, InfoSize);
info.ProductName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'ProductVersion'), InfoPointer, InfoSize);
info.ProductVersion := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'Comments'), InfoPointer, InfoSize);
info.Comments := string(pchar(InfoPointer));
if VerQueryValue(VersionInfo, '/', InfoPointer, InfoSize) then
info.VsFixedFileInfo := TVSFixedFileInfo(InfoPointer^);
if UserDefine<>'' then
begin
if VerQueryValue(VersionInfo,pchar(VersionValue+UserDefine),InfoPointer,InfoSize) then
info.UserDefineValue:=string(pchar(InfoPointer));
end;
end;
FreeMem(VersionInfo);
end;
end;
 
后退
顶部