Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: raul338 en Octubre 07, 2010, 02:11:06 pm
-
Buenas :D
Tengo una aplicacion que se cuando se inicia se lanza el servidor mysql, el problema es que hay un servidor para cada tipo de SO (32 y 64 bits) entonces.... buscando (luego de intentos fallidos a mano) logre dar con esta funcion :)
En un modulo (o en un form como quieran 8))
Option Explicit
' Extracto
' http://www.vbmonster.com/Uwe/Forum.aspx/vb-winapi/5690/API-to-determine-if-OS-is-32bit-or-64-bit
Private Declare Function GetVersion Lib "kernel32" () As Long
Private Declare Sub GetNativeSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
Private Type SYSTEM_INFO
wProcessorArchitecture As Integer
wReserved As Integer
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
Private Const PROCESSOR_ARCHITECTURE_IA64 = 6
Private Const PROCESSOR_ARCHITECTURE_AMD64 = 9
Public Function IsOS64Bit() As Boolean
' Llamar desde Win2k en adelante
' La verdad dudo de la existencia de Win2k 64 bits...
' pero en el msdn decia que a partir de win2k se puede llamar a la funcion xD
If LoByte(LoWord(GetVersion())) >= 5 Then
Dim si As SYSTEM_INFO
Call GetNativeSystemInfo(si)
IsOS64Bit = _
(si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) Or _
(si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_IA64)
End If
End Function
Private Function LoWord(ByVal Numero As Long) As Long
' Devuelve el LoWord del número pasado como parámetro
LoWord = Numero And &HFFFF&
End Function
Private Function LoByte(ByVal Numero As Integer) As Integer
' Devuelve el LoByte del número pasado como parámetro
LoByte = Numero And &HFF
End Function
Y para probarlo en el form load
Private Sub Form_Load()
If IsOS64Bit Then
MsgBox "Tienes un SO de 64 bits"
Else
MsgBox "Tienes un SO de 32 bits"
End If
End Sub
No me habia dado cuenta que 0 representaba un procesador de 32bit.... y yo decia que no me devolvia nada ::)
Alguien que tenga un so de 64 bits que lo pruebe por favor :)
Saludos!
-
Efectivamente anda bien :D
saludos
-
con esto puedes verificar q tipo de sistema es:
pon esto en un formulario con un command1
Option Explicit
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function IsWow64Process Lib "kernel32" (ByVal hProcess As Long, ByRef Wow64Process As Long) As Long
Private Sub Command1_Click()
Dim lngReturn As Long
Call IsWow64Process(GetCurrentProcess, lngReturn)
If lngReturn = 0 Then
MsgBox "No es un Sistema operativo de 64-Bit"
Else
MsgBox "Sistema operativo de 64-Bit"
End If
End Sub
-
franklizardo con eso puedo saber si el proceso es de 32 o 64, pero yo necesitaba exclusivamente el so :P
-
@raul338: No, es que justamente cuando un ejecutable de 32 bits corre sobre un sistema de 64, se ejecuta dentro de un entorno llamado WOW64, entonces, como VB6 solo genera ejecutables de 32 bits, cuando se encuentre con un sistema de 64, indefectiblemente se va a ejecutar como WOW64. Es por eso que al llamar a ese API, se ve si el proceso es WOW64, sientdo falso cuando esta en un sistema de 32 bits, donde el programa se ejecuta nativamente.
Saludos
-
@coco: Exacto y es lo que le dije a franklizardo....... pero yo necesitaba si el SO es de 64 bits, no mi aplicacion ni el proceso.
Lo necesito porque en base al so necesito ejecutar herramientas externas de 64 o 32 bits :P de ahi a que el WOW no me servia :P
-
No, me entendiste mal. Eso te va a devolver true si el SO es de 64 bits, ya que el proceso NUNCA VA A CORRER COMO 64BITS. Entonces, en un sistema de 64 bits, el proceso corre como WOW64; por contraparte, en un sistema de 32 bits, NO EXISTE EL WOW64.
Por eso, si el API devuelve que el proceso esta corriendo como WOW64, significa que esta presente un sistema de 64 bits.
-
Jó!.... ahora si entendi...., perdon, soy muy duro a veces....
o sea que hice todo el codigo al pedo ?
-
Perdon lei todo y me confuncí aun mas!
Sirve entonces la función para detectar si es de 64 bits el SO?
-
Desde vb el IsWow64Process es infalible, desde otros lenguajes, hay que ver xD
-
¿y como coreer una aplicación de 64 en un 32??
-
no se puede correr una aplicacion x64 en un sistema 32 bits, hasta donde...