delphi – 我如何读取文件的详细信息?

前端之家收集整理的这篇文章主要介绍了delphi – 我如何读取文件的详细信息?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何读取文件版本,产品版本以及该文件的“属性”窗口中“详细信息”选项卡中存储的任何其他文件的详细信息?
谢谢.

解决方法

关于:

> 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(瑞典)

猜你在找的Delphi相关文章