Averiguar la versión de Windows usando API: GetVersion y GetVersionEx

 

Publicado el  24/May/2007
Revisado el 24/May/2007
Autor: Guillermo 'guille' Som

Pulsa aquí, si quieres la versión para Visual Basic .NET y C#.


Cómo averiguar la versión actual de Windows con Visual Basic 6.0, usando las funciones del API: GetVersion y GetVersionEx.


 

Introducción:

Aquí tienes la forma de averiguar la versión de Windows en la que se está ejecutando tu aplicación.

Te muestro dos formas de averiguarlo, una es usando la función GetVersion y la otra es usando GetVersionEx que utiliza el tipo de datos OSVERSIONINFOEX.
Aunque en realidad son tres formas, pero dos de ellas usan la misma función GetVersionEx aunque con dos versiones diferentes del tipo OSVERSIONINFO.

 

Las definiciones de las funciones, tipos y constantes

La función GetVersion es muy simple, solo devuelve un valor de tipo Long en el que están los tres valores típicos de la versión: Mayor, Menor y Build. Lo que pasa es que está todo como "aglomerado" y hace falta desglosarlo, para ese desglose se deben tomar los valores dividiendo (o troceando) el valor en distintas partes, para eso se necesitan de otras funciones, ahora lo verás en la sección de cómo usar la función.

La definición de la función:

Private Declare Function GetVersion Lib "kernel32" () As Long

 

La función GetVersionEx utiliza un tipo de datos en el que se indican los diferentes valores. Esa versión puede usar el mismo tipo pero con más o menos información, por tanto, aquí te muestro dos definiciones según se quiera usar la versión reducida o extendida.

La definición de los tipos y las funciones:

' La versión simple
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
    (lpVersionInformation As OSVERSIONINFO) As Long


' La versión extendida
Private Type OSVERSIONINFOEX
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
    wServicePackMajor As Integer
    wServicePackMinor As Integer
    wSuiteMask As Integer
    wProductType As Byte
    wReserved As Byte
End Type

Private Declare Function GetVersionEx2 Lib "kernel32" Alias "GetVersionExA" _
    (lpVersionInformation As OSVERSIONINFOEX) As Long

 

Cómo usar las funciones y tratar los resultados

Para usar la función GetVersion no hay que hacer nada especial, salvo guardar el valor en una variable de tipo Long, y como te comentaba antes, ese valor hay que "desgranarlo" para obtener los valores correspondientes.

Veamos cómo se usa y más abajo puedes ver las funciones "extras" que he usado:

Dim ret As Long
Dim s As String

' Usando GetVersion
ret = GetVersion
    
Dim vMajor As Long, vMinor As Long, vBuild As Long
    
vMajor = LoByte(LoWord(ret))
vMinor = HiByte(LoWord(ret))

' A partir de NT 4 tiene el Build (no en Me/9x)
vBuild = HiWord(ret)
    
s = "Versión: " & _
            vMajor & "." & vMinor & "." & vBuild

 

Para usar la versión GetVersionEx debemos declarar una variable del tipo OSVERSIONINFO que es donde nos indica los valores de la versión. Aquí te muestro el código de forma simple, pero en el ZIP con el proyecto completo para Visual Basic 6.0 tienes más información de cómo identificar el sistema operativo según los valores de la versión.

Dim OSInfo As OSVERSIONINFO
Dim ret As Long
Dim s As String

OSInfo.szCSDVersion = Space$(128)
OSInfo.dwOSVersionInfoSize = Len(OSInfo)
ret = GetVersionEx(OSInfo)

s = "MajorVersion     " & OSInfo.dwMajorVersion & vbCrLf & _
    "MinorVersion     " & OSInfo.dwMinorVersion & vbCrLf & _
    "BuildNumber      " & OSInfo.dwBuildNumber & vbCrLf & _
    "PlatformId       " & OSInfo.dwPlatformId & vbCrLf & _
    "CSDVersion       " & szTrim(OSInfo.szCSDVersion)

Me.txtOSVersion.Text = s

 

Las versiones de Windows dependen del valor de Mayor y Menor, (y la combinación de los dos), y más o menos te puede servir la siguiente tabla, que es aplicable a los valores de las dos funciones comentadas:

 

Sistema operativo   Mayor
Windows NT 3.51   3
Windows 95, 98, Me y NT 4.0   4
Windows 2000, XP y 2003   5
Windows Vista/Longhorn   6

 

Sistema operativo   Menor
Windows NT 3.51   51
Windows 95   0
Windows 98   10
Windows Me   90
Windows NT 4.0   0
Windows 2000   0
Windows XP   1
Windows 2003   2
Windows Vista/Longhorn   0

Por ejemplo, si el valor de Mayor es 5 y el de Menor es 2 es un Windows 2003 Server.
Si el valor de Mayor es 5 y el de Menor es 1 es un Windows XP.

Para averiguar cosas de Windows 9x o de Windows 2000 Server, si es XP Home o Profesional, lo ves en el ejemplo completo, que están casi todas las explicaciones necesarias y que son aburridas y no es plan de rellenar con cosas que a lo mejor no es lo que te interesa.

 

Y esto es todo, como siempre, espero que te sea de utilidad.

Nos vemos.
Guillermo

 


El código para Visual Basic 6.0
Private Function szTrim(ByVal s As String) As String
    ' Quita los caracteres en blanco y los Chr$(0)                  (13/Dic/01)
    Dim i As Long

    i = InStr(s, vbNullChar)
    If i Then
        s = Left$(s, i - 1)
    End If
    s = Trim$(s)
    
    szTrim = s
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 HiWord(ByVal Numero As Long) As Long
    ' Devuelve el HiWord del número pasado como parámetro
    HiWord = Numero \ &H10000 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

Private Function HiByte(ByVal Numero As Integer) As Integer
    ' Devuelve el HiByte del número pasado como parámetro
    HiByte = Numero \ &H100 And &HFF
End Function

Código de ejemplo (comprimido):

Fichero con el código de ejemplo: versionWindows_VB6.zip - 9.43 KB

Contiene el proyecto y el ejecutable compilado.

(MD5 checksum: B1CCD3E1FE8452AACE406A9C91926771)



Volver a la página del API

ir al índice del Guille