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 ; ))