Utiliser getfileversion

sitesref Messages postés 40 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 31 juillet 2004 - 15 déc. 2003 à 10:05
cs_radada Messages postés 488 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 21 avril 2009 - 16 déc. 2003 à 11:52
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

cs_radada Messages postés 488 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 21 avril 2009 1
15 déc. 2003 à 10:37
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
0
sitesref Messages postés 40 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 31 juillet 2004
16 déc. 2003 à 11:08
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
0
cs_radada Messages postés 488 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 21 avril 2009 1
16 déc. 2003 à 11:52
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 ; ))
0
Rejoignez-nous