IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Comment retrouver l'information version d'un executable


Sujet :

C++

  1. #1
    Membre actif Avatar de Fares BELHAOUAS
    Homme Profil pro
    Développeur Flex & Java
    Inscrit en
    Mars 2002
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Flex & Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 182
    Points : 252
    Points
    252
    Par défaut Comment retrouver l'information version d'un executable
    Salut tout le monde,

    Ma question est simple, mais je ne trouve pas de solution sur le Net, je voudrais récupérer par code C++ les informations de version d'un fichier executable, genre faire dans l'explorateur windows:

    1- propriété fichier executable
    2- onglet version

    Merci de m'éclairer

    N.B. Je sais que c'est faisable car j'ai déja eu cette option dans InstallShild, ou on peut tester la version d'un fichier executable pour controler le type d'installation qu'on fait.
    Bon courage, @ ciao bonsoir!
    --------------
    Mettre le Tag est aussi une aide aux développeurs

  2. #2
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Parfois, les information de version d'un fichier se trouvent dans une chaine de caractère commençant par "@(#)".

  3. #3
    Membre actif Avatar de Fares BELHAOUAS
    Homme Profil pro
    Développeur Flex & Java
    Inscrit en
    Mars 2002
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Flex & Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 182
    Points : 252
    Points
    252
    Par défaut
    Euuhhh, merci pour la réponse, mais je ne crois pas que ça m'aide beaucoup ce que tu avance là, merci quand même de donner une certaine activité à ma question
    Bon courage, @ ciao bonsoir!
    --------------
    Mettre le Tag est aussi une aide aux développeurs

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Voici :
    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
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    #define __BROWSEDLL__
     
    //	INCLUDE
    #include "GetDllInfo.h"
    #include <string.h>
     
    extern "C" int APIENTRY DllMain
    (
        HINSTANCE p_hInstance  ,
        DWORD     p_dwReason   ,
        LPVOID    p_lpReserved
    )
    {
    	// (1) Cas ou la raison de l'appel à DllMain vaut :
    	switch( p_dwReason )
    	{
    		// (1.10) Appel a la dll.
    		case DLL_PROCESS_ATTACH :
    			break;
    		// (1.20) Liberation de la dll.
    		case DLL_PROCESS_DETACH :
     
    			break;
    		// (1.30) Autre cas. 
    		default :
    			break;
    	}
     
    	// (2) Retourner OK.
    	return 1;   // ok
    }
     
    // ne pas oublier de rajouter version.lib dans les liens des Settings du projet pour avoir les != fonctions qui vont bien ; )
    DLLPREFIX BL_ERRORS GetDLLVersion
    ( 
       char*             p_pcDllName,
       VS_FIXEDFILEINFO* p_ptVerInfo,
       BROWSEDATA*       p_bdDataArray
    )
    {
       // variables pour la version de la dll
       BL_ERRORS l_ErrCode = BLE_NO_ERROR;
       DWORD l_dwVerInfoSize;     // Taille de la version.
       DWORD l_dwVerHnd;          // Non utilisé.
       // (1) Vérifier si le buffer de réception a été alloué.
       if (p_pcDllName!= NULL)
       {
          l_dwVerInfoSize = GetFileVersionInfoSize(p_pcDllName, &l_dwVerHnd);
          if (l_dwVerInfoSize > 0)
          {
             unsigned char* l_pucVersionBlock ;
     
             //Allocate memory space for version block
             l_pucVersionBlock = new unsigned char [l_dwVerInfoSize];
             if (l_pucVersionBlock != NULL)
             {
                if (GetFileVersionInfo(p_pcDllName, NULL, l_dwVerInfoSize, (LPVOID) l_pucVersionBlock) > 0 ) // on commence à récupérer les infos dans l_dwVerInfoSize. Si >0, c'est OK
                {
                   VS_FIXEDFILEINFO *l_ptVerInfo   ;
                   BOOL             l_bRetCode     ;
                   unsigned int     l_uiVersionLen ;
     
                   l_bRetCode = VerQueryValue (l_pucVersionBlock, "\\", (LPVOID *)&l_ptVerInfo, &l_uiVersionLen); //on récupère encore des infos par VerQueryValue
                   if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                   {
                      return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                   }
                   else
                   {
                      memcpy (p_ptVerInfo, l_ptVerInfo, sizeof (VS_FIXEDFILEINFO ));
                      // et on copie toutes les infos sur la dll dans la structure
                      WORD             *l_pwVerInfo   ;
                      BOOL             l_bRetCode     ;
                      unsigned int     l_uiVersionLen ;
     
                      //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)
                      {
                         char* l_pcDllInfos;
                         char  l_cStartString[30];
                         char  l_pulLangageRef[50];
     
                         // 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]);
     
                         // on commence par le nom de la compagnie
                         sprintf(l_pulLangageRef, "%sCompanyName", l_cStartString);
                         l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                         strncpy(p_bdDataArray->m_acCompanyName, l_pcDllInfos, l_uiVersionLen);
                         if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                         {
                            return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                         }
     
                         // on continue par la description du fichier
                         sprintf(l_pulLangageRef, "%sFileDescription", l_cStartString);
                         l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                         strncpy(p_bdDataArray->m_acFileDescription, l_pcDllInfos, l_uiVersionLen);
                         if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                         {
                            return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                         }
     
                         // 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;
                         }
     
                         // on commence par le nom nom interne du produit
                         sprintf(l_pulLangageRef, "%sInternalName", l_cStartString);
                         l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                         strncpy(p_bdDataArray->m_acInternalName, l_pcDllInfos, l_uiVersionLen);
                         if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                         {
                            return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                         }
     
                         // on commence par le copyright
                         sprintf(l_pulLangageRef, "%sLegalCopyright", l_cStartString);
                         l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                         strncpy(p_bdDataArray->m_acLegalCopyright, l_pcDllInfos, l_uiVersionLen);
                         if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                         {
                            return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                         }
     
                         // on commence par le nom d'origine
                         sprintf(l_pulLangageRef, "%sOriginalFilename", l_cStartString);
                         l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                         strncpy(p_bdDataArray->m_acOriginalFilename, l_pcDllInfos, l_uiVersionLen);
                         if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                         {
                            return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                         }
     
                         // on commence par le nom de produit
                         sprintf(l_pulLangageRef, "%sProductName", l_cStartString);
                         l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                         strncpy(p_bdDataArray->m_acProductName, l_pcDllInfos, l_uiVersionLen);
                         if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                         {
                            return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                         }
     
                         // on termine par la version du produit
                         sprintf(l_pulLangageRef, "%sProductVersion", l_cStartString);
                         l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                         strncpy(p_bdDataArray->m_acProductVersion, l_pcDllInfos, l_uiVersionLen);
                         if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                         {
                            return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                         }
     
                      }//end if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL) deuxieme niveau
     
                      else // si il ne trouve pas de langage set (ie, pas de champs renseignés pour cette dll
                         l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                   }//end if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL) premier niveau
     
                }// end if GetFileVersionInfo
             } // if l_puc
          }// if l_dwVer
          else
             l_ErrCode = BLE_INVALIDE_DLL_VERSION;
       }// if p_pcVersion
     
       return l_ErrCode;
    }

  5. #5
    Membre actif Avatar de Fares BELHAOUAS
    Homme Profil pro
    Développeur Flex & Java
    Inscrit en
    Mars 2002
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Flex & Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 182
    Points : 252
    Points
    252
    Par défaut
    Merciiiiii,

    J'étais sur une piste similaire, j'ai trouvé un composant Delphi qui fait ça

    http://www.torry.net/pages.php?id=514

    puis en fouillant dans le code j'ai trouvé que ça utilise les fonctions

    GetFileVersionInfoSize
    GetFileVersionInfo

    Merci encore. je crois que c'est ce que je cherchais, je vais mettre résolu même si j'ai pas encore testé.
    Bon courage, @ ciao bonsoir!
    --------------
    Mettre le Tag est aussi une aide aux développeurs

  6. #6
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Pas de quoi =P !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/12/2008, 09h20
  2. Réponses: 6
    Dernier message: 31/03/2008, 11h10
  3. Réponses: 1
    Dernier message: 05/11/2007, 10h25
  4. Comment Récupérer les informations de version d'un fichier dll
    Par elyusufiyasyn dans le forum VBScript
    Réponses: 1
    Dernier message: 16/08/2007, 20h07
  5. Réponses: 6
    Dernier message: 28/09/2003, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo