Page 1 sur 1

[PB4] Processus 32 Bits ou 64 Bits ?

Publié : mer. 05/juil./2006 9:14
par Flype
Microsoft Platform SDK :

Code : Tout sélectionner

// Requires Windows Vista or Windows XP.

#include <windows>

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);

LPFN_ISWOW64PROCESS 
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
GetModuleHandle("kernel32"),"IsWow64Process");
 
BOOL IsWow64()
{
    BOOL bIsWow64 = FALSE;
 
    if (NULL != fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
        {
            // handle error
        }
    }
    return bIsWow64;
}
Une traduction possible pour Purebasic 4.0 :

Code : Tout sélectionner

Procedure.l IsWow64() ; For PB4.0
  
  Protected bIsWow64.l = #False
  
  fnIsWow64Process = GetProcAddress_(GetModuleHandle_("kernel32"), "IsWow64Process")
  
  If fnIsWow64Process ; Windows XP +
    If Not CallFunctionFast(fnIsWow64Process, GetCurrentProcess_(), @bIsWow64)
      ; handle error
    EndIf
  EndIf
  
  ProcedureReturn bIsWow64
  
EndProcedure
Ou encore :

Code : Tout sélectionner

Prototype IsWow64Process(pid.l, *bResult)

Procedure.l IsWow64() ; For PB4.0
  
  Protected bIsWow64.l = #False
  
  fnIsWow64Process.IsWow64Process = GetProcAddress_(GetModuleHandle_("kernel32"), "IsWow64Process")
  
  If fnIsWow64Process ; Windows XP+
    If Not fnIsWow64Process(GetCurrentProcess_(), @bIsWow64)
      ; handle error
    EndIf
  EndIf
  
  ProcedureReturn bIsWow64
  
EndProcedure
ou un dernier (mais attention à ne l'exécuter que sous XP ou Vista:

Code : Tout sélectionner

Import "kernel32.lib"
  IsWow64Process(pid.l, *bResult)
EndImport

Procedure.l IsWow64()
  IsWow64Process(GetCurrentProcess_(), @bIsWow64.l)
  ProcedureReturn bIsWow64
EndProcedure




Renvoi #TRUE si l'OS est 64Bits, ou #FALSE s'il est 32bits.

Code : Tout sélectionner

If IsWow64()
  Debug "OS 64 bit !"
Else
  Debug "OS 32 bit !"
EndIf 

:wink:

Re: [PB4] Processus 32 Bits ou 64 Bits ?

Publié : ven. 17/juin/2011 16:45
par nico
IsWow64Process ne sert pas à connaitre si l'OS est 32 ou 64 bits mais il sert à savoir si un processus 32 bits s'exécute dans un environnement 64 bits
C'est pas du tout pareil

Pour savoir si l'OS est 32 ou 64 bits,il faut utiliser GetNativeSystemInfo

Re: [PB4] Processus 32 Bits ou 64 Bits ?

Publié : ven. 17/juin/2011 17:22
par Ar-S
On peut vérifier si dans le registre il existe

Code : Tout sélectionner

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node 
S'il n'existe pas ça doit être du 32bits.

Re: [PB4] Processus 32 Bits ou 64 Bits ?

Publié : sam. 18/juin/2011 9:20
par Jacobus
Avec les variables d'environnement ça doit être possible

Code : Tout sélectionner

;Détecter le type de plateforme d'après les variables d'environnement
;Sur 3 variables, on doit pouvoir s'en assurer
Procedure.l GetPlateforme6432()
; #PROCESSOR_ARCHITECTURE_INTEL = 0
; #PROCESSOR_ARCHITECTURE_IA64 = 6
; #PROCESSOR_ARCHITECTURE_AMD64 = 9
; #PROCESSOR_ARCHITECTURE_UNKNOWN = -1
PlateformeLevel = 0
If ExamineEnvironmentVariables()			  
		While NextEnvironmentVariable()
			If EnvironmentVariableName() <> ""
  			 If EnvironmentVariableName() = "ProgramW6432" And EnvironmentVariableValue() = "C:\Program Files"
  			   Debug EnvironmentVariableName() + " = " + EnvironmentVariableValue()
  			   PlateformeLevel = PlateformeLevel + 1
  			 EndIf 			 
  			 If EnvironmentVariableName() = "PROCESSOR_ARCHITEW6432" And EnvironmentVariableValue() = "AMD64" Or EnvironmentVariableName() = "PROCESSOR_ARCHITEW6432" And EnvironmentVariableValue() = "IA64"
  			   Debug EnvironmentVariableName() + " = " + EnvironmentVariableValue()
  			   PlateformeLevel = PlateformeLevel + 1
  			 EndIf 			 
  			 If EnvironmentVariableName() = "ProgramFiles" And EnvironmentVariableValue() = "C:\Program Files (x86)"
  			   Debug EnvironmentVariableName() + " = " + EnvironmentVariableValue()
  			   PlateformeLevel = PlateformeLevel + 1
  			 EndIf  			 
			EndIf   
		Wend
		ProcedureReturn PlateformeLevel
	EndIf 
EndProcedure
;Test
If GetPlateforme6432() = 3
  Debug "---------------------"
  Debug "Plateforme 64 bits"
Else 
  Debug "---------------------"
  Debug "Plateforme 32 bits"
EndIf 

Re: [PB4] Processus 32 Bits ou 64 Bits ?

Publié : sam. 18/juin/2011 11:17
par Anonyme2
Jacobus, j'ai un drôle de résultat avec ton code
Compilation sous PB x64 sur un PC portable 64 Bit Seven Pro 64

ProgramW6432 = C:\Program Files
---------------------
Plateforme 32 bits


Compilation sous PB x32

PROCESSOR_ARCHITEW6432 = AMD64
ProgramFiles = C:\Program Files (x86)
ProgramW6432 = C:\Program Files
---------------------
Plateforme 64 bits

Re: [PB4] Processus 32 Bits ou 64 Bits ?

Publié : sam. 18/juin/2011 12:11
par Ar-S
Denis a écrit :Jacobus, j'ai un drôle de résultat avec ton code
Compilation sous PB x64 sur un PC portable 64 Bit Seven Pro 64

ProgramW6432 = C:\Program Files
---------------------
Plateforme 32 bits


Compilation sous PB x32

PROCESSOR_ARCHITEW6432 = AMD64
ProgramFiles = C:\Program Files (x86)
ProgramW6432 = C:\Program Files
---------------------
Plateforme 64 bits
Il y a quoi de bizarre ?
Avec PB32 ou 64 ton seven est en 64bits.
Ces resultats sont logiques.
ProgramW6432 = C:\Program Files renvoi juste le lieux ou tes appli 64bits sont installées par défaut.

Re: [PB4] Processus 32 Bits ou 64 Bits ?

Publié : sam. 18/juin/2011 12:12
par Jacobus
@Denis, Exact, j'ai le même résultat, ce qui est étonnant.
J'avais pas testé compilé en 64 bits... Il semble que les variables d'environnement ne soient pas détectées de la même façon suivant le compilo utilisé ?!?

@Ar-s, ben non c'est pas logique, les deux autres variables testées ne devraient pas être différentes...

Re: [PB4] Processus 32 Bits ou 64 Bits ?

Publié : sam. 18/juin/2011 12:16
par Ar-S
Ah pardon je ne pensais pas que c'était l'absence des variables qui étaient en cause.
Je vais tester en 64bits aussi.

Re: [PB4] Processus 32 Bits ou 64 Bits ?

Publié : sam. 18/juin/2011 12:22
par Ar-S
Il faut remplacer PROCESSOR_ARCHITEW6432 par PROCESSOR_ARCHITECTURE sur PB x64