How to get version of files,thanks

解决方案 »

  1.   

    Give you a sample!
    var 
        VerInfoSize,VerValueSize,Dummy:Dword;
        VerInfo:Pointer;
        VerValue:PVSFixedFileInfo;
        sVer:String;V1,V2,V3,V4:word;
    begin
     VerInfoSize:=GetFileVersionInfoSize(Pchar(ParamStr(0)),Dummy);
     GetMem(VerInfo,VerInfoSize);
     GetFileVersionInfo(PChar(ParamStr(0)),0,VerInfoSize,VerInfo);
     VerQueryValue(VerInfo,'\',Pointer(VerValue),VerValueSize);
     With VerValue^ do
     begin
       V1:=dwFileVersionMS shr 16;
       V2:=dwFileVersionMS and $FFFF;
       V3:=dwFileVersionLS shr 16;
       V4:=dwFileVersionLS and $FFFF;
     end;
     FreeMem(VerInfo,VerInfoSize);
     sVer:=IntToStr(V1) + '.' + IntToStr(V2)+ IntToStr(V3)+ IntToStr(V4);
     Form1.Caption:=Form1.Caption + ' - Ver:' + sVer;
    end;
      

  2.   

    转贴.定一个版本信息结构: 
    typePFixedFileInfo = ^TFixedFileInfo;TFixedFileInfo = recorddwSignature : DWORD;dwStrucVersion : DWORD;wFileVersionMS : WORD; // 次版本号wFileVersionLS : WORD; // 主版本号wProductVersionMS : WORD; // 建立次数(build)wProductVersionLS : WORD; // 发行次数(release)dwFileFlagsMask : DWORD;dwFileFlags : DWORD;dwFileOS : DWORD;dwFileType : DWORD;dwFileSubtype : DWORD;dwFileDateMS : DWORD;dwFileDateLS : DWORD;end; // TFixedFileInfo
      

  3.   

    to lihh:
    i know it!than you very much!
      

  4.   

    http://expert.csdn.net/Expert/topic/1870/1870731.xml?temp=.6808588
      

  5.   

    下面是取版本信息函数function FileInfo( const FileName :String ) : TFixedFileInfo;
    var
    dwHandle, dwVersionSize : DWORD;
    strSubBlock : String;
    pTemp : Pointer;
    pData : Pointer;
    begin
    strSubBlock := ';
    // 取得文件版本信息的大小
    dwVersionSize := GetFileVersionInfoSize( PChar( FileName ), dwHandle );
    if dwVersionSize <> 0 then
    begin
    GetMem( pTemp, dwVersionSize );
    try
    //取文件版本信息
    if GetFileVersionInfo( PChar( FileName ),dwHandle,
    dwVersionSize,pTemp ) then
    //查询文件版本信息
    if VerQueryValue( pTemp,PChar( strSubBlock ),
    pData,dwVersionSize ) then
    Result := PFixedFileInfo( pData )^;
    finally
    FreeMem( pTemp );
    end; // try
    end; // if dwVersionSize
    end;
    调用例子:
    var
    f1:string;
    x :TFixedFileInfo;
    begin
    f1 := Application.ExeName;
    x := FileInfo( f1 );
    ShowMessage( f1 +
    #13#10'Version: ' + IntToStr( x.wFileVersionLS ) + '.' +
    IntToStr( x.wFileVersionMS ) +
    #13#10'Release: ' + IntToStr( x.wProductVersionLS) +
    #13#10'Build: ' + IntToStr( x.wProductVersionMS ) );
    end;
    **********************************
    获取文件版本信息
    type
    TFileInfo = packed record
    CommpanyName: string;
    FileDescription: string;
    FileVersion: string;
    InternalName: string;
    LegalCopyright: string;
    LegalTrades: string;
    OriginalFileName: string;
    ProductName: string;
    ProductVersion: string;
    Comments: string;
    VsFixedFileInfo:VS_FIXEDFILEINFO;
    UserDefineValue:string;
    end;
    function GetFileVersionInfomation(const FileName: string; var info: TFileInfo;UserDefine:string=''):
    boolean;
    const
    SFInfo= ';
    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, '', 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 + '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) theninfo.UserDefineValue:=string(pchar(InfoPointer));end;end;FreeMem(VersionInfo);end;end;
      

  6.   

    妈的,搞的老子辛苦了白天,fuck again and again!!!
      

  7.   


    这个函数很有用的!用于取得文件的版本信息!(我都调试通过了D5 SP1+Win200 SP1)但是有一个地方我无法解决!
    请注意那个UserDefineValue,必须传入一个字符串,对于用户自定义的来说,这个是不确定的。
    我的问题是,如何知道用户自定义了那些 字符串版本 信息?
    type
      TFileInfo = packed record
        CommpanyName: string;
        FileDescription: string;
        FileVersion: string;
        InternalName: string;
        LegalCopyright: string;
        LegalTrades: string;
        OriginalFileName: string;
        ProductName: string;
        ProductVersion: string;
        Comments: string;
        VsFixedFileInfo:VS_FIXEDFILEINFO;
        UserDefineValue:string;
      end;///UserDefine就是用户自定义的了,返回值保存在Info.UserDefineValue中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 + '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 + '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;procedure TForm1.Button1Click(Sender: TObject);
    var
      info: TFileInfo;
    begin
      if OpenDialog1.Execute then
      begin
        if GetFileVersionInfomation(opendialog1.FileName, info,'WOW Version') then
    ////我必须知道'WOW Version'才能知道有这么一个自定义的串。如果用户定义的是'abc'我就没有办法取得了。
    ////而资源管理器的版本信息中就不一定需要知道。它可以找出所有的版本信息。
        begin
          Listbox1.Items.Add(OpenDialog1.FileName);
          ListBox1.Items.Add('Comments:' + info.Comments);
          ListBox1.Items.Add('CommpanyName:' + info.CommpanyName);
          ListBox1.Items.Add('FileDescription:' + info.FileDescription);
          ListBox1.Items.Add('FileVersion:' + info.FileVersion);
          ListBox1.Items.Add('InternalName:' + info.InternalName);
          ListBox1.Items.Add('LegalCopyright:' + info.LegalCopyright);
          ListBox1.Items.Add('LegalTrades:' + info.LegalTrades);
          ListBox1.Items.Add('OriginalFileName:' + info.OriginalFileName);
          ListBox1.Items.Add('ProductName:' + info.ProductName);
          ListBox1.Items.Add('ProductVersion:' + info.ProductVersion);
          ListBox1.Items.Add('UserDefineValue:' + info.UserDefineValue);
          if boolean(info.VsFixedFileInfo.dwFileFlags and vs_FF_Debug) then
           listbox1.Items.Add('Debug:True')
           else
           ListBox1.Items.Add('Debug:False');
          ListBox1.Items.Add(''); 
        end;
      end;
    end;
    问题很简单,就是实现资源管理其的文件属性--〉版本 中的功能。
    实际上就是枚举文件的所有的用户自定义的版本信息字符串。