获取文件版本信息的方法

方法一,取回来的都是字符串:
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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值