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