解决方法
关于:
> http://delphi.about.com/cs/adptips2001/a/bltip0701_4.htm
基本上,您只需使用GetFileVersionInfo
函数获取数据,然后再使用VerQueryValue
功能即可读取.
因为这些API函数有点“难”,所以我写了一个简单的例子:
type TEXEVersionData = record CompanyName,FileDescription,FileVersion,InternalName,LegalCopyright,LegalTrademarks,OriginalFileName,ProductName,ProductVersion,Comments,PrivateBuild,SpecialBuild: string; end; function GetEXEVersionData(const FileName: string): TEXEVersionData; type PLandCodepage = ^TLandCodepage; TLandCodepage = record wLanguage,wCodePage: word; end; var dummy,len: cardinal; buf,pntr: pointer; lang: string; begin len := GetFileVersionInfoSize(PChar(FileName),dummy); if len = 0 then RaiseLastOSError; GetMem(buf,len); try if not GetFileVersionInfo(PChar(FileName),len,buf) then RaiseLastOSError; if not VerQueryValue(buf,'\VarFileInfo\Translation\',pntr,len) then RaiseLastOSError; lang := Format('%.4x%.4x',[PLandCodepage(pntr)^.wLanguage,PLandCodepage(pntr)^.wCodePage]); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\CompanyName'),len){ and (@len <> nil)} then result.CompanyName := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\FileDescription'),len){ and (@len <> nil)} then result.FileDescription := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\FileVersion'),len){ and (@len <> nil)} then result.FileVersion := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\InternalName'),len){ and (@len <> nil)} then result.InternalName := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\LegalCopyright'),len){ and (@len <> nil)} then result.LegalCopyright := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\LegalTrademarks'),len){ and (@len <> nil)} then result.LegalTrademarks := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\OriginalFileName'),len){ and (@len <> nil)} then result.OriginalFileName := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\ProductName'),len){ and (@len <> nil)} then result.ProductName := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\ProductVersion'),len){ and (@len <> nil)} then result.ProductVersion := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\Comments'),len){ and (@len <> nil)} then result.Comments := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\PrivateBuild'),len){ and (@len <> nil)} then result.PrivateBuild := PChar(pntr); if VerQueryValue(buf,PChar('\StringFileInfo\' + lang + '\SpecialBuild'),len){ and (@len <> nil)} then result.SpecialBuild := PChar(pntr); finally FreeMem(buf); end; end;
尝试一下.但要小心 – 目前,这只适用于en-us EXE!例如,对于瑞典机器上的大多数EXE来说,它不起作用.现在已经晚了明天我会把这个扩展到任何EXE语言,如果只剩下一些时间. [About.com代码有同样的问题,但他们甚至不假装这是一个问题!]
更新:该代码现在适用于任何EXE语言.
Sample usage on Connect.exe http://privat.rejbrand.se/verinfo.png(EN-US)
Sample usage on Explorer.exe (Swedish) http://privat.rejbrand.se/verinfo2.png(瑞典)