Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

GetFileVersionInfo [D6, WinXP]


#0FFFF ©   (2006-10-21 18:12:00) 

Доброго времени суток.
Подскажите пожалуйста примером как получить описание файла 'FileDescription' с помощью функции GetFileVersionInfo


#0FFFF   (2006-10-21 19:39:00) [1]


> Джо ©   (21.10.06 19:30) [5]
> Лечу комплекс вины...


Интересно какой и за что?


Джо   (2006-10-21 19:30:00) [2]

> [3] Ketmar ©   (21.10.06 18:53)
> >[2] Джо(c) 21-Oct-2006, 18:46
> опять на тебя напала доброта, и ты не можешь отбиться? %-
> )

Лечу комплекс вины... :( Кстати, Кеннеди (и Кенни) убил, все-таки, не я :)


#0FFFF   (2006-10-21 18:57:00) [3]


> Джо ©   (21.10.06 18:46) [2]


Спасибо


Ketmar   (2006-10-21 18:53:00) [4]

>[2] Джо(c) 21-Oct-2006, 18:46
опять на тебя напала доброта, и ты не можешь отбиться? %-)


Джо   (2006-10-21 18:46:00) [5]

{***********************************************************
 Класс-обертка для функций:
 Wrapper for API functions:
   GetFileVersionInfo,GetFileVersionInfoSize,VerQueryValue

 E-mail: sergeybox@gmail.com

 Последнее изменение/Last modified: 20:56 03.08.2004

 ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:

 -----------------------------------------------------------
  Пример 1:
  var
    FileInfo: TFileVersionInfo
    VerInfo: FFileVersion;
  begin
    // file name passed to constructor
    FileInfo := TFileVersionInfo.Create ('c:\prog.exe');
    try
      if FileInfo.HasInfo then
      begin
        Label1.Caption := FileInfo.GetString (INFO_CompanyName);
        Label2.Caption := FileInfo.GetString (INFO_FileDescription);

        VerInfo := FileInfo.GetVersion;
        Label3.Caption := Format ('%d.%d',[VerInfo.Minor,VerInfo.Major]);
      end;
    finally
      FileInfo.Free;
    end;
  end;
 
 -----------------------------------------------------------
  Пример 2:
  var
    FileInfo: TFileVersionInfo
    VerInfo: FFileVersion;

  begin
    // no file name passed to constructor
    FileInfo := TFileVersionInfo.Create;
    try

      FileInfo.FileName := 'c:\myprog1.Exe';  // specify file
      if FileInfo.HasInfo then
      begin
        Label1.Caption := FileInfo.GetString (INFO_CompanyName);
        Label2.Caption := FileInfo.GetString (INFO_FileDescription);

        VerInfo := FileInfo.GetVersion;
        Label3.Caption := Format ('%d.%d',[VerInfo.Minor,VerInfo.Major]);
      end;

      FileInfo.FileName := 'c:\myprog2.Exe';  // specify file
      if FileInfo.HasInfo then
      begin
        Label4.Caption := FileInfo.GetString (INFO_CompanyName);
        Label5.Caption := FileInfo.GetString (INFO_FileDescription);

        VerInfo := FileInfo.GetVersion;
        Label6.Caption := Format ('%d.%d',[VerInfo.Minor,VerInfo.Major]);
      end;

    finally
      FileInfo.Free;
    end;
  end;
************************************************************}

unit VerInfo;

interface
uses Windows;

const
 MaxInfoStrings = 7;

 INFO_CompanyName = 'CompanyName';
 INFO_FileDescription = 'FileDescription';
 INFO_FileVersion = 'FileVersion';
 INFO_InternalName = 'InternalName';
 INFO_LegalCopyright = 'LegalCopyright';
 INFO_OriginalFileName = 'OriginalFileName';
 INFO_ProductName = 'ProductName';
 INFO_ProductVersion = 'ProductVersion';

 VersionInfoStrings: array [0..MaxInfoStrings] of string =
 (
   INFO_CompanyName,
   INFO_FileDescription,
   INFO_FileVersion,
   INFO_InternalName,
   INFO_LegalCopyright,
   INFO_OriginalFileName,
   INFO_ProductName,
   INFO_ProductVersion
 );

type
 TFileVersion = record
   Minor,
   Major,
   Build,
   Release: WORD;
 end;

 TFileVersionInfo = class
 private
   FFileName: string;
   FBuffer: PChar;
   FBuffLen: Cardinal;
   FLocale: string;
   procedure SetFileName(const Value: string);
   procedure LoadFile (AFileName: string);
   procedure UnloadFile;
   function GetHasInfo: Boolean;
 public
   constructor Create (AFileName: string);
   destructor Destroy; override;

   property HasInfo: Boolean read GetHasInfo;
   property FileName: string read FFileName write SetFileName;
   property Locale: string read FLocale;

   function GetString (AString: string): string;
   function GetVersion: TFileVersion;

 end;

implementation
uses SysUtils;

{ TFileVersionInfo }

type
 TVer1 = record
   Minor: Word;
   Major: Word;
 end;
 TVer2 = record
   Build: Word;
   Release: Word;
 end;

constructor TFileVersionInfo.Create(AFileName: string);
begin
 FFileName := AFileName;
 LoadFile(AFileName);
end;

destructor TFileVersionInfo.Destroy;
begin
 UnloadFile;
 inherited;
end;

function TFileVersionInfo.GetHasInfo: Boolean;
begin
 Result := (FFileName <> '') and (FBuffLen <> 0);
end;

function TFileVersionInfo.GetString(AString: string): string;
var
 InfoLen: Cardinal;
 PInfo: PChar;
begin
 if VerQueryValue(
   FBuffer,
   PChar('\StringFileInfo\' + FLocale + '\'+AString),
   Pointer(PInfo),
   InfoLen
 ) then
 begin
   Result := PInfo;
 end
 else
   Result := ''
end;

function TFileVersionInfo.GetVersion: TFileVersion;
var
 FI: PVSFixedFileInfo;
 VerSize: Cardinal;
 Ver1: TVer1;
 Ver2: TVer2;
begin
 if VerQueryValue(FBuffer,'\',Pointer(FI),VerSize) then
 begin
   Ver1 := TVer1(FI.dwFileVersionMS);
   Ver2 := TVer2(FI.dwFileVersionLS);

   Result.Minor := Ver1.Minor;
   Result.Major := Ver1.Major;
   Result.Build := Ver2.Build;
   Result.Release := Ver2.Release;
 end;
end;

procedure TFileVersionInfo.LoadFile(AFileName: string);
var
 Dummy,LangLen: Cardinal;
 LangBuff: PChar;
begin
 UnloadFile;

 FBuffLen := 0;

 // Buffer size
 FBuffLen := GetFileVersionInfoSize(
   PChar(AFileName),
   Dummy
 );

 if FBuffLen <> 0 then
 begin
   GetMem (FBuffer,FBuffLen);

   // read resource data
   GetFileVersionInfo(
     PChar(FileName),
     0,
     FBuffLen,
     FBuffer
   );

   // check string locale
   VerQueryValue(FBuffer, '\VarFileInfo\Translation', pointer(LangBuff), LangLen);
   if langLen >= 4 then // if specified
   begin
     StrLCopy(@Dummy, LangBuff, 2);
     FLocale:= Format('%4.4x', [Dummy]);
     StrLCopy(@Dummy, LangBuff+2, 2);
     FLocale := FLocale + Format('%4.4x', [Dummy]);
   end
   else
     // use Amer. Engl, ANSI
     FLocale := '040904E4';
 end;
end;

procedure TFileVersionInfo.SetFileName(const Value: string);
begin
 FFileName := Value;
 LoadFile(Value);
end;

procedure TFileVersionInfo.UnloadFile;
begin
 FreeMem (FBuffer);
end;

end.


guav   (2006-10-21 18:38:00) [6]

VerQueryValue


Наверх

Титульная страница Поиск, карта сайта Написать письмо