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

Langage Delphi Discussion :

[D7] Savoir si la version de Windows est en 64bits ou 32bits


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut [D7] Savoir si la version de Windows est en 64bits ou 32bits
    Bonjour,

    Voilà, tout est dans la question.
    Quelque soit l'OS (Vista ou XP), je veux juste savoir s'il est en 64 ou 32 bits
    (je me fout du nombre de bits du processeur).

    J'ai pas mal cherché, et rien ne me semblait vraiment me retourner ce booléen.
    Y a bien des trucs qui renvoient un max d'informations sur le PC, mais je ne suis même pas sur de trouver cette valeur dans la foultitude retournée... En plus, ça m'embête d'utiliser un composant pour ça.

    Avez vous une idée ?

    Mzerci d'avance.
    David.

  2. #2
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Salut
    Si c'est la version de Windows que tu veux détecter, alors utilises Win32PlatForm.

    Mais j'ai peut-être mal compris la question.

  3. #3
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Bonjour Defluc,

    Merci pour ta participation.

    Oui, j'ai bien vu cette variable, seulement, que ce soit sur un XP 64, un XP 32 ou un 2000, elle me retourne 2.
    Je pense qu'elle sert juste à savoir si c'est un 9X ou un NT (je me trompe ?).

    J'ai vu qu'il y avait la variable isWow64... Ca a l'air de correspondre, mais je me demande si c'est fiable à 100%.
    En fait, ça veut dire que le système est capable d'executer des exe en 64... Est ce qu'il n'y a pas des patchs (ou trucs comme ça) sur un 32 qui permet de faire ce genre de chose ?
    David.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 681
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 681
    Points : 13 087
    Points
    13 087
    Par défaut
    Sous x64, il y a une redirection des clés de la base des registres pour les applications 32 bits sous:
    HKEY_LOCAL_MACHINE\Software\WOW6432node

    La présence de cette clé est déjà une indication.

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut


    un fonction que j'ai récupérer sur le net


    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
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
     
    uses Windows, SysUtils;
     
    // basée sur le code de
    // http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx
     
    function GetWindowsVersion: string;
    type
      TGNSI = procedure(var lpSystemInfo: TSystemInfo); stdcall;
      TGPI = function(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; var pdwReturnedProductType: DWORD): BOOL; stdcall;
     
      _OSVERSIONINFOEX = record
        dwOSVersionInfoSize: DWORD;
        dwMajorVersion: DWORD;
        dwMinorVersion: DWORD;
        dwBuildNumber: DWORD;
        dwPlatformId: DWORD;
        szCSDVersion: array[0..127] of AnsiChar;
        wServicePackMajor: WORD;
        wServicePackMinor: WORD;
        wSuiteMask: WORD;
        wProductType: BYTE;
        wReserved: BYTE;
      end;
     
    const
      // wSuiteMask
      VER_SUITE_SMALLBUSINESS = $1;
      VER_SUITE_ENTERPRISE = $2;
      VER_SUITE_BACKOFFICE = $4;
      VER_SUITE_COMMUNICATIONS = $8;
      VER_SUITE_TERMINAL = $10;
      VER_SUITE_SMALLBUSINESS_RESTRICTED = $20;
      VER_SUITE_EMBEDDEDNT = $40;
      VER_SUITE_DATACENTER = $80;
      VER_SUITE_SINGLEUSERTS = $100;
      VER_SUITE_PERSONAL = $200;
      VER_SUITE_BLADE = $400;
      VER_SUITE_WH_SERVER = $800;
      VER_SUITE_STORAGE_SERVER = $2000;
      VER_SUITE_COMPUTE_SERVER = $4000;
      // wProductType
      VER_NT_WORKSTATION = $1;
      VER_NT_DOMAIN_CONTROLLER = $2;
      VER_NT_SERVER = $3;
     
      PRODUCT_BUSINESS = $6; // Business
      PRODUCT_BUSINESS_N = $10; // Business N
      PRODUCT_CLUSTER_SERVER = $12; // HPC Edition
      PRODUCT_DATACENTER_SERVER = $8; // Server Datacenter (full installation)
      PRODUCT_DATACENTER_SERVER_CORE = $C; // Server Datacenter (core installation)
      PRODUCT_DATACENTER_SERVER_CORE_V = $27; // Server Datacenter without Hyper-V (core installation)
      PRODUCT_DATACENTER_SERVER_V = $25; // Server Datacenter without Hyper-V (full installation)
      PRODUCT_ENTERPRISE = $4; // Enterprise
      PRODUCT_ENTERPRISE_N = $1B; // Enterprise N
      PRODUCT_ENTERPRISE_SERVER = $A; // Server Enterprise (full installation)
      PRODUCT_ENTERPRISE_SERVER_CORE = $E; // Server Enterprise (core installation)
      PRODUCT_ENTERPRISE_SERVER_CORE_V = $29; // Server Enterprise without Hyper-V (core installation)
      PRODUCT_ENTERPRISE_SERVER_IA64 = $F; // Server Enterprise for Itanium-based Systems
      PRODUCT_ENTERPRISE_SERVER_V = $26; // Server Enterprise without Hyper-V (full installation)
      PRODUCT_HOME_BASIC = $2; // Home Basic
      PRODUCT_HOME_BASIC_N = $5; // Home Basic N
      PRODUCT_HOME_PREMIUM = $3; // Home Premium
      PRODUCT_HOME_PREMIUM_N = $1A; // Home Premium N
      PRODUCT_HYPERV = $2A; // Server Hyper-V
      PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT = $1E; // Windows Essential Business Server Management Server
      PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING = $20; // Windows Essential Business Server Messaging Server
      PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY = $1F; // Windows Essential Business Server Security Server
      PRODUCT_SERVER_FOR_SMALLBUSINESS = $18; // Windows Server 2008 for Windows Essential Server Solutions
      PRODUCT_SERVER_FOR_SMALLBUSINESS_V = $23; // Windows Server 2008 without Hyper-V for Windows Essential Server Solutions
      PRODUCT_SMALLBUSINESS_SERVER = $9; // Windows Small Business Server
      PRODUCT_SMALLBUSINESS_SERVER_PREMIUM = $19;
      PRODUCT_STANDARD_SERVER = $7; // Server Standard (full installation)
      PRODUCT_STANDARD_SERVER_CORE = $D; // Server Standard (core installation)
      PRODUCT_STANDARD_SERVER_CORE_V = $28; // Server Standard without Hyper-V (core installation)
      PRODUCT_STANDARD_SERVER_V = $24; // Server Standard without Hyper-V (full installation)
      PRODUCT_STARTER = $B; // Starter
      PRODUCT_STORAGE_ENTERPRISE_SERVER = $17; // Storage Server Enterprise
      PRODUCT_STORAGE_EXPRESS_SERVER = $14; // Storage Server Express
      PRODUCT_STORAGE_STANDARD_SERVER = $15; // Storage Server Standard
      PRODUCT_STORAGE_WORKGROUP_SERVER = $16; // Storage Server Workgroup
      PRODUCT_UNDEFINED = $0; // An unknown product
      PRODUCT_ULTIMATE = $1; // Ultimate
      PRODUCT_ULTIMATE_N = $1C; // Ultimate N
      PRODUCT_WEB_SERVER = $11; // Web Server (full installation)
      PRODUCT_WEB_SERVER_CORE = $1D; // Web Server (core installation)
     
      SM_SERVERR2 = 89;
      PROCESSOR_ARCHITECTURE_INTEL = 0;
      PROCESSOR_ARCHITECTURE_IA64 = 6;
      PROCESSOR_ARCHITECTURE_AMD64 = 9;
     
      BUFSIZE = 80;
    var
      OSVERSIONINFOEX: _OSVERSIONINFOEX;
      OSVERSIONINFO: _OSVERSIONINFO absolute OSVERSIONINFOEX;
      si: SYSTEM_INFO;
      pGNSI: TGNSI;
      pGPI: TGPI;
      bOsVersionInfoEx: Boolean;
      hdlKey: HKEY;
      lRet: LONGINT;
      szProductType: array[0..Pred(BUFSIZE)] of Char;
      dwBufLen, dwType: DWORD;
    begin
      Result := '';
      // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
      // If that fails, try using the OSVERSIONINFO structure.
      ZeroMemory(@si, sizeof(SYSTEM_INFO));
      ZeroMemory(@OSVERSIONINFO, sizeof(_OSVERSIONINFOEX));
      OSVERSIONINFO.dwOSVersionInfoSize := sizeof(_OSVERSIONINFOEX);
      bOsVersionInfoEx := GetVersionEx(OSVERSIONINFO);
      if not bOsVersionInfoEx then
      begin
        OSVERSIONINFO.dwOSVersionInfoSize := sizeof(_OSVERSIONINFO);
        if not GetVersionEx(OSVERSIONINFO) then Exit;
      end;
     
      // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
      pGNSI := GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetNativeSystemInfo');
      if Assigned(pGNSI) then
        pGNSI(si)
      else
        GetSystemInfo(si);
     
      case OSVERSIONINFO.dwPlatformId of
        // Test for the Windows NT product family.
        VER_PLATFORM_WIN32_NT:
          begin
            // Test for the specific product family.
            Result := 'Unknown Windows';
            if (OSVERSIONINFO.dwMajorVersion = 6) and (OSVERSIONINFO.dwMinorVersion = 0) then
            begin
              if (OSVERSIONINFOEX.wProductType = VER_NT_WORKSTATION) then
                Result := 'Windows Vista'
              else
                Result := 'Windows Server 2008';
     
              pGPI := GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetProductInfo');
              pGPI(6, 0, 0, 0, dwType);
     
              case dwType of
                PRODUCT_ULTIMATE: Result := Result + ' Ultimate Edition';
                PRODUCT_HOME_PREMIUM: Result := Result + ' Home Premium Edition';
                PRODUCT_HOME_BASIC: Result := Result + ' Home Basic Edition';
                PRODUCT_ENTERPRISE: Result := Result + ' Enterprise Edition';
                PRODUCT_BUSINESS: Result := Result + ' Business Edition';
                PRODUCT_STARTER: Result := Result + ' Starter Edition';
                PRODUCT_CLUSTER_SERVER: Result := Result + ' Cluster Server Edition';
                PRODUCT_DATACENTER_SERVER: Result := Result + ' Datacenter Edition';
                PRODUCT_DATACENTER_SERVER_CORE: Result := Result + ' Datacenter Edition (core installation)';
                PRODUCT_ENTERPRISE_SERVER: Result := Result + ' Enterprise Edition';
                PRODUCT_ENTERPRISE_SERVER_CORE: Result := Result + ' Enterprise Edition (core installation)';
                PRODUCT_ENTERPRISE_SERVER_IA64: Result := Result + ' Enterprise Edition for Itanium-based Systems';
                PRODUCT_SMALLBUSINESS_SERVER: Result := Result + ' Small Business Server';
                PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: Result := Result + ' Small Business Server Premium Edition';
                PRODUCT_STANDARD_SERVER: Result := Result + ' Standard Edition';
                PRODUCT_STANDARD_SERVER_CORE: Result := Result + ' Standard Edition (core installation)';
                PRODUCT_WEB_SERVER: Result := Result + ' Web Server Edition';
              end;
     
              if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) then
                Result := Result + ', 64-bit'
              else if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL) then
                Result := Result + ', 32-bit';
            end;
            if (OSVERSIONINFO.dwMajorVersion = 5) and (OSVERSIONINFO.dwMinorVersion = 2) then
            begin
              if (GetSystemMetrics(SM_SERVERR2) <> 0) then
                Result := 'Windows Server 2003 R2, '
              else if (OSVERSIONINFOEX.wSuiteMask = VER_SUITE_STORAGE_SERVER) then
                Result := 'Windows Storage Server 2003'
              else if (OSVERSIONINFOEX.wSuiteMask = VER_SUITE_WH_SERVER) then
                Result := 'Windows Home Server'
              else if (OSVERSIONINFOEX.wProductType = VER_NT_WORKSTATION) and (
                si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) then
                Result := 'Windows XP Professional x64 Edition'
              else
                Result := 'Windows Server 2003, ';
     
              // Test for the server type.
              if (OSVERSIONINFOEX.wProductType <> VER_NT_WORKSTATION) then
              begin
                if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_IA64) then
                begin
                  if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_DATACENTER) <> 0 then
                    Result := Result + ' Datacenter Edition for Itanium-based Systems'
                  else if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_ENTERPRISE) <> 0 then
                    Result := Result + ' Enterprise Edition for Itanium-based Systems';
                end
                else if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) then
                begin
                  if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_DATACENTER) <> 0 then
                    Result := Result + ' Datacenter x64 Edition'
                  else if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_ENTERPRISE) <> 0 then
                    Result := Result + ' Enterprise x64 Edition'
                  else
                    Result := Result + ' Standard x64 Edition';
                end
                else
                begin
                  if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_COMPUTE_SERVER) <> 0 then
                    Result := Result + ' Compute Cluster Edition'
                  else if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_DATACENTER) <> 0 then
                    Result := Result + ' Datacenter Edition'
                  else if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_ENTERPRISE) <> 0 then
                    Result := Result + ' Enterprise Edition'
                  else if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_BLADE) <> 0 then
                    Result := Result + ' Web Edition'
                  else
                    Result := Result + ' Standard Edition';
                end
              end;
            end;
            if (OSVERSIONINFO.dwMajorVersion = 5) and (OSVERSIONINFO.dwMinorVersion = 1) then
            begin
              Result := 'Windows XP';
              if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_PERSONAL) <> 0 then
                Result := Result + ' Home Edition'
              else
                Result := Result + ' Professional';
            end;
     
            if (OSVERSIONINFO.dwMajorVersion = 5) and (OSVERSIONINFO.dwMinorVersion = 0) then
            begin
              Result := 'Windows 2000';
     
              if (OSVERSIONINFOEX.wProductType = VER_NT_WORKSTATION) then
                Result := Result + ' Professional'
              else
              begin
                if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_DATACENTER) <> 0 then
                  Result := Result + ' Datacenter Server'
                else if (OSVERSIONINFOEX.wSuiteMask and VER_SUITE_ENTERPRISE) <> 0 then
                  Result := Result + ' Advanced Server'
                else
                  Result := Result + ' Server';
              end;
            end;
     
            if (OSVERSIONINFO.dwMajorVersion <= 4) then
            begin
              Result := 'Windows NT';
              // Test for specific product on Windows NT 4.0 SP6 and later.
              if bOsVersionInfoEx then
              begin
                // Test for the workstation type.
                if (OSVERSIONINFOEX.wProductType = VER_NT_WORKSTATION) and (si.wProcessorArchitecture <> PROCESSOR_ARCHITECTURE_AMD64) then
                  Result := Result + ' Workstation 4.0'
                    // Test for the server type.
                else if (OSVERSIONINFOEX.wProductType = VER_NT_SERVER) or (OSVERSIONINFOEX.wProductType = VER_NT_DOMAIN_CONTROLLER) then
                begin
                  if Bool(OSVERSIONINFOEX.wSuiteMask and VER_SUITE_ENTERPRISE) then
                    Result := Result + ' Server 4.0, Enterprise Edition'
                  else
                    Result := Result + ' Server';
                end
              end
              else
              begin // Test for specific product on Windows NT 4.0 SP5 and earlier
                dwBufLen := BUFSIZE;
                lRet := RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\ProductOptions', 0, KEY_QUERY_VALUE, hdlKey);
                if (lRet <> ERROR_SUCCESS) then Exit;
                lRet := RegQueryValueEx(hdlKey, 'ProductType', nil, nil, @szProductType[1], @dwBufLen);
                if ((lRet <> ERROR_SUCCESS) or (dwBufLen > BUFSIZE)) then Exit;
                RegCloseKey(hdlKey);
                if (lstrcmpi('WINNT', szProductType) = 0) then Result := Result + ' Workstation';
                if (lstrcmpi('LANMANNT', szProductType) = 0) then Result := Result + ' Server';
                if (lstrcmpi('SERVERNT', szProductType) = 0) then Result := Result + ' Advanced Server';
                Result := Result + Format(' %d.%d', [OSVERSIONINFO.dwMajorVersion, OSVERSIONINFO.dwMinorVersion]);
              end;
            end;
            // Display service pack (if any) and build number.
            if (OSVERSIONINFO.dwMajorVersion = 4) and (lstrcmpi(OSVERSIONINFO.szCSDVersion, 'Service Pack 6') = 0) then
            begin
              // Test for SP6 versus SP6a.
              lRet := RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\Q246009', 0, KEY_QUERY_VALUE, hdlKey);
              if (lRet = ERROR_SUCCESS) then
                Result := Result + Format(' Service Pack 6a (Build %d)', [OSVERSIONINFO.dwBuildNumber and $FFFF])
              else // Windows NT 4.0 prior to SP6a
                Result := Result + Format(' %s (Build %d)', [OSVERSIONINFO.szCSDVersion, OSVERSIONINFO.dwBuildNumber and $FFFF]);
              RegCloseKey(hdlKey);
            end
            else
            begin
              Result := Result + Format(' %s (Build %d)', [OSVERSIONINFO.szCSDVersion, OSVERSIONINFO.dwBuildNumber and $FFFF]);
            end;
          end;
        // Test for the Windows 95 product family.
        VER_PLATFORM_WIN32_WINDOWS:
          begin
            if (OSVERSIONINFO.dwMajorVersion = 4) and (OSVERSIONINFO.dwMinorVersion = 0) then
            begin
              Result := 'Windows 95';
              if (OSVERSIONINFO.szCSDVersion[1] = 'C') or (OSVERSIONINFO.szCSDVersion[1] = 'B') then
                Result := Result + ' OSR2';
            end;
            if (OSVERSIONINFO.dwMajorVersion = 4) and (OSVERSIONINFO.dwMinorVersion = 10) then
            begin
              Result := 'Windows 98';
              if (OSVERSIONINFO.szCSDVersion[1] = 'A') then
                Result := Result + ' SE';
            end;
            if (OSVERSIONINFO.dwMajorVersion = 4) and (OSVERSIONINFO.dwMinorVersion = 90) then
              Result := 'Windows ME';
          end;
        VER_PLATFORM_WIN32s:
          Result := 'Windows Win32s';
      end;
    end;
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199

  7. #7
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Bonjour anapurna et Andnotor,

    En effet, j'ai vu les prémices de ce code dans la FAQ... Mais il n'y avait pas la notion de 32/64 bits d'intégrée... C'est une version plus évoluée.
    (par contre defluc, dans ton lien, à aucun moment ils ne parlent de 64 bits)

    Je me demande juste si cette solution est valable dans le temps... Si il y a un nouveau proc ou une nouvelle version de Windows qui sort, c'est périmé, nan ?

    Ta solution a l'air plus fiable, Andnotor... C'est juste dommage qu'il faille aller dans la base.

    Moi qui m'attendait à une variable booléenne à récupérer...

    Sinon, que pensez vous de la variable isWow64 ?
    (je joint un exe qui vous permettra d'avoir un max d'info sur votre PC... Vous est-il possible de tester si cette variable n'est à vrai que sur un 64)

    Je vais faire quelques tests avant de mettre "résolu".
    Merci à vous tous.
    David.

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 681
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 681
    Points : 13 087
    Points
    13 087
    Par défaut
    D'après ce que je lit sur msdn, isWow64 renvoi TRUE uniquement s'il s'agit d'un application Win32 tournant sur X64. Une Application 64 bits renvoi FALSE.

    Par contre, comme le montre le code proposé par anapurna, GetNativeSystemInfo semble être la solution.

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

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    de la meme sources

    Les versions de Windows compatibles x64 ne contiennent pas beaucoup d'API réellement nouvelles ; la plupart des nouvelles API Win64 ont été ajoutées aux versions Windows destinées aux processeurs Itanium. Pour faire court, les deux API importantes sont IsWow64Process et GetNativeSystemInfo. Elles permettent aux applications Win32 de déterminer si elles s'exécutent sous Win64 et, si tel est le cas, les possibilités réelles du système. Sinon, un processus 32 bits qui appelle GetSystemInfo voit les possibilités du système comme s'il s'agissait d'un système 32 bits. Par exemple, GetSystemInfo peut uniquement utiliser la plage d'adresses des processus 32 bits. La figure 4 illustre les API qui n'étaient pas disponibles précédemment sur x86, mais qui sont disponibles pour x64.
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  10. #10
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Hop, voici du tout prémaché et surtout autonome:

    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
    function IsWin64: Boolean;
    var
      KernelModule: HMODULE;
      GetNativeSystemInfoFunc: procedure(var lpSystemInfo: TSystemInfo); stdcall;
      IsWow64ProcessFunc: function(hProcess: THandle; var Wow64Process: BOOL): BOOL; stdcall;
      Wow64Process: BOOL;
      SysInfo: TSystemInfo;
     
      function AreFsRedirectionFunctionsAvailable: Boolean;
      var
        Wow64DisableWow64FsRedirectionFunc: function(var OldValue: Pointer): BOOL; stdcall;
        Wow64RevertWow64FsRedirectionFunc: function(OldValue: Pointer): BOOL; stdcall;
      begin
        Wow64DisableWow64FsRedirectionFunc := GetProcAddress(GetModuleHandle(kernel32), 'Wow64DisableWow64FsRedirection');
        Wow64RevertWow64FsRedirectionFunc := GetProcAddress(GetModuleHandle(kernel32), 'Wow64RevertWow64FsRedirection');
        Result := Assigned(Wow64DisableWow64FsRedirectionFunc) and Assigned(Wow64RevertWow64FsRedirectionFunc);
      end;
     
    begin
      { Le systeme est considéré comme "Win64" si toutes ces conditions sont respectées:
        1. GetNativeSystemInfo est valide.
        2. IsWow64Process est valide et returne vrai pour ce processus.
        3. Wow64DisableWow64FsRedirection est valide.
        4. Wow64RevertWow64FsRedirection est valide.
        5. GetSystemWow64DirectoryA est valide.
        6. RegDeleteKeyExA est valide. // }
      Result := False;
      KernelModule := GetModuleHandle(kernel32);
      GetNativeSystemInfoFunc := GetProcAddress(KernelModule, 'GetNativeSystemInfo');
      if Assigned(GetNativeSystemInfoFunc) then begin
        GetNativeSystemInfoFunc(SysInfo);
        IsWow64ProcessFunc := GetProcAddress(KernelModule, 'IsWow64Process');
        if Assigned(IsWow64ProcessFunc) and IsWow64ProcessFunc(GetCurrentProcess, Wow64Process) and Wow64Process then begin
          if AreFsRedirectionFunctionsAvailable and (GetProcAddress(KernelModule, 'GetSystemWow64DirectoryA') <> nil) and (GetProcAddress(GetModuleHandle(advapi32), 'RegDeleteKeyExA') <> nil) then
            Result := True;
        end;
      end;
      FreeLibrary(KernelModule);
    end;
    ... Par contre, je ne peux pas le tester car je n'ai pas de WIN 64 sous la main....
    Est ce que quelqu'un qui a ça peut me dire si ca fonctionne ?

    Merci d'avance.

    David.
    David.

  11. #11
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    euh juste une question vu qu'un système 64bits est capable d'adressé 64 bits de mémoire, le fait de faire un sizeof sur une variable qui pointe sur un objet devrait renvoyer 8 non ?

    Et 4 sur un système 32 bits

  12. #12
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Gao,
    Citation Envoyé par rvzip64 Voir le message
    euh juste une question vu qu'un système 64bits est capable d'adressé 64 bits de mémoire, le fait de faire un sizeof sur une variable qui pointe sur un objet devrait renvoyer 8 non ?

    Et 4 sur un système 32 bits
    Non, si ton application est 32 bits, elle continue à utiliser les tailles du 32 bits (ce qui paraît normal ).
    Si les cons volaient, il ferait nuit à midi.

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Meo,
    Citation Envoyé par dacid Voir le message
    Hop, voici du tout prémaché et surtout autonome:


    ... Par contre, je ne peux pas le tester car je n'ai pas de WIN 64 sous la main....
    Est ce que quelqu'un qui a ça peut me dire si ca fonctionne ?

    Merci d'avance.

    David.
    Testé et OK sur Vista 64, Delphi 2007.
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut Petite fonction cherche gros système 64bits pour courts ébats ;-)
    Bonjour rvzip64,

    C'est vrai qu'un solution de ce type aurait été appréciée car largement moins lourde.. dommage.

    Bonjour droggo,

    Merci, c'est extra...
    Manque plus qu'une petite validation sur XP64, et l'affaire est dans le sac.

    Y aurait-il quelqu'un qui à ça ?
    David.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par dacid Voir le message
    Merci, c'est extra...
    Manque plus qu'une petite validation sur XP64, et l'affaire est dans le sac.

    Y aurait-il quelqu'un qui à ça ?
    Bonjour,

    Merci pour cette fonction, j'aurais vraiment eu du mal à déterminer si x64 ou pas :s (par contre je ne peux rien ajouter concernant XP64, je n'ai pas la possibilité de tester pour l'instant).

    C'est quand même étrange, j'ai une appli Delphi 2007 qui ne veut pas fonctionner correctement sur Vista 64 bits.

    Faut dire que mon programme est basé sur "l'alignement" (ReadProcessMemory etc...), les utilisateurs me remontent des bugs aléatoires :/
    Un jour c'est une fonction qui déconne, le lendemain c'est une autre, etc.

    Du coup maintenant c'est if IsWin64 then au revoir :/

    Dommage que je ne comprenne pas le pourquoi du comment.

  16. #16
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Bonjour Alekhine,

    As tu essayé d'utiliser le module de compatibilité de Windows ?

    Sinon, c'est p-e un appel dans ton code qui fait planter ton appli... Crée un post.

    David.
    David.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par dacid Voir le message
    Bonjour Alekhine,

    As tu essayé d'utiliser le module de compatibilité de Windows ?

    Sinon, c'est p-e un appel dans ton code qui fait planter ton appli... Crée un post.

    David.
    Bonjour,

    "Le module de compatibilité Windows ?" oops, je ne vois pas de quoi tu parles, sauf peut-être une option d'exécution sur Vista 64 ?

    En fait je ne peux pas tester puisque je n'ai pas Vista 64 à porté de la main.
    C'est en centralisant les retours de bugs que j'ai constaté que 99% des problèmes survenaient sur Vista 64bits :/
    En fait c'est même pas des bugs puisqu'il existe toujours un problème mais il est différent chaque jour. Je n'ai rien dans le log Mad-Except, pas d'exception levée, mais des lectures incohérentes avec ReadProcessMemory (je ne trouve pas ce que je trouve sur les autres OS 32 bits).
    Le fait que le problème soit différent à chaque fois me laisse penser que le programme que je scan n'est pas toujours charger avec le même "alignement" sur Vista 64 bits.

    J'ai un doute sur un composant que je dois mettre à jour, mais il coûte quelques euros ^^ faut que j'attende un peu lol

    Si vraiment après ça je ne trouve pas de solution, j'ouvrirais un post (j'en ai déjà ouvert 2 la semaine dernière, faudrait pas abuser ^^ )

    Alek.

  18. #18
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Sur ton fichier exe, tu fais: "Click droit / Propriétés / onglet Compatibilité /".
    Mais si t'as pas vista 64 à portée de main...
    David.

  19. #19
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Coa,
    Citation Envoyé par dacid Voir le message
    Manque plus qu'une petite validation sur XP64, et l'affaire est dans le sac.
    Je viens de tester sur XP64, Delphi 2007. C'est Ok.
    Si les cons volaient, il ferait nuit à midi.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par dacid Voir le message
    Sur ton fichier exe, tu fais: "Click droit / Propriétés / onglet Compatibilité /".
    Mais si t'as pas vista 64 à portée de main...
    Ahhh okay ! ils peuvent "forcer" la compatibilité 32 bits ?

    je ne savais pas ça, jamais vu Vista :o
    J'ai déjà eu du mal à leur expliquer le coup du "Run as admnistrator" sans jamais l'avoir vu lol (Vista parano tssss)

    Merci en tout cas, je vais faire une version de test sans ta fonction pour qu'un gars puisse essayer ton astuce dans les propriétés du raccouci.

    Alek.

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

Discussions similaires

  1. Savoir quelle version de windows (XP, Seven 32b, Seven 64b)
    Par Jean-Pierre49 dans le forum Contribuez
    Réponses: 4
    Dernier message: 17/06/2017, 16h58
  2. Savoir si un service windows est demarré
    Par kam81 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 29/03/2010, 14h26
  3. Réponses: 9
    Dernier message: 04/02/2010, 18h45
  4. Réponses: 9
    Dernier message: 04/02/2010, 18h45
  5. Réponses: 12
    Dernier message: 11/02/2009, 14h15

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