应该是个小问题,可我找了好久也没有找到,只有麻烦各位兄弟帮忙了~~惭愧!

解决方案 »

  1.   

    // 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
      

  2.   

    主要用到几个函数:
    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;