1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| __fastcall TAboutBox::TAboutBox(TComponent* AOwner)
: TForm(AOwner)
{
DWORD handle; /* Ne sert a rien, mais nécessaire... no comment :) */
UINT size = GetFileVersionInfoSize(Application->ExeName.c_str(), &handle);
//On alloue une zone de size octets et on appelle ensuite la fonction GetFileVersionInfo :
BYTE *pData = new char[size];
GetFileVersionInfo(Application->ExeName.c_str(), handle, size, pData);
/*GetFileVersionInfo copie des informations de version (size octets) dans la zone pointée par pData. Elle renvoie une valeur différente de zéro en cas de réussite.
Pour analyser ces informations de version, il faut exécuter VerQueryValue (et même l'exécuter deux fois) :
----[ BOOL VerQueryValue(lpvBlock, lpszSubBlock, lplpBuffer, lpcb); ]----
Le premier argument de VerQueryValue est un pointeur sur le bloc rempli par GetFileVersionInfo (pData ici). Le deuxième argument est l'information de version recherchée (par exemple le nom de la société ou le numéro de version),
le troisième argument est l'adresse d'un pointeur sur la zone qui devra recevoir l'information recherchée et le dernier argument un pointeur sur un entier dans lequel VerQueryValue copie le nombre de caractères copiés dans la zone qui vient d'être mentionnée.
Pour pouvoir spécifier l'information recherchée, il faudra spécifier, en hexa, la paire langID/charset utilisée par le programme (langue d'install de Windows).
Pour retrouver la paire en question, on écrit (le deuxième argument de VerQueryValue doit être repris tel quel) :*/
VS_FIXEDFILEINFO* lpvi;
UINT iLen;
int n = VerQueryValue(pData, "\\VarFileInfo\\Translation", (void **) &lpvi, &iLen);
translation = *(TRANSLATION*)lpvi;
/*VerQueryValue renvoie une valeur différente de zéro si l'information existe.
Maintenant que nous avons la paire langID/charset, nous pouvons former la chaîne relative à l'information réclamée. Celle-ci doit être de la forme
\StringFileInfo\lang-charset\string-name. StringFileInfo doit être repris tel quel.
lang-char est la représentation hexadécimale des deux champs de la variable structurée translation présentée ci-dessus.
string-name permet de spécifier l'information de version recherchée : Comments (pour les commentaires), CompanyName (pour le nom de l'organisation),
FileDescription (description), FileVersion (version de fichier), InternalName (nom interne), LegalCopyRight (copyright), LegalTrademarks (marques déposées), OriginalFileName (nom d'origine du fichier), ProductName (nom du produit) ou ProductVersion (version du produit).*/
char szName[512];
LPBYTE lpBuffer = new char[512];
int TailleBuffer=512;
if (n != 0)
{
wsprintf(szName, "\\StringFileInfo\\%04x%04x\\FileVersion", translation.langID, translation.charset);
VerQueryValue((LPVOID)pData, szName, (void **) &lpBuffer,(unsigned int *) &TailleBuffer);
}
/*L'information de version se trouve maintenant, sous forme d'une chaîne de caractères, dans la zone pointée par lpBuffer. */
Version->Caption = "Version " + AnsiString((char*) lpBuffer);
} |
Partager