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

API, COM et SDKs Delphi Discussion :

Détecter la version 32/64 bits de Windows sous Delphi


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 19
    Par défaut Détecter la version 32/64 bits de Windows sous Delphi
    Voilà le problème que j'essaie de résoudre:

    J'ai un programme qui tourne sous Delphi et qui fait appel parfois à un programme externe (.exe) qui ne fonctionne que sur une version 32 bits de Windows.
    Je voudrais faire un test pour détecter la version 32/64 bits sur laquelle tourne mon programme afin de ne pas avoir un message d'erreur au lancement du programme externe.

    La solution se trouve peut-être dans l'unité System ? Mais où ? Quelle fonction ?
    Promis j'ai cherché dans les FAQ, les sources, etc... avant de vous solliciter !

    Merci tout plein de votre aide.
    Moustache

  2. #2
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    J'ai trouvé ça (pas testé):
    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
    function IsWOW64: Boolean;
    type
      TIsWow64Process = function(
        Handle: THandle;
        var Res: BOOL
      ): BOOL; stdcall;
    var
      IsWow64Result: BOOL;
      IsWow64Process: TIsWow64Process;
    begin
      IsWow64Process := GetProcAddress(GetModuleHandle('kernel32'), 'IsWow64Process');
      if Assigned(IsWow64Process) then
      begin
        if not IsWow64Process(GetCurrentProcess, IsWow64Result) then
          raise Exception.Create('Bad process handle');
        Result := IsWow64Result;
      end
      else
        Result := False;
    end;
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    A pointer to a value that is set to TRUE if the process is running under WOW64. If the process is running under 32-bit Windows, the value is set to FALSE. If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.
    Attention IsWow64Process indique qu'un process 32Bit tourne via Wow64 donc Win32 On Win64

    Si c'est en Wow64, alors utilise GetNativeSystemInfo et wProcessorArchitecture pour connaitre quelques infos de plus
    En dehors de Wow64, utilise GetSystemInfo

    Si tu veux savoir si on process est compilé en 64Bits, tu peut regarder la taille de pointer = 4 ou 8

    Tu peux aussi prévoir du code selon $IFDEF WIN32 ou $IFDEF WIN64
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 171
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Avec tout ça, moi je ne connais toujours pas la réponse.

    Voici ce que j'avais trouvé de mon côté. Je ne sais pas si c'est vraiment exploitable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    program Test;
     
    {$APPTYPE CONSOLE}
     
    uses
      Environment;
    // http://castelain.developpez.com/articles/VariablesEnvironnement/
     
    begin
      WriteLn(GetCurrentProcessEnvVar('OS')); // Windows_NT
      WriteLn(GetCurrentProcessEnvVar('PROCESSOR_ARCHITECTURE')); // x86
      WriteLn(GetCurrentProcessEnvVar('PROCESSOR_IDENTIFIER')); // AMD64 Family 22 Model 0 Stepping1, AuthenticAMD
      ReadLn;
    end.

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 171
    Billets dans le blog
    9
    Par défaut
    Donc je pensais à quelque chose comme ça.

    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
    program Test2;
     
    {$APPTYPE CONSOLE}
     
    uses
      Environment;
    // http://castelain.developpez.com/articles/VariablesEnvironnement/
     
    var
      processorId: string;
      processor64: boolean;
     
    begin
      processorId := GetCurrentProcessEnvVar('PROCESSOR_IDENTIFIER');
      processor64 := Pos('64', processorId) > 0;
      WriteLn(processor64); // TRUE
      ReadLn;
    end.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Avec tout ça, moi je ne connais toujours pas la réponse.
    faut bien laisser chercher un peu !
    C'est plus bien intéressant ! non ?


    La MSDN au sujet de wProcessorArchitecture :

    PROCESSOR_ARCHITECTURE_AMD64 = 9 : x64 (AMD or Intel)
    PROCESSOR_ARCHITECTURE_ARM = Reserved : ARM
    PROCESSOR_ARCHITECTURE_IA64 = 6 : Intel Itanium-based
    PROCESSOR_ARCHITECTURE_INTEL = 0 : x86
    PROCESSOR_ARCHITECTURE_UNKNOWN0 xffff : Unknown architecture.
    et WOW64 Implementation Details

    Environment variables

    64-bit process
    PROCESSOR_ARCHITECTURE=AMD64 or PROCESSOR_ARCHITECTURE=IA64

    32-bit process
    PROCESSOR_ARCHITECTURE=x86
    PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%

    Si ton poste, cela renvoi x86 !

    On peut penser que GetCurrentProcessEnvVar('PROCESSOR_ARCHITECTURE') ;
    est proche de GetSystemInfo SYSTEM_INFO.wProcessorArchitecture avec la valeur PROCESSOR_ARCHITECTURE_INTEL qui indique un x86 (émulé)
    GetSystemInfo = Valeur émulée

    On peut penser que GetCurrentProcessEnvVar('PROCESSOR_ARCHITEW6432') ;
    est proche de GetNativeSystemInfo SYSTEM_INFO.wProcessorArchitecture avec la valeur PROCESSOR_ARCHITECTURE_INTEL qui indique un AMD64 (réel)
    GetNativeSystemInfo = Valeur réelle si 'IsWow64Process' renvoie true


    D'ailleurs on voit bien x86 comme Archi alors que c'est un AMD64
    A Mon avis, tu fais tourner une Application 32 Bit sur un 64Bit

    La technique du 'PROCESSOR_IDENTIFIER' pourrait fonctionner avec AMD64 et Intel64
    Il ne doit pas exister bcp d'autres CPU sur le marché PC


    voir aussi sous CMD
    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo %OS%
    echo %PROCESSOR_ARCHITECTURE%
    echo %PROCESSOR_IDENTIFIER%

    Tu dois avoir une différence entre les echo et GetCurrentProcessEnvVar qui encapsule GetEnvironmentVariable dans une application Delphi 32Bit
    Car CMD est une application 64Bit donc variable Win64

    Pour un process 32Bit en Delphi 7 les Variables sont celles pour WoW64 !

    Il faudrait aussi consulter :

    Microsoft France - Aide et Support : Comment vérifier si l'ordinateur exécute un système d'exploitation 64 bits ou 32 bits.
    Qui consite à lire HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 171
    Billets dans le blog
    9
    Par défaut
    Merci pour ces explications, ShaiLeTroll. J'ai compris maintenant.

    Concernant les fonctions GetSystemInfo et GetNativeSystemInfo, il y a un exemple .

Discussions similaires

  1. Détecter la version de Windows installée
    Par DanielB dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/03/2015, 20h37
  2. Réponses: 25
    Dernier message: 27/01/2010, 12h43
  3. Réponses: 25
    Dernier message: 27/01/2010, 12h43
  4. Les versions 64-bits de Windows plus sûres que les 32-bits ?
    Par Gordon Fowler dans le forum Actualités
    Réponses: 9
    Dernier message: 23/11/2009, 20h45
  5. Version de Windows pour Delphi 8
    Par alainvh dans le forum EDI
    Réponses: 8
    Dernier message: 22/06/2004, 11h37

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