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

Windows Discussion :

Récupérer un paramètre d'un .EXE


Sujet :

Windows

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut Récupérer un paramètre d'un .EXE
    Bonjour,

    J'ai créé un .EXE en C++ et j'aimerai dans mon code récupérer la ligne "ProductVersion".


    Pour faire cela, j'ai trouvé la fonction FindResource() = Cette fonction recherche une ressource d'un type donné (version, dialogue, menu...) dont son identifiant est fourni.

    Voici dans un premier temps le bout de code que j'aimerai faire fonctionner, qu'il m'affiche avec un cout le n° de la version de mon .EXE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HRSRC WINAPI bob = FindResource(NULL, MAKEINTRESOURCE(VFT2_UNKNOWN), RT_VERSION);
    cout << bob << endl;
    Actuellement cela m'affiche juste "00000000" et ça devrait m'afficher "4.96.06".

    J'aimerai avoir votre avis, si je vais dans la bonne direction avec ce FindResource() et si vous avez quelques conseils a me donner pour mon problème.

    Merci à vous.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Je ne connais pas la structure interne d'un .exe, mais es-tu certain que ton .exe a bien une ressource ProductVersion?

    Ne pas trouver quelque chose peut tout simplement venir de son absence
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Je pense que oui, j'ai créé cet exe avec visual studio, le screenshot montre toutes les caractéristiques qui constituent l'exe en question. J'imagine qu'il y a bien un moyen pour récupérer ces caractéristiques dont le "productVersion".

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 211
    Points
    23 211
    Par défaut
    Bonjour,

    Ta fonction retourne NULL, utilises donc GetLastError pour savoir pourquoi.

    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Sinon es-tu sûr que VFT2_UNKNOWN est bien l'id de product version?

    Essaye d'ouvrir le .rc avec un éditeur de texte pour voir exactement ce qu'il contient.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    je vais essayer de regarder ça merci



    edit: j'ai trouvé une autre fonction qui semble mieux correspondre au lieu du FindResource() :

    GetFileVersionInfo();
    http://msdn.microsoft.com/en-us/libr...81(VS.85).aspx

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Points : 168
    Points
    168
    Par défaut
    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
    #include <windows.h>
    #include <stdio.h>
    
    #pragma comment(lib, "version.lib")
    
    //----------------------------------------------------------------------
    int GetProductVersion(const char *szFile, char *szProductVer, size_t len)
    {
      void *pbuf;
      UINT buflen;
      int result = 0;
      VS_FIXEDFILEINFO *pffi;
      DWORD dwSize, dwHandle = 0;
    
      if(!(dwSize = GetFileVersionInfoSize(szFile, &dwHandle)))
        return result;
    
      if(!(pbuf = HeapAlloc(GetProcessHeap(), 0, dwSize)))
        return result;
    
      if(GetFileVersionInfo(szFile, 0, dwSize, pbuf))
        if(VerQueryValue(pbuf, "\\", (void **)&pffi, &buflen))
          result = _snprintf(szProductVer, len, "%d.%d.%d.%d", HIWORD(pffi->dwProductVersionMS), LOWORD(pffi->dwProductVersionMS), HIWORD(pffi->dwProductVersionLS), LOWORD(pffi->dwProductVersionLS));
    
      HeapFree(GetProcessHeap(), 0, pbuf);
      return result;
    }
    
    //----------------------------------------------------------------------
    int main(void)
    {
      char szProductVersion[64];
    
      if(GetProductVersion("Notepad.exe", szProductVersion, 64))
        printf("Notepad.exe\n\t%s\n", szProductVersion);
    
      if(GetProductVersion("Calc.exe", szProductVersion, 64))
        printf("Calc.exe\n\t%s\n", szProductVersion);
    
      return 0;
    }

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par magma² Voir le message
    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
    #include <windows.h>
    #include <stdio.h>
    
    #pragma comment(lib, "version.lib")
    
    //----------------------------------------------------------------------
    int GetProductVersion(const char *szFile, char *szProductVer, size_t len)
    {
      void *pbuf;
      UINT buflen;
      int result = 0;
      VS_FIXEDFILEINFO *pffi;
      DWORD dwSize, dwHandle = 0;
    
      if(!(dwSize = GetFileVersionInfoSize(szFile, &dwHandle)))
        return result;
    
      if(!(pbuf = HeapAlloc(GetProcessHeap(), 0, dwSize)))
        return result;
    
      if(GetFileVersionInfo(szFile, 0, dwSize, pbuf))
        if(VerQueryValue(pbuf, "\\", (void **)&pffi, &buflen))
          result = _snprintf(szProductVer, len, "%d.%d.%d.%d", HIWORD(pffi->dwProductVersionMS), LOWORD(pffi->dwProductVersionMS), HIWORD(pffi->dwProductVersionLS), LOWORD(pffi->dwProductVersionLS));
    
      HeapFree(GetProcessHeap(), 0, pbuf);
      return result;
    }
    
    //----------------------------------------------------------------------
    int main(void)
    {
      char szProductVersion[64];
    
      if(GetProductVersion("Notepad.exe", szProductVersion, 64))
        printf("Notepad.exe\n\t%s\n", szProductVersion);
    
      if(GetProductVersion("Calc.exe", szProductVersion, 64))
        printf("Calc.exe\n\t%s\n", szProductVersion);
    
      return 0;
    }
    Merci pour ton exemple magma², ton code ma redonné espoir !
    J'ai réussi à l'adapter à ce que je voulais faire mais il me retourne le product version du haut et pas celui du bas (par rapport au screenshot de mon 1er post). J'y retourne.


    edit: en fait tout semble bien fonctionner merci à vous

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/08/2005, 14h04
  2. [Logiciel] paramètres d'explorateur.exe
    Par maitrebn dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 02/06/2005, 10h13
  3. [Débutant] Récupérer les paramètres d'une routine
    Par nifty dans le forum Assembleur
    Réponses: 5
    Dernier message: 18/04/2005, 14h35
  4. Récupérer un paramètre de strust-config.xml
    Par pegsounette dans le forum Struts 1
    Réponses: 3
    Dernier message: 18/11/2004, 11h40
  5. Réponses: 4
    Dernier message: 04/07/2003, 19h13

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