你不是给出了API吗?看看《Delphi 5开发人员指南》第382页,有一个TVerInfoRes类,可以解决你的问题,如果你没有书,可以到网上去找该书的配套源码,很好找的。

解决方案 »

  1.   

    很少的代码阿,怎么会看不懂呢?
    遇到不懂的API,就到MSDN去查
    这样你会长进很快的
      

  2.   

    到torry上查找Version,上面有许多带例子的程序!!!
      

  3.   

    unit GetFileInfoUtils;interface
    uses
      Windows;
      
    type
      TFileInfo = packed record
        CommpanyName: string;
        FileDescription: string;
        FileVersion: string;
        InternalName: string;
        LegalCopyright: string;
        LegalTrades: string;
        OriginalFileName: string;
        ProductName: string;
        ProductVersion: string;
        SpecialBuild: string;
        PrivateBuild: string;
        Comments: string;
        VsFixedFileInfo: VS_FIXEDFILEINFO;
        UserDefineValues: Array of string;
      end;function GetFileVersionInfomation(const FileName: string; var Info: TFileInfo;const UserDefine: Array of string):Boolean;implementation
    uses
      SysUtils;function GetFileVersionInfomation(const FileName: string; var Info: TFileInfo;const UserDefine: Array of string):Boolean;
    const
      SFInfo = '\StringFileInfo\';
    var
      VersionInfo: Pointer;
      InfoSize: DWORD;
      InfoPointer: Pointer;
      Translation: Pointer;
      VersionValue: string;
      unused: DWORD;
      iUseDefineNum:Integer;
    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 + 'LegalTrades'), InfoPointer, InfoSize);
          Info.LegalTrades := 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 + 'SpecialBuild'), InfoPointer, InfoSize);
          Info.SpecialBuild := string(pchar(InfoPointer));
          VerQueryValue(VersionInfo, pchar(VersionValue + 'PrivateBuild'), InfoPointer, InfoSize);
          Info.PrivateBuild := 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^);
          for iUseDefineNum := Low(UserDefine) to High(UserDefine) do
          begin
            if VerQueryValue(VersionInfo,PChar(VersionValue + UserDefine[iUseDefineNum]),InfoPointer,InfoSize) then
            begin
              Info.UserDefineValues[iUseDefineNum] := string(pchar(InfoPointer));
            end;
          end;
          {if UserDefine <> '' then
          begin
            if VerQueryValue(VersionInfo, pchar(VersionValue + UserDefine), InfoPointer, InfoSize) then
              Info.UserDefineValue := string(pchar(InfoPointer));
          end;}
        end;
        FreeMem(VersionInfo);
      end;
    end;end.