我想用GetFileVersionInfo函数来获取.exe或者.dll的版本信息,可是试验发现只能获得delphi编译出来的程序的版本信息,其他程序不能获取,VerQueryValue返回FALSE。程序如下:
function GetFileVerInfo(FileName: string; var VerInfo: TFileVerInfo): Boolean;
var
  var
  vsize,      // version size
  len: DWORD;   
  vbuf: PChar;
  value: PChar;
begin
  vsize := GetFileVersionInfoSize(PChar(FileName), len);
  if vsize = 0 then Exit;  vbuf := AllocMem(vsize);
  if vbuf = nil then Exit;
  try
    if not GetFileVersionInfo(PChar(FileName), 0, vsize, vbuf) then Exit;    if VerQueryValue(vbuf, PChar('StringFileInfo\080403A8\CompanyName'), Pointer(Value), Len) then  // 这里返回FALSE
      CompanyName:= Value;
      ...只能获取delphi编译出来的程序的版本信息,这是怎么回事,哪位大侠有解?

解决方案 »

  1.   

    跟语言版本相关,你不能写死啊,procedure TFileInfo.GetFileInfo(const AFileName: TFileName);
    var
      FFile: TFileName;
      FInfoSize, Temp, Len: Cardinal;
      InfoBuf: Pointer; 
      TranslationLength: Cardinal;
      TranslationTable: Pointer; 
      LanguageID, CodePage, LookupString: String;
      Value: PChar;
    begin
      FFile := AFileName;
      if Length(FFile) = 0 then
        FFile := TSystemConst.Instance.AppName;  FInfoSize := GetFileVersionInfoSize(PChar(FFile), Temp);
      FAvailable := FInfoSize > 0;
      if FAvailable then
      begin
        InfoBuf := AllocMem(FInfoSize);
        try  // try
          GetFileVersionInfo(PChar(FFile), 0, FInfoSize, InfoBuf);      if VerQueryValue( InfoBuf, '\VarFileInfo\Translation', TranslationTable, TranslationLength ) then
          begin
            CodePage := Format( '%.4x', [ HiWord( PLongInt( TranslationTable )^ ) ] );
            LanguageID := Format( '%.4x', [ LoWord( PLongInt( TranslationTable )^ ) ] );
          end;
          LookupString := 'StringFileInfo\' + LanguageID + CodePage + '\';
          
          if VerQueryValue( InfoBuf, PChar( LookupString + 'CompanyName' ), Pointer( Value ), Len ) then
            FCompanyName := Value;
          if VerQueryValue( InfoBuf, PChar( LookupString + 'FileDescription' ), Pointer( Value ), Len ) then
            FFileDescription := Value;
          if VerQueryValue( InfoBuf, PChar( LookupString + 'FileVersion' ), Pointer( Value ), Len ) then
            FFileVersion := Value;
          if VerQueryValue( InfoBuf, PChar( LookupString + 'InternalName' ), Pointer( Value ), Len ) then
            FInternalName := Value;
          if VerQueryValue( InfoBuf, PChar( LookupString + 'LegalCopyright' ), Pointer( Value ), Len ) then
            FLegalCopyright := Value;
          if VerQueryValue( InfoBuf, PChar( LookupString + 'LegalTrades' ), Pointer( Value ), Len ) then
            FLegalTradeMarks := Value;
          if VerQueryValue( InfoBuf, PChar( LookupString + 'OriginalFilename' ), Pointer( Value ), Len ) then
            FOriginalFilename := Value;
          if VerQueryValue( InfoBuf, PChar( LookupString + 'ProductName' ), Pointer( Value ), Len ) then
            FProductName := Value;
          if VerQueryValue( InfoBuf, PChar( LookupString + 'ProductVersion' ), Pointer( Value ), Len ) then
            FProductVersion := Value;
          if VerQueryValue( InfoBuf, PChar( LookupString + 'Comments' ), Pointer( Value ), Len ) then
            FComments := Value;
        finally  // wrap up finally
          FreeMem(InfoBuf, FInfoSize);
        end;  // end try finally
      end;
    end;
      

  2.   

    建议你直接去查找Win32 API函数库,找找类似的功能,肯定有的。
      

  3.   

    我就是直接用win32API的,什么都可以读到的。