Bonjour tout le monde,

Je cherche un moyen de récuperer les informations de version qui sont contenues dans VS_vERSION_INFO.

Après quelques recherches, je suis tombé sur le post it de ce forum (très bien fait d'ailleurs ) :

Comment récupérer les informations de version dans un programme Windows ?

En faisant clic droit propriétés sur un fichier .exe ou .dll dans l’explorateur Windows
On peut visualiser les informations liées à la version du programme.
Ces informations sont disponibles dans le fichier ressources de notre application dans la section Version\VS_VERSION_INFO.

La question qui se pose c’est comment accéder à ces informations à l’intérieur d’un programme ?
Il faudra utiliser les fonctions GetFileVersionInfo et VerQueryValue
La classe qui suit se propose de récupérer l’ensemble de ces informations et d’en fournir l’accès pour chaque élément.
Le paramétrage par défaut de la fonction GetInfosFile permet de retrouver les informations pour l’exécutable en cours pour première page de langue trouvée.
(Il est possible d’avoir plusieurs définitions de langues dans les ressources).
la définition:
Code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
// récupération des informations de version du fichier .exe ou dll.
// les zones suivantes sont disponibles:/
//        "FixedFileVersion","FixedProductVersion"
//        "Comments","InternalName","ProductName",
//        "CompanyName","LegalCopyright","ProductVersion",
//        "FileDescription","LegalTrademarks","PrivateBuild",
//        "FileVersion","OriginalFilename","SpecialBuild"
class CVersionFile
{
    private: CVersionFile(const CVersionFile&);      // pas de constructeur de copie
    private: void operator=(const CVersionFile&); // pas d'operateur de copie.
 
public:
 
    CVersionFile(){}
 
    // la valeur de la clef szLib correspondant a une entrée du dossier version
    CString GetInfos(const char *szLib);
 
    // permet d'itérer les valeurs stockées.
    // charge la valeur rValue pour la clef correspondante dans rKeyName 
    // rFirstOne doit etre initialisée à true au premier appel de la fonction.
    bool  GetNextInfos(bool &rFirstOne,CString &rstrKeyName,CString &rstrValue);
 
 
    // récuperation des valeurs 
    // const char *szFileName  le module spécifié ou si null 'exe en cours d'execution.
    // WORD wLanguage : le langage à lire ex:SUBLANG_ENGLISH_US ou si 0 le premier langage utilisé
    // WORD wCodePage : la page code à lire ex:LANG_ENGLISH        ou si 0 la premiere page de code utilisée.
    bool GetInfosFile(const char *szFileName=NULL,WORD wLanguage=0,WORD wCodePage=0);
 
protected:
    CMap<CString ,const char *,CString ,const char *> m_aListInfos;
    POSITION m_pos;
};

l'implementation:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
Code :
 
 
#pragma comment(lib,"Version.lib") // à rajouter dans le source.
 
//-----------------------------------------------------------------
CString CVersionFile::GetInfos(const char *szLib)
{
    // 
    CString str;
    m_aListInfos.Lookup(szLib,str);
    return str;
}
//-----------------------------------------------------------------
bool CVersionFile::GetNextInfos(bool &rFirstOne,CString &rstrKeyName,CString &rstrValue)
{
    //     
    if(rFirstOne) m_pos = m_aListInfos.GetStartPosition();
    rFirstOne=false;    
    if(m_pos!= NULL)
    {
        m_aListInfos.GetNextAssoc(m_pos,rstrKeyName,rstrValue);
        return true;
    }    
    return false;
}
//-----------------------------------------------------------------
bool CVersionFile::GetInfosFile(const char *szFileName /*=NULL*/,WORD wLanguage /*=0*/,WORD wCodePage /*=0*/)
{
    // 
    DWORD dwVerInfoSize;
    DWORD dwHnd;
    void* pBuffer;
    VS_FIXEDFILEINFO *pFixedInfo;
    LPVOID  lpVersionBuffer;
    UINT    uLen;
    TCHAR szGetName[500];
 
    TCHAR szExeName[MAX_PATH];
 
    m_aListInfos.RemoveAll();
 
    if(!szFileName)                
        GetModuleFileName(AfxGetInstanceHandle(), szExeName, sizeof (szExeName));
    else strcpy(szExeName,szFileName);
 
    dwVerInfoSize = GetFileVersionInfoSize(szExeName, &dwHnd);
    if(dwVerInfoSize)
    {
        CString str;
 
        pBuffer = new char[dwVerInfoSize];
        if (pBuffer == NULL) return false;
 
        GetFileVersionInfo(szExeName, dwHnd, dwVerInfoSize, pBuffer);
 
        // récupère les infos fixes indépendantes du langage.
        // FixedProductVersion
        VerQueryValue(pBuffer,_T("\\"),(void**)&pFixedInfo,(UINT *)&uLen);
        str.Format ("%u,%u,%u,%u", HIWORD (pFixedInfo->dwProductVersionMS),
            LOWORD (pFixedInfo->dwProductVersionMS),
            HIWORD (pFixedInfo->dwProductVersionLS),
            LOWORD (pFixedInfo->dwProductVersionLS));
 
        m_aListInfos.SetAt("FixedProductVersion",str);
 
        //FixedFileVersion
        str.Format ("%u,%u,%u,%u",HIWORD (pFixedInfo->dwFileVersionMS),
            LOWORD (pFixedInfo->dwFileVersionMS),
            HIWORD (pFixedInfo->dwFileVersionLS),
            LOWORD (pFixedInfo->dwFileVersionLS));
 
        m_aListInfos.SetAt("FixedFileVersion",str);
 
        // infos liées au langage.
        unsigned int cbTranslate;
        struct LANGANDCODEPAGE 
        {
            WORD wLanguage;
            WORD wCodePage;
        } *lpTranslate;
 
        // Read the list of languages and code pages.
        VerQueryValue(pBuffer, 
            TEXT("\\VarFileInfo\\Translation"),
            (LPVOID*)&lpTranslate,
            &cbTranslate);
 
        char *aszLib[]={"Comments","InternalName","ProductName",
                        "CompanyName","LegalCopyright","ProductVersion",
                        "FileDescription","LegalTrademarks","PrivateBuild",
                        "FileVersion","OriginalFilename","SpecialBuild"
                        };
        // lecture des infos pour chage langue et page de code             
        for(int i=0; i < (cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++ )
        {
            // filtrage langage et page de code désirée ?
            if(wLanguage && lpTranslate[i].wLanguage!=wLanguage) continue;                
            if(wCodePage && lpTranslate[i].wCodePage!=wCodePage) continue;
 
            for(int n=0;n<sizeof(aszLib)/sizeof(char *);n++)
            {
                str.Format("\\StringFileInfo\\%04x%04x\\%s",
                    lpTranslate[i].wLanguage,
                    lpTranslate[i].wCodePage,
                    aszLib[n]);
 
                lstrcpy(szGetName,str);
                // recuperation de l'information.
                if (VerQueryValue(pBuffer,szGetName,(void**)&lpVersionBuffer,(UINT *)&uLen) != 0)
                {
                    if(lpVersionBuffer)
                    {
                        str = (LPTSTR)lpVersionBuffer;
                        m_aListInfos.SetAt(aszLib[n],str);
                    }
                }
            }                
        }
        delete [] pBuffer;
    }
    return (m_aListInfos.GetCount()!=0);
}
//-----------------------------------------------------------------
Mon soucis se situe au niveau de cette ligne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
CMap<CString ,const char *,CString ,const char *> m_aListInfos;
Mon compilo me renvoie une erreur à cause de cette ligne, et je ne comprend rien du tout à cette ligne justement, est-ce que quelqu'un peut m'éclairer sur les CMap ? Me manque t'il une bibliothèque ? Si oui laquelle ?

Merci d'avance


Edit : Avec l'erreur c'est peut-être mieux
E:\Travaux_en_cours\Unicode\ReshaperAppli\Version.h(36) : error C2143: syntax error : missing ';' before '<'
E:\Travaux_en_cours\Unicode\ReshaperAppli\Version.h(36) : error C2501: 'CMap' : missing storage-class or type specifiers
E:\Travaux_en_cours\Unicode\ReshaperAppli\Version.h(36) : error C2059: syntax error : '<'
E:\Travaux_en_cours\Unicode\ReshaperAppli\Version.h(36) : error C2238: unexpected token(s) preceding ';'