windows - tag - instalar framework 4.5 en iis 7
¿Cómo puedo determinar la versión de Windows desde una aplicación VB 6? (7)
Quiero detectar cualquier versión de Windows de 95 a Win 7.
También me gustaría mostrar si el sistema operativo es de 32 bits o de 64 bits.
Eso es; Es así de simple. :) ¿Qué código podría usar para hacer esto desde una aplicación VB 6?
Actualización: para el código que detecta correctamente Windows 8.1 y Windows 10, consulte esta respuesta .
El siguiente código funciona bien para las versiones anteriores de Windows, pero informará que algo más nuevo que Windows 8 es Windows 8.
El código de prueba de "bitness" que se muestra en la parte inferior (para ver si el sistema operativo es de 32 bits o de 64 bits aún funciona, incluso en Windows 10.
El siguiente código devolverá un valor de cadena que indica la versión actual de Windows. Básicamente, todo lo que hace es obtener los números de versión del sistema de Windows utilizando la función GetVersionEx
API , y luego compararlos con las versiones conocidas de Windows.
(Tenga en cuenta que algunas cosas no se detectan perfectamente. Por ejemplo, una versión de 64 bits de Windows XP probablemente se informará como Server 2003. El código para determinar si el usuario ejecuta Windows Vista o Server 2008, por ejemplo, tampoco se ha escrito, pero puede tomar esto y ajustarlo como desee).
Option Explicit
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
(lpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
OSVSize As Long
dwVerMajor As Long
dwVerMinor As Long
dwBuildNumber As Long
PlatformID As Long
szCSDVersion As String * 128
End Type
Private Const VER_PLATFORM_WIN32s = 0
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32_NT = 2
'' Returns the version of Windows that the user is running
Public Function GetWindowsVersion() As String
Dim osv As OSVERSIONINFO
osv.OSVSize = Len(osv)
If GetVersionEx(osv) = 1 Then
Select Case osv.PlatformID
Case VER_PLATFORM_WIN32s
GetWindowsVersion = "Win32s on Windows 3.1"
Case VER_PLATFORM_WIN32_NT
GetWindowsVersion = "Windows NT"
Select Case osv.dwVerMajor
Case 3
GetWindowsVersion = "Windows NT 3.5"
Case 4
GetWindowsVersion = "Windows NT 4.0"
Case 5
Select Case osv.dwVerMinor
Case 0
GetWindowsVersion = "Windows 2000"
Case 1
GetWindowsVersion = "Windows XP"
Case 2
GetWindowsVersion = "Windows Server 2003"
End Select
Case 6
Select Case osv.dwVerMinor
Case 0
GetWindowsVersion = "Windows Vista/Server 2008"
Case 1
GetWindowsVersion = "Windows 7/Server 2008 R2"
Case 2
GetWindowsVersion = "Windows 8/Server 2012"
Case 3
GetWindowsVersion = "Windows 8.1/Server 2012 R2"
End Select
End Select
Case VER_PLATFORM_WIN32_WINDOWS:
Select Case osv.dwVerMinor
Case 0
GetWindowsVersion = "Windows 95"
Case 90
GetWindowsVersion = "Windows Me"
Case Else
GetWindowsVersion = "Windows 98"
End Select
End Select
Else
GetWindowsVersion = "Unable to identify your version of Windows."
End If
End Function
Además, si no necesita orientar las versiones más antiguas de Windows, puede obtener más información al pasar la estructura OSVERSIONINFOEX
. Acabo de escribir ese código en C ++, y la documentación es sorprendentemente fácil de seguir.
Determinar si el sistema operativo host es de 32 bits o 64 bits desde un ejecutable VB 6 es un poco más complicado. La razón es porque VB 6 no puede compilar aplicaciones de 64 bits. Todo lo que escriba en VB 6 se ejecutará como una aplicación de 32 bits. Y las aplicaciones de 32 bits se ejecutan en versiones de 64 bits de Windows en el subsistema Windows-on-Windows (WOW64). Siempre informarán que la versión actual de Windows es de 32 bits, porque eso es lo que ven.
Podemos evitar esto suponiendo inicialmente que el sistema operativo host es de 32 bits, y que intentamos probar esto incorrectamente. Aquí hay un código de muestra:
Private Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetModuleHandle Lib "kernel32" _
Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function IsWow64Process Lib "kernel32" _
(ByVal hProc As Long, ByRef bWow64Process As Boolean) As Long
Public Function IsHost64Bit() As Boolean
Dim handle As Long
Dim is64Bit As Boolean
'' Assume initially that this is not a WOW64 process
is64Bit = False
'' Then try to prove that wrong by attempting to load the
'' IsWow64Process function dynamically
handle = GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process")
'' The function exists, so call it
If handle <> 0 Then
IsWow64Process GetCurrentProcess(), is64Bit
End If
'' Return the value
IsHost64Bit = is64Bit
End Function
Ah, lo encontré! Personalmente no uso esta clase porque para mis necesidades es excesivo, pero definitivamente es el ejemplo más completo de la versión de OpSys que he encontrado. El crédito por este es para Kenneth Ives.
* Supongo que a no le gustan los bloques enormes de código, por lo que la clase (clsOperSystem.cls) se encuentra en KiCrypt Demo , una excelente compilación de algoritmos hash y de cifrado.
Este es un método muy simple que uso para determinar el sistema operativo de 32 contra 64 bits:
OSBits = IIf(Len(Environ$("PROGRAMFILES(X86)")) > 0, 64, 32)
En Windows de 64 bits, el sistema operativo establece la variable de entorno "PROGRAMFILES (X86)", pero no en los sistemas de 32 bits. Todavía no me ha fallado ...
La respuesta aceptada funcionó para mi aplicación hasta que la probé en Windows 10. Incluso después de actualizar el código para los detalles del número de versión que figura aquí , informaba una versión de Windows incorrecta. Resulta que esto es porque:
Las aplicaciones no manifestadas para Windows 8.1 o Windows 10 devolverán el valor de versión del sistema operativo Windows 8 (6.2). Una vez que se manifiesta una aplicación para una versión determinada del sistema operativo, GetVersionEx siempre devolverá la versión para la que se manifiesta la aplicación en futuras versiones. Para manifestar sus aplicaciones para Windows 8.1 o Windows 10, consulte Orientación de su aplicación para Windows .
Entonces, para que aparezca la versión correcta de Windows, se trata de agregar una sección al manifiesto de la aplicación:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
Y luego, la API GetVersionInfo funciona como se esperaba. Esta sección de manifiesto era nueva a partir de Windows 7, creo.
Sin embargo, una advertencia muy importante es que en realidad debe haber probado su aplicación en cada versión del sistema operativo con la que la liste como compatible. Estas configuraciones afectan ciertas funciones de Windows, no solo la forma en que se informa la información de la versión de Windows.
Podría intentar usar el control Microsoft Sysinfo que viene con VB6 y verificar si las propiedades de la plataforma OS, OSBuild y OSVersion coinciden con la versión del sistema operativo adecuada .
También están las tareas de WMI para sistemas operativos .
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!//" & strComputer & "/root/cimv2")
Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
Wscript.Echo objOperatingSystem.Caption & " " & objOperatingSystem.Version
Next
Puede hacer algo similar a las declaraciones de casos proporcionadas por Cody Gray para analizar el valor de la Version
, o analizar el texto sin formato, que tiene listados como Microsoft(R) Windows(R) Server 2003, Standard Edition
y Microsoft Windows 7 Professional
.
WORK en WINDOWS 10 VB6 - no funciona en modo de depuración - funciona solo en tiempo de ejecución
Private Declare Function RtlGetVersion Lib "ntdll" (ByRef lpVersionInformation As RTL_OSVERSIONINFOEX) As Long
Private Type RTL_OSVERSIONINFOEX
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
llamada
Dim lpVersionInformation As RTL_OSVERSIONINFOEX
lpVersionInformation.dwOSVersionInfoSize = Len(lpVersionInformation)
RtlGetVersion(lpVersionInformation)