Utiliser getfileversion

Signaler
Messages postés
40
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
31 juillet 2004
-
Messages postés
488
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
21 avril 2009
-
j'ai eu beau chercher, je parviens pas à utiliser l'API GetFileVersion. J'ai été regarder sur le site de MS et dans le Platform SDK mais ils sont pas clairs du tout pour ça.

en fait, je voudrais une fonction qui marche comme ça:

String GetVer(String filename)
{
... // je suppose utiliser GetFileVersion mais comment ?
}

qui renverrait par exemple "2.3"

PS: j'aimerais que la réponse soit un exemple compréhensible en c++ et pas en un autre langage (comme deplhi par ex)

Merci

Nicolas Nachtergaele
DeepBlue Software

3 réponses

Messages postés
488
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
21 avril 2009

Toi t'a pas cherché avant de poster non??? lol :D; ça m'arrive aussi. J'ai posté une source qui fait ça puisque moi aussi j'ai galéré avec cette merde... Bon courage
http://www.cppfrance.com/code.aspx?ID=18340
Messages postés
40
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
31 juillet 2004

merci mais j'avais déjà été voir ce code.

malheureusement y a des morceaux que je comprends pas trop

et surtout je vois pas dans quelle variable tu stockes les résultats (comme par ex le numéro de version) une fois que tu les as trouvés !!!

merci d'essayer d'expliquer un peu ton code à l'andouille que je suis :-)))

nn
DeepBlue Software
Messages postés
488
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
21 avril 2009

Ben c'est assez compliqué comme truc (merci Microsoft, comme d'hab ; ))
En gros, pour la partie qui t'interesse :
Avant de pouvoir récupérer les infos sur les fichiers, il faut que tu connaisse les paramêtres de langue du dit-fichier. C'est 2 chaines en hexa qui se suivent et tu les récupère via :
//on récupère les infos de langues et de version (voir msdn sur VerQueryValue)
                    l_bRetCode = VerQueryValue (l_pucVersionBlock, "\\VarFileInfo\\Translation",    (LPVOID *)&l_pwVerInfo, &l_uiVersionLen);
                    if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL)


Maintenant, pwVerInfo contient 2 morceaux en hexa qui correspondent aux infos de langue. On les mets dans un char[] pour ne plus s'emmerder maintenant qu'on les a....
// on concatène les infos langues sous forme de 2 chaines char en hexa
                     sprintf(l_cStartString, "\\StringFileInfo\\%04x%04x\", l_pwVerInfo[0], l_pwVerInfo[1]);


Et maintenant en fait, il existe plein de champs sous la forme \StringFileInfo\\%04x%04x\\Nom_du_champs (voir MSDN) qui contiennent <> infos. Il suffit de les récupérer avec de nouveau un VerQueryValue en passant les paramêtres qui vont bien. Par exemple, pour le n° de vesion (dispo dans \\StringFileInfo\\%04x%04x\\FileVersion):
// on commence par la version du fichier
                     sprintf(l_pulLangageRef, "%sFileVersion", l_cStartString);
                     l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,    (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                     strncpy(p_bdDataArray->m_acFileVersion, l_pcDllInfos, l_uiVersionLen);
                     if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                     {
                        return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                     }


le N° est contenu dans l_pcDllInfos, et je fais une copie dans un char[] via un strncpy(dest, srce, len) :
strncpy(p_bdDataArray->m_acFileVersion, l_pcDllInfos, l_uiVersionLen);


J'espère que c'est un peu moins nébuleux comme ça ; ))