Saludo0s a todos
Pues mi duda es esa, de que manera ó maneras podria determinar que sistema operativo corre en una pc, ya sea xp, vista o seven en VB6.
Se agradece de antemano cualquier ayuda o comentario.
pedrito90
pues se usa la Api get version y getversionex
edito:
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:
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:
'
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:
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.
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.
edito:
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:
Código: Seleccionar todo
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:
'
Código: Seleccionar todo
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:
Código: Seleccionar todo
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.
Código: Seleccionar todo
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.
Código: Seleccionar todo
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
y la fuente de ésto slandg donde está?
pues es esta crei que la habia puesto : [Enlace externo eliminado para invitados]
Solo lee el registro
Sistema Operativo:
Service Pack:
Versión: (solo modificados)
Procesador:
Como veras hay muchas cosas que estan en el registro, solo es cuestion de buscar
Sistema Operativo:
Código: Seleccionar todo
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Productname
Código: Seleccionar todo
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\csdversion
Código: Seleccionar todo
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\RegisteredOwner
Código: Seleccionar todo
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\ProcessorNameString
Como veras hay muchas cosas que estan en el registro, solo es cuestion de buscar
Muchisimas gracias por sus respuesta!!
Lo que busco es usarlo con un modulo para desabilitar uac. Lo que tenia pensado era que, el programa obtuviera el sistema operativo usado, en caso de que fuese vista o seven usar el modulo anti UAC, y en caso contrario no.
La forma de Sanlegas la veo mas facil, pero, si el UAC está activado, ¿me permitiria leer el registro? ¿El UAC solo impide escritura en este?
Supongo que la forma que expuso slandg seria mas rapida porque utiliza apis, ¿o me equivoco?
Lo que busco es usarlo con un modulo para desabilitar uac. Lo que tenia pensado era que, el programa obtuviera el sistema operativo usado, en caso de que fuese vista o seven usar el modulo anti UAC, y en caso contrario no.
La forma de Sanlegas la veo mas facil, pero, si el UAC está activado, ¿me permitiria leer el registro? ¿El UAC solo impide escritura en este?
Supongo que la forma que expuso slandg seria mas rapida porque utiliza apis, ¿o me equivoco?
el UAC te impide eso en seven pues no se en vista :/
Bueno, segun entendi, en el code me dara 2 valores (o mas) pero los que me importan es MajorVersion y MinorVersion, cierto?
entonces, para ponerlo en mi proyecto tendria que poner algo asi?:
La cosa vendria siendo asi o me equivoco?,aun ando aprendiendo del visual, por eso las preguntas tan...duh!
De no ser de esa manera, ¿me podrian dar un ejemplito base de como poder implementarlo? =)
Gracias de antemano.
Saludo0s.
entonces, para ponerlo en mi proyecto tendria que poner algo asi?:
Código: Seleccionar todo
if MajorVersion = x and MinorVersion = x then
call ANTI-UAC
else
end sub
De no ser de esa manera, ¿me podrian dar un ejemplito base de como poder implementarlo? =)
Gracias de antemano.
Saludo0s.