获取文件版本信息的方法

我是研究僧i 提交于 2020-08-06 23:29:26

方法一,取回来的都是字符串:
procedure TForm1.ShowVersion;
const
  InfoNum = 9;
  InfoStr: array[1..InfoNum] of string = (
  'ProductName',
  'ProductVersion',
  'FileDescription',
  'LegalCopyright',
  'FileVersion',
  'CompanyName',
  'LegalTradeMarks',
  'InternalName',
  'OriginalFileName'
  );

var
  S: string;
  BufSize, Len: DWORD;
  Buf: PChar;
  Value: PChar;
begin
    mmo1.Clear;
    S := FFileName;
    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
        mmo1.Lines.Add('产品名称:' + Value);
      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then
        mmo1.Lines.Add('产品版本: ' + Value);
      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then
        mmo1.Lines.Add('文件说明: ' + Value);
      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then
        mmo1.Lines.Add('合法版权: ' + Value);
      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then
        mmo1.Lines.Add('文件版本: ' + Value);
      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then
        mmo1.Lines.Add('公司名称: ' + Value);
      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then
        mmo1.Lines.Add('合法商标: ' + Value);
      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then
        mmo1.Lines.Add('内部名称: ' + Value);
      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then
        mmo1.Lines.Add('原文件名: ' + Value);
      FreeMem(Buf, BufSize);
    end
    else
    begin
      Application.MessageBox('获取产品信息时遇到致命错误,请尝试重新启动软件。'+ #13 + '若仍未能解决问题,请联系产品服务人员。','错误',MB_OK + MB_ICONSTOP);
    end;
end;

方法二,取得都是值:
Type
  TVersion = record
    Major: Word;
    Minor: Word;
    Release: Word;
    Build: Word;
  end;

procedure TForm1.btn1Click(Sender: TObject);
var
  foo, VersionSize: dword;
  Versionbuf: pointer;
  vs: PVSFixedFileInfo;
  FileVer: TVersion;
begin
  if dlgOpen1.Execute then
  begin
    FFileName := dlgOpen1.FileName;
  end;

  VersionSize := GetFileVersionInfoSize(pchar(FFileName), foo);
  if VersionSize > 0 then
  begin
    GetMem(VersionBuf, VersionSize);
    if GetFileVersionInfo(pchar(FFileName), 0, VersionSize, VersionBuf) then
    begin
      VerQueryValue(VersionBuf, '\', Pointer(vs), VersionSize);
      with FileVer do
      begin
        Major := vs.dwFileVersionMS div $10000;
        Minor := vs.dwFileVersionMS mod $10000;
        Release := vs.dwFileVersionLS div $10000;
        Build := vs.dwFileVersionLS mod $10000;
      end;
    end;
    Freemem(VersionBuf);
  end;

  mmo1.Clear;
  mmo1.Lines.Add('Major:' + IntToStr(FileVer.Major));
  mmo1.Lines.Add('Minor:' + IntToStr(FileVer.Minor));
  mmo1.Lines.Add('Release:' + IntToStr(FileVer.Release));
  mmo1.Lines.Add('Build:' + IntToStr(FileVer.Build));
end;

方法三(基本与一类似):

    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), 0, 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'), pntr, len){ and (@len <> nil)} then
          result.CompanyName := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\FileDescription'), pntr, len){ and (@len <> nil)} then
          result.FileDescription := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\FileVersion'), pntr, len){ and (@len <> nil)} then
          result.FileVersion := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\InternalName'), pntr, len){ and (@len <> nil)} then
          result.InternalName := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\LegalCopyright'), pntr, len){ and (@len <> nil)} then
          result.LegalCopyright := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\LegalTrademarks'), pntr, len){ and (@len <> nil)} then
          result.LegalTrademarks := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\OriginalFileName'), pntr, len){ and (@len <> nil)} then
          result.OriginalFileName := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\ProductName'), pntr, len){ and (@len <> nil)} then
          result.ProductName := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\ProductVersion'), pntr, len){ and (@len <> nil)} then
          result.ProductVersion := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\Comments'), pntr, len){ and (@len <> nil)} then
          result.Comments := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\PrivateBuild'), pntr, len){ and (@len <> nil)} then
          result.PrivateBuild := PChar(pntr);
        if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\SpecialBuild'), pntr, len){ and (@len <> nil)} then
          result.SpecialBuild := PChar(pntr);
      finally
        FreeMem(buf);
      end;
    end;
————————————————
版权声明:本文为CSDN博主「luxuewei5214」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luxuewei5214/article/details/82186954

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!