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 :

Détection Windows 32bits/64bits


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Détection Windows 32bits/64bits
    Bonjour.
    (précision : j'ai très peu d'expérience en C++)

    Je bosse sur un petit programme et lors du premier lancement de celui-ci, il recueille un certain nombre d'informations sur la machine de l'utilisateur (Version de Windows, Matériel...). J'étais en train d'écrire un petit code sur la détection de la version de Windows. Je découvre en même temps les fonctions de windows.h et l'aide MSDN.

    Au début, pour la détection de la version de Windows, j'étais parti sur GetVersionEx() qui renvera toutes les informations dans une structure OSVERSIONINFOEX (plusieurs exemples existent sur le web). Et ensuite avec des "if" et divers tests on finit par obtenir le nom de la version. J'ai cependant quelques questions :


    1) Quelle est la différence entre GetVersionEx() et GetVersion() et en général entre les "Ex" et les "sans Ex" ? Laquelle vaut-il mieux utiliser et pourquoi ?

    2) En cherchant un peu j'ai trouvé une fonction IsOs() qui à première vue permettrait de faire le travail plus rapidement qu'avec GetVersionEx(). Seulement aucun des exemples trouvés sur le net n'utilisent cette fonction alors c'est quoi le hic ?

    3) Ah oui y'a aussi un truc qui me "dérange" : dans la doc de IsOs() on lit "Minimum supported client : Windows 2000" alors que c'est sensé pouvoir tester "OS_WIN98_GOLD : The program is running on Windows 98 exactly." Y'a pas comme un problème ? Comment le programme pourrait être en train de tourner sur Windows 98 si la fonction n'est utilisable qu'à partir de Windows 2000 ?


    Et enfin :
    4) N'y aurait-il pas une petite fonction qui me dise directement si le système est 32 ou 64 bits ? (j'ai pas trouvé)


    Voilà, merci beaucoup


    EDIT : Ah oui une dernière question : que se passera-t-il si un utilisateur sous Windows 2000 lance mon programme et que celui-ci contient une fonction indiqué sur MSDN comme : "Minimum supported client : Windows XP" : le programme plantera lamentablement ou la fonction ne sera pas exécutée ?

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    En général, les versions Ex sont des versions "Extended". Elles sont là à cause de l'historique.

    Par exemple, microsoft a fait une fonction GetVersion(..), puis se rend compte qu'en fait, il faudrait un paramètre supplémentaire, ou que la structure renvoyée ne contient pas assez d'informations. Microsoft va alors rajouter une nouvelle fonction GetVersionEx(..), qui correspond au nouveau besoin, et qui permet de ne pas casser tous les programmes utilisant l'ancienne.

    Mis à part si la fonction sans le -Ex est marqué "deprecated", tu peux utiliser celle que tu veux, mais en général, c'est la fonction Ex dont tu as besoin (il y a une raison au fait qu'elle ait été rajoutée ).

    3) Ah oui y'a aussi un truc qui me "dérange" : dans la doc de IsOs() on lit "Minimum supported client : Windows 2000" alors que c'est sensé pouvoir tester "OS_WIN98_GOLD : The program is running on Windows 98 exactly." Y'a pas comme un problème ? Comment le programme pourrait être en train de tourner sur Windows 98 si la fonction n'est utilisable qu'à partir de Windows 2000 ?
    Ces énumérations sont souvent partagées par d'autres fonctions, qui elles tourneraient sur l'os en question. C'est logique de l'avoir prévu, en tout cas .

    que se passera-t-il si un utilisateur sous Windows 2000 lance mon programme et que celui-ci contient une fonction indiqué sur MSDN comme : "Minimum supported client : Windows XP" : le programme plantera lamentablement ou la fonction ne sera pas exécutée ?
    De mémoire, tu peux faire en sorte que ça plante dès la compilation, dans les options du projet visual, tu peux spécifier la version mini de windows pour laquelle tu veux que ton programme tourne. Ensuite, il me semble que le programme compilé commence par vérifier que la version de windows sur laquelle il est exécuté est >= ce pourquoi il a été compilé. Mais n'espère en aucun cas que la fonction sera simplement ignorée.

    4) N'y aurait-il pas une petite fonction qui me dise directement si le système est 32 ou 64 bits ? (j'ai pas trouvé)
    Pas à ma connaissance, hélas.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Kaluza Voir le message
    4) N'y aurait-il pas une petite fonction qui me dise directement si le système est 32 ou 64 bits ? (j'ai pas trouvé)
    En supposant que ton process lui-même soit 32 bits, tu peux utiliser la fonction IsWow64Process().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ce genre de chose, ça se détecte pas plutôt à la compilation ?
    Boost ftw

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À la compilation, tu peux détecter si tu compiles une application 32 bits ou une application 64 bits. Mais vu qu'une application 32 bits peut tourner sous Win64...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Kaluza Voir le message
    3) Ah oui y'a aussi un truc qui me "dérange" : dans la doc de IsOs() on lit "Minimum supported client : Windows 2000" alors que c'est sensé pouvoir tester "OS_WIN98_GOLD : The program is running on Windows 98 exactly." Y'a pas comme un problème ? Comment le programme pourrait être en train de tourner sur Windows 98 si la fonction n'est utilisable qu'à partir de Windows 2000 ?
    C'est peut être aussi lié au fait que Win98 n'est plus supporté par MS. Par exemple ils disent aussi que le systeme minimum pour la fonction CreateFile est Win2000, alors qu'elle existe depuis le premier NT ainsi que Win95 au moins.

    Si tu dois supporter Win98, je t'invite à tester ton logiciel sous cet "OS", car par exemple la fonction IsWow64Process() ne sera surement pas dispo dessus et donc tu auras une belle erreur au lancement de ton exe.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Extrait du Windows 7 Training Kit :
    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
    // Check minimum OS requirement
    // This function returns TRUE if OS is XP SP2 or later // (for example Windows Vista, Windows 7)
    BOOL TestMinimumOSRequirement() 
    {
    OSVERSIONINFOEX osvi;
    DWORDLONG dwlConditionMask = 0;
    int op=VER_GREATER_EQUAL;
     
    // Initialize the OSVERSIONINFOEX structure.
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osvi.dwMajorVersion = 5;
    osvi.dwMinorVersion = 1; // Windows XP
    osvi.wServicePackMajor = 2; // Service Pack 2
    osvi.wServicePackMinor = 0;
     
    // Initialize the condition mask.
    VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, op );
    VER_SET_CONDITION( dwlConditionMask, VER_MINORVERSION, op );
    VER_SET_CONDITION( dwlConditionMask, VER_SERVICEPACKMAJOR, op );
    VER_SET_CONDITION( dwlConditionMask, VER_SERVICEPACKMINOR, op );
     
    // Perform the test.
    return VerifyVersionInfo(
    &osvi, 
    VER_MAJORVERSION | VER_MINORVERSION | 
    VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
    dwlConditionMask);
    }

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/03/2011, 20h35
  2. Variable environnement Windows 32bit et 64bit
    Par Skyline-gtr dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/06/2009, 20h09
  3. Variable environnement Windows 32bit et 64bit
    Par Skyline-gtr dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 11/06/2009, 20h38
  4. debian etch, passer de 32bit à 64bit
    Par djibril dans le forum Administration système
    Réponses: 19
    Dernier message: 25/01/2008, 23h31
  5. [General] Détection Window-manager
    Par vdemeester dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 15/09/2007, 12h38

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