Newsgroup: it.comp.lang.delphi
Titolo: Lettura informazioni eseguibile

Salve, ho realizzato un'applicazione in Delphi 5, in cui ho aggiunto nelle
opzioni del progetto relative alle informazioni sulla versione altri dati.
Avrei la necessità a run-time di leggere questi dati, però non sono
riuscito a trovare nessuna soluzione, eccetto per la versione che viene
inserita automaticamente da Delphi.
Come posso risolvere il problema?
Grazie in anticipo.
Alessandro
--- posted by geoForum on 
http://www.delphiedintorni.it

 versione che viene inserita automaticamente da Delphi.
Non ricordo dove ho trovato questo codice ma funziona. Con qualche
agiunta dovresti essere in grado di accedere alle stringhe che hai
aggiunto:
unit uVersionInfo;
interface
uses
  Windows, Classes, SysUtils;
type
  TFileVersion = record
    Major, Minor, Release, Build: integer;
  end;
  TVersionInfo = class(TObject)
  private
    FData: Pointer;
    FSize: Cardinal;
    FCompanyName: string;
    FFileDescription: string;
    FFileVersion: string;
    FInternalName: string;
    FLegalCopyright: string;
    FLegalTrademarks: string;
    FOriginalFilename: string;
    FProductName: string;
    FProductVersion: string;
    FComments: string;
    FFileVersionEx: TFileVersion;
  public
    constructor Create(FileName: string);
    destructor Destroy; override;
    property CompanyName: string read FCompanyName;
    property FileDescription: string read FFileDescription;
    property FileVersion: string read FFileVersion;
    property FileVersionEx: TFileVersion read FFileVersionEx;
    property InternalName: string read FInternalName;
    property LegalCopyright: string read FLegalCopyright;
    property LegalTrademarks: string read FLegalTrademarks;
    property OriginalFilename: string read FOriginalFilename;
    property ProductName: string read FProductName;
    property ProductVersion: string read FProductVersion;
    property Comments: string read FComments;
  end;
implementation
constructor TVersionInfo.Create(FileName: string);
var
  sz, lpHandle, tbl: Cardinal;
  lpBuffer: Pointer;
  str: PChar;
  strtbl: string;
  int: PInteger;
  hiW, loW: Word;
  Tokens: TStringList;
begin
  inherited Create;
  FSize := GETFILEVERSIONINFOSize(PChar(FileName), lpHandle);
  FData := AllocMem(FSize);
  GETFILEVERSIONINFO(PChar(FileName), lpHandle, FSize, FData);
  VerQueryValue(FData, '\VarFileInfo\Translation', lpBuffer, sz);
  int := lpBuffer;
  hiW := HiWord(int^);
  loW := LoWord(int^);
  tbl := (loW shl 16) or hiW;
  strtbl := Format('%x', [tbl]);
  if Length(strtbl) < 8 then strtbl := '0' + strtbl;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\CompanyName'), lpBuffer, sz);
  str := lpBuffer;
  FCompanyName := str;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\FileDescription'), lpBuffer, sz);
  str := lpBuffer;
  FFileDescription := str;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\FileVersion'), lpBuffer, sz);
  str := lpBuffer;
  FFileVersion := str;
  Tokens := TStringList.Create;
  try
    ExtractStrings(['.'], [' '], str, Tokens);
    if (Tokens.Count = 4) then
    begin
      FFileVersionEx.Major := StrToInt(Tokens[0]);
      FFileVersionEx.Minor := StrToInt(Tokens[1]);
      FFileVersionEx.Release := StrToInt(Tokens[2]);
      FFileVersionEx.Build := StrToInt(Tokens[3]);
    end;
  finally
    Tokens.Free;
  end;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\InternalName'), lpBuffer, sz);
  str := lpBuffer;
  FInternalName := str;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\LegalCopyright'), lpBuffer, sz);
  str := lpBuffer;
  FLegalCopyright := str;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\LegalTrademarks'), lpBuffer, sz);
  str := lpBuffer;
  FLegalTrademarks := str;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\OriginalFilename'), lpBuffer, sz);
  str := lpBuffer;
  FOriginalFilename := str;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\ProductName'), lpBuffer, sz);
  str := lpBuffer;
  FProductName := str;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\ProductVersion'), lpBuffer, sz);
  str := lpBuffer;
  FProductVersion := str;
  VerQueryValue(FData, PChar('\\StringFileInfo\' + strtbl +
'\Comments'), lpBuffer, sz);
  str := lpBuffer;
  FComments := str;
end;
destructor TVersionInfo.Destroy;
begin
  FreeMem(FData);
  inherited;
end;
end.
-- 
I am what I am, I do what I can
Do. Or do not. There is not try.

[...]
Funziona, grazie.
Sarebbe possibile ottenere anche l'elenco completo di tutte le
informazioni del file, senza sapere quali stringhe si devono cercare?


Up.
