Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Descrizione dell'eseguibile

Possibile che non ci sia modo per sapere la descrizione contenuta in un file
eseguibile?
Quella cioč che viene visualizzata dalla finestra Proprietč quando si clicca
col tasto destro su di un file.
Ho visto che sul sito comune c'č come ricavare la ver. di un exe, ma non mi
sembra di aver visto niente che faccia quello che cerco io...
Qualcuno puň aiutarmi?
Ciao

...

Per avere tutte le informazioni di versione (numero di versione, copyright,
descrizione, etc...) da un eseguibili (EXE, DLL o OCX) devi usare l'API
GetFileVersionInfo().
L'uso di quest'API non e' semplicissimo, perche' quelle informazioni sono
strutturate in un blocco di memoria; la GetFileVersionInfo ti ritorna
l'intero blocco, poi devi usare l'API VerQueryValue() per "navigare" nella
struttura di VersionInfo.
Senza documentazione sulle API non andresti molto lontano, ma se hai la
win32api.hlp, dovresti cavartela.
Io le ho usate in Delphi, poi avevo avuto dei problemi per le varie lingue
(character sets), si' perche' le informazioni di versione possono essere in
diverse lingue...
--
Roal Zanazzi
z...@iol.it

...

Ok, grazie Roal...
Io sono arrivato fino a qui: (A parte le dichiarazioni sbagliate della
VerQueryValue())...
Private Function GetInfo() As String
    Dim lSize As Long
    Dim info() As Byte
    Dim lpInfo As Long
    Dim lpFFInfo As VS_FIXEDFILEINFO
    liSize = GetFileVersionInfoSize("c:\win95\explorer.exe", 0&)
    ReDim info(0 To lSize - 1)
    Call GetFileVersionInfo("c:\win95\explorer.exe", 0&, lSize, info(0))
    Call VerQueryValue(info(0), "\", lpInfo, lSize)
    Call CopyMemory(lpFFInfo, lpInfo, Len(lpFFInfo))
    ' ** E mo? **
End Function
Aiuti ancora?


E mo... viene la parte difficile ;-)
Innanzitutto devi comprendere cosa sta avvenendo.
con la chiamata a GetFileVersionInfo() ricevi un blocco di memoria che
contiene TUTTE le informazioni di versione del file specificato (-> il tuo
buffer info()).
Questo blocco e' una struttura complessa (e' una specie di albero, tipo il
registry), per leggere i suoi "campi" e' necessario chiamare la
VerQueryValue().
Ad essa passi il blocco e l'identificativo del campo che vuoi; ti ritorna il
blocco di memoria contenente il campo richiesto.
Nel tuo caso hai richiesto "\":
"Specifies the root block. The function retrieves a pointer to the
VS_FIXEDFILEINFO structure for the version-information resource."
quindi ti ritorna una struttura VS_FIXEDFILEINFO (-> la tua lpFFInfo).
Questa e' una struttura semplice (un Type di VB) che contiene SOLO i dati
numerici delle informazioni di versione (sono gli unici che non dipendono
dalla lingua, poiche' le stringhe sono tutte in unicode, come spiego piu'
avanti):
typedef struct _VS_FIXEDFILEINFO {  // vsffi
    DWORD dwSignature;
    DWORD dwStrucVersion;
    DWORD dwFileVersionMS;
    DWORD dwFileVersionLS;
    DWORD dwProductVersionMS;
    DWORD dwProductVersionLS;
    DWORD dwFileFlagsMask;
    DWORD dwFileFlags;
    DWORD dwFileOS;
    DWORD dwFileType;
    DWORD dwFileSubtype;
    DWORD dwFileDateMS;
    DWORD dwFileDateLS;
} VS_FIXEDFILEINFO;
(se non hai il win32api.hlp fammelo sapere, ti mando la descrizione dei
singoli campi)
Se, invece, vuoi leggere le stringhe (descrizione, copyright, commenti,
etc...) allora la cosa e' piu' complicata.
Nella VerQueryValue devi specificare il campo che ti interessa, ti
ritornera' la stringa.
"\StringFileInfo\lang-charset\string-name
Specifies a value in a language-specific structure. The lang-charset name is
a concatenation of a language and character-set identifier pair found in the
translation table for the resource. The lang-charset name must be specified
as a hexadecimal string. The string-name name is one of the predefined
strings described in the following Remarks section."
"The Win32 API contains the following predefined version information
strings:
CompanyName FileDescription FileVersion InternalName LegalCopyright
OriginalFilename ProductName ProductVersion"
Esempio:
richiedi la descrizione nella lingua Inglese USA (0409 esadecimale)
    Call VerQueryValue(info(0), "\StringFileInfo\040904E4\FileDescription
", lpInfo, lSize)
lpInfo e' il puntatore alla stringa contenente la descrizione (qui potresti
anche farti una declare modificata della VerQueryValue, per avere il terzo
paramentro come string byref).
A questo punto mi sono fermato anch'io.
Perche'?
Perche' devi specificare il lang-charset.
Per sapere in quante lingue sono disponibili le informazioni di versione
devi chiamare la VerQueryValue con "\VarFileInfo\Translation", ti ritorna il
puntatore ad un array di codici di lingua e character-set disponibili per le
informazioni di versione. Puoi usare SOLO quelli per le seguenti
interrogazioni con VerQueryValue (dove io ho usato 040904E4).
Quasi sempre le informazioni di versione sono disponibili in Inglese USA, ma
non farci affidamento (io negli EXE che faccio in Delphi le metto in
Italiano 0410 ;-)
--
Roal Zanazzi
z...@iol.it


Ma cavolo! Possibile che non si possa tirar fuori dall'eseguibile
semplicemente quello che c'è scrito dentro come avviene per le icone?
Cos'è tutta 'sta storia delle tabelle di codice, lingue varie, ecc..?
Vabbe' va a finire che ci rinuncio, tanto era solo un preziosismo.
Grazie 1k comunque.
Ciao.