Je veux détecter toutes les versions de Windows de 95 à Win 7.
Je voudrais aussi afficher si le système d'exploitation est 32 bits ou 64 bits.
C'est tout; c'est si simple. :) Quel code puis-je utiliser pour faire cela à partir d'une application VB 6?
Update: Pour le code qui détecte correctement Windows 8.1 et Windows 10, voir cette réponse .
Le code ci-dessous fonctionne toujours pour les anciennes versions de Windows, mais il signalera que Windows 8 est une version plus récente que Windows 8.
Le code de test "bitness" affiché en bas (pour voir si le système d’exploitation est 32 bits ou 64 bits fonctionne toujours, même sous Windows 10.
Le code suivant renverra une valeur de chaîne indiquant la version actuelle de Windows. Fondamentalement, il ne fait que récupérer les numéros de version du système auprès de Windows à l’aide de la fonction API GetVersionEx
, puis les faire correspondre aux versions connues de Windows.
(Notez que certaines choses ne sont pas parfaitement détectées. Par exemple, une version 64 bits de Windows XP serait probablement signalée sous le nom Serveur 2003. Code permettant de déterminer si l'utilisateur exécute Windows Vista ou Server 2008, par exemple. exemple, n’a pas non plus été écrit. Mais vous pouvez le prendre et le modifier comme vous le souhaitez.)
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
En outre, si vous n'avez pas besoin de cibler les versions les plus anciennes de Windows, vous pouvez obtenir plus d'informations en transmettant la structure OSVERSIONINFOEX
. Je viens d'écrire ce code en C++, et la documentation est étonnamment facile à suivre.
Déterminer si le système d'exploitation hôte est 32 bits ou 64 bits à partir d'un exécutable VB 6 est un peu plus délicat. La raison en est que VB 6 ne peut pas compiler les applications 64 bits. Tout ce que vous écrivez dans VB 6 s'exécutera en tant qu'application 32 bits. Et les applications 32 bits s'exécutent sur les versions 64 bits de Windows dans le sous-système Windows sur Windows (WOW64). Ils rapporteront toujours la version actuelle de Windows en 32 bits, car c'est ce qu'ils voient.
Nous pouvons contourner ce problème en supposant initialement que le système d'exploitation hôte est 32 bits et en essayant de prouver que cela est faux. Voici un exemple de code:
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
Il y a aussi les Tâches WMI pour les systèmes d'exploitation .
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
Vous pouvez faire quelque chose de similaire aux déclarations case fournies par Cody Gray ci-dessus pour analyser la valeur Version
ou le texte brut Caption
, qui contient des listes comme Microsoft(R) Windows(R) Server 2003, Standard Edition
et Microsoft Windows 7 Professional
.
Vous pouvez essayer d’utiliser le contrôle Microsoft Sysinfo fourni avec VB6 et vérifier si les propriétés OSPlatform, OSBuild et OSVersion correspondent aux propriétés appropriées - OS Version #
Voici une méthode très simple que j'utilise pour déterminer le système d'exploitation 32 vs. 64 bits:
OSBits = IIf(Len(Environ$("PROGRAMFILES(X86)")) > 0, 64, 32)
Sous Windows 64 bits, le système d'exploitation définit la variable d'environnement "PROGRAMFILES (X86)", mais pas sur les systèmes 32 bits. Cela ne m'a pas encore manqué ...
La réponse acceptée a fonctionné pour mon application jusqu'à ce que je l'essaie sur Windows 10. Même après la mise à jour du code pour les détails du numéro de version comme indiqué ici , la version Windows était incorrecte. Il se trouve que c'est parce que:
Les applications non manifestées pour Windows 8.1 ou Windows 10 renverront la valeur de version de Windows 8 OS (6.2). Une fois qu'une application est manifestée pour une version de système d'exploitation donnée, GetVersionEx renverra toujours la version pour laquelle l'application est manifestée dans les prochaines versions. Pour manifester vos applications pour Windows 8.1 ou Windows 10, reportez-vous à la section Ciblage de votre application pour Windows .
Donc, pour que la version correcte de Windows apparaisse, cela revient à ajouter une section au manifeste d'application:
<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>
Et ensuite, l'API GetVersionInfo fonctionne comme prévu. Cette section de manifeste était nouvelle à partir de Windows 7, je crois.
Cependant, une mise en garde très importante est que vous devez avoir réellement testé votre application sur chaque version de système d'exploitation avec laquelle vous la déclarez compatible. Ces paramètres affectent certaines fonctions de Windows, pas seulement la manière dont les informations de version de Windows sont rapportées.
WORK on WINDOWS 10 VB6 - ne fonctionne pas en mode débogage - fonctionne uniquement à l'exécution
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
appel
Dim lpVersionInformation As RTL_OSVERSIONINFOEX
lpVersionInformation.dwOSVersionInfoSize = Len(lpVersionInformation)
RtlGetVersion(lpVersionInformation)
Ah, trouvé! Personnellement, je n'utilise pas cette classe parce que, pour mes besoins, c'est excessif, mais c'est certainement l'exemple de version OpSys le plus complet que j'ai rencontré. Le mérite en revient à Kenneth Ives.
* Je suppose que StackOverflow n'aime pas les énormes blocs de code. La classe (clsOperSystem.cls) se trouve donc dans KiCrypt Demo , une excellente compilation d'algorithmes de hachage et de cryptage.