测试11112222

unit uGetVersion;

interface
type
  TVersion = record
    ProductName: string;
    ProductVersion: string;
    FileDescription: string;
    LegalCopyright: string;
    FileVersion: string;
    CompanyName: string;
    LegalTradeMarks: string;
    InternalName: string;
    OriginalFileName: string;
  end;

function GetVersionInfo(FileName :String): TVersion;

implementation

uses Winapi.Windows, System.SysUtils;

function GetVersionInfo(FileName :String):TVersion;
type
  PTranslate = ^TTranslate;
  TTranslate = record
    wLanguage: WORD;
    wCodePage: WORD;
  end;

  PVerInfo = ^TVS_FIXEDFILEINFO;
  TVS_FIXEDFILEINFO = record
    dwSignature: longint;
    dwStrucVersion: longint;
    dwFileVersionMS: longint;
    dwFileVersionLS: longint;
    dwFileFlagsMask: longint;
    dwFileFlags: longint;
    dwFileOS: longint;
    dwFileType: longint;
    dwFileSubtype: longint;
    dwFileDateMS: longint;
    dwFileDateLS: longint;
  end;

var
  BufSize, Len: DWORD;
  Buf: PChar;
  Value: PChar;
  tmp: string;
  Translate: PTranslate;
  FileInfoPath: string;
  VerInfo: PVerInfo;
begin
  BufSize := GetFileVersionInfoSize(PChar(FileName), BufSize);

  if BufSize > 0 then
  begin
    Buf := AllocMem(BufSize);

    if GetFileVersionInfo(PChar(FileName), 0, BufSize, Buf) then
    begin
      if VerQueryValue(Buf, PChar('\VarFileInfo\Translation'), Pointer(Translate), Len) then
      begin
        FileInfoPath := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) + IntToHex(Translate^.wCodePage, 4) + '\';

        if VerQueryValue(Buf, PChar(FileInfoPath + 'ProductName'), Pointer(Value), Len) then
          Result.ProductName := Value;       //产品名称
        if VerQueryValue(Buf, PChar(FileInfoPath + 'ProductVersion'), Pointer(Value), Len) then
          Result.ProductVersion := Value;    //产品版本
        if VerQueryValue(Buf, PChar(FileInfoPath + 'FileDescription'), Pointer(Value), Len) then
          Result.FileDescription := Value;   //文件说明
        if VerQueryValue(Buf, PChar(FileInfoPath + 'LegalCopyright'), Pointer(Value), Len) then
          Result.LegalCopyright := Value;    //合法版权
        if VerQueryValue(Buf, PChar(FileInfoPath + 'CompanyName'), Pointer(Value), Len) then
          Result.CompanyName := Value;       //公司名称
        if VerQueryValue(Buf, PChar(FileInfoPath + 'LegalTradeMarks'), Pointer(Value), Len) then
          Result.LegalTradeMarks := Value;   //合法商标
        if VerQueryValue(Buf, PChar(FileInfoPath + 'InternalName'), Pointer(Value), Len) then
          Result.InternalName := Value;      //内部名称
        if VerQueryValue(Buf, PChar(FileInfoPath + 'OriginalFileName'), Pointer(Value), Len) then
          Result.OriginalFileName := Value;  //原文件名

        if VerQueryValue(Buf, '\', Pointer(VerInfo), Len) then
        begin                                //文件版本
          Result.FileVersion := IntToStr(HIWORD(VerInfo.dwFileVersionMS)) + '.' +
                    IntToStr(LOWORD(VerInfo.dwFileVersionMS)) + '.' +
                    IntToStr(HIWORD(VerInfo.dwFileVersionLS)) + '.' +
                    IntToStr(LOWORD(VerInfo.dwFileVersionLS));
        end;
      end;
    end;

    FreeMem(Buf, BufSize);
  end;
end;

end.

猜你喜欢

转载自blog.csdn.net/ozhy111/article/details/86491163