Autor Tema: Como saber si el SO es de 64bits o de 32  (Leído 7754 veces)

0 Usuarios y 1 Visitante están viendo este tema.

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Como saber si el SO es de 64bits o de 32
« 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))
Código: (vb) [Seleccionar]
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
Código: (vb) [Seleccionar]
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!

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #1 en: Octubre 08, 2010, 11:49:06 pm »
Efectivamente anda bien :D

saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

FrankLizardo

  • Kilobyte
  • **
  • Mensajes: 65
  • Reputación: +7/-1
    • Ver Perfil
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #2 en: Octubre 13, 2010, 03:53:13 pm »
con esto puedes verificar q tipo de sistema es:
pon esto en un formulario con un command1

Código: (vb) [Seleccionar]
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
« última modificación: Enero 16, 2011, 12:42:44 pm por xkiz »

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #3 en: Octubre 13, 2010, 09:30:49 pm »
franklizardo con eso puedo saber si el proceso es de 32 o 64, pero yo necesitaba exclusivamente el so :P

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #4 en: Octubre 14, 2010, 01:49:17 pm »
@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
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #5 en: Octubre 14, 2010, 04:45:56 pm »
@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

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #6 en: Octubre 14, 2010, 10:49:04 pm »
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.
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #7 en: Octubre 15, 2010, 12:00:18 pm »
Jó!.... ahora si entendi...., perdon, soy muy duro a veces.... o sea que hice todo el codigo al pedo ?

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #8 en: Enero 16, 2011, 10:05:50 am »
Perdon lei todo y me confuncí aun mas!

Sirve entonces la función para detectar si es de 64 bits el SO?
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #9 en: Enero 16, 2011, 06:13:48 pm »
Desde vb el IsWow64Process es infalible, desde otros lenguajes, hay que ver xD

R@MI

  • Visitante
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #10 en: Febrero 02, 2011, 12:16:08 pm »
¿y como coreer una aplicación de 64 en un 32??

xkiz ™

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 283
  • Reputación: +30/-11
    • Ver Perfil
    • xkiz ™
Re:Como saber si el SO es de 64bits o de 32
« Respuesta #11 en: Febrero 02, 2011, 01:48:04 pm »
no se puede correr una aplicacion x64 en un sistema 32 bits, hasta donde...