web-dev-qa-db-fra.com

Comment puis-je déterminer la version Windows à partir d'un VB 6 app?

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?

17
SOF User

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
27
Cody Gray

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.

4
Joe M

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 #

2
Mark Hall

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é ...

1
MountainMan

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.

1
DaveInCaz

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)
0
zone zone

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.

0
Joe Jordan