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
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
memo1.Lines.Add(''+value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then
memo1.Lines.Add('产品版本: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then
memo1.Lines.Add('文件说明: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then
memo1.Lines.Add('合法版权: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then
memo1.Lines.Add('文件版本: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then
memo1.Lines.Add('公司名称: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then
memo1.Lines.Add('合法商标: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then
memo1.Lines.Add('内部名称: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then
memo1.Lines.Add('原文件名: ' + Value);
FreeMem(Buf, BufSize);
// OperatingSystem.Caption := GetOSVerInfo;
// SystemMemory.Caption := GetMemStat;
end
else begin
Application.MessageBox('获取产品信息时遇到致命错误,请尝试重新启动软件。'+ #13 + '若仍未能解决问题,请联系产品服务人员。','错误',MB_OK + MB_ICONSTOP);
Application.Terminate;
end;
  以上程序粘贴在在相应的位置即可直接运行.(自己加一个memo1控件)
这个是获取程序自身版本的信息,我想修改成获取指定文件的版本信息。

解决方案 »

  1.   

    const
    InfoNum = 9;
    InfoStr: array[1..InfoNum] of string = ('ProductName', 'ProductVersion', 'FileDescription', 'LegalCopyright', 'FileVersion', 'CompanyName', 'LegalTradeMarks', 'InternalName', 'OriginalFileName');function GetExeFileVersion(ExeFileName: string)
    var
      S: string;
      BufSize, Len: DWORD;
      Buf: PChar;
      Value: PChar;
    begin
      BufSize := GetFileVersionInfoSize(PChar(ExeFileName), 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
          memo1.Lines.Add(''+value);
        if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then
          memo1.Lines.Add('产品版本: ' + Value);
        if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then
          memo1.Lines.Add('文件说明: ' + Value);
        if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then
          memo1.Lines.Add('合法版权: ' + Value);
        if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then
          memo1.Lines.Add('文件版本: ' + Value);
        if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then
          memo1.Lines.Add('公司名称: ' + Value);
        if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then
          memo1.Lines.Add('合法商标: ' + Value);
        if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then
          memo1.Lines.Add('内部名称: ' + Value);
        if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then
          memo1.Lines.Add('原文件名: ' + Value);
        FreeMem(Buf, BufSize);
        // OperatingSystem.Caption := GetOSVerInfo;
        // SystemMemory.Caption := GetMemStat;
      end
      else
      begin
        Application.MessageBox('获取产品信息时遇到致命错误,请尝试重新启动软件。'+ #13 + '若仍未能解决问题,请联系产品服务人员。','错误',MB_OK + MB_ICONSTOP);
        Application.Terminate;
      end;
      

  2.   

    S := Application.ExeName;
    把这个s替换成你想获得版本的外部文件的名字即可~~
      

  3.   

    'StringFileInfo\080403A8\' 这个最好不要传常量,否则的话不通用,很多程序都会取不出来。
      

  4.   

        GetFileVersionInfo(PChar(Filename), 0, VerInfoSize, VerInfo);
        VerQueryValue(VerInfo,
                      '\VarFileInfo\Translation',
                      Pointer(lpTranslate),
                      cbTranslate);
        if cbTranslate <> 0 then begin
          Data := format('\StringFileInfo\%.4x%.4x\CompanyName',[lpTranslate^.wLanguage,lpTranslate^.wCodePage]);
          VerQueryValue(  VerInfo
                        , PAnsiChar(data)
                        , Pointer(VerCompany)
                        , VerValueSize);
          if VerValueSize <> 0 then begin
            SetString(lpCompanyName^, VerCompany, VerValueSize-1);
          end;
        end;