Question

Je veux détecter toutes les versions de Windows 95 à Windows 7.

Je tiens également à afficher si le système d'exploitation est 32 bits ou 64 bits.

Ca y est; c'est si simple. :) Quel code pourrais-je utiliser pour ce faire dans une application VB 6?

Était-ce utile?

La solution

Mise à jour: Pour le code qui détecte correctement de Windows 8.1 et Windows 10, voir cette réponse .

Le code ci-dessous fonctionne toujours très bien pour les anciennes versions de Windows, mais il rapportera quelque chose plus récent que Windows 8 comme Windows 8.

Le « bitness » test du code affiché en bas (pour voir si le système d'exploitation est 32 bits ou 64 bits fonctionne toujours, même sur Windows 10.

Le code suivant renvoie une valeur de chaîne indiquant la version actuelle de Windows. En gros, tout ce qu'il fait est d'obtenir les numéros de version du système de Windows en utilisant le GetVersionEx fonction API , puis correspondant à ceux qui jusqu'à les versions connues de Windows.

(Notez que certaines choses ne sont pas détectés parfaitement. Par exemple, une version 64 bits de Windows XP serait probablement signalé comme serveur de code 2003. afin de déterminer si l'utilisateur exécute Windows Vista ou Server 2008, par exemple, a pas non plus été écrit. Mais vous pouvez prendre cela et 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 premières versions de Windows, vous pouvez obtenir plus d'informations en passant structure OSVERSIONINFOEX à la place. Je viens d'écrire que le code en C ++ et la documentation est étonnamment facile à suivre.


déterminer si le système d'exploitation hôte est de 32 bits ou 64 bits à partir d'un fichier exécutable VB 6 est un peu plus délicat. La raison est parce que VB 6 ne peut compiler des applications 64 bits. Tout ce que vous écrivez en VB 6 fonctionnera comme une application 32 bits. Et les applications 32 bits fonctionnent sur les versions 64 bits de Windows dans Windows sur Windows (WOW64) sous-système. Ils seront toujours signaler la version actuelle de Windows comme 32 bits, parce que ce qu'ils voient.

Nous pouvons contourner ce problème en supposant d'abord que le système d'exploitation hôte est de 32 bits, et en essayant de prouver mal. Voici quelques exemples 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

Autres conseils

Il y a aussi les WMI Tâches 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 semblable aux déclarations de cas fournies par Cody gris ci-dessus pour analyser la valeur de Version, ou analyser la valeur Caption de texte brut, qui a des listes comme Microsoft(R) Windows(R) Server 2003, Standard Edition et Microsoft Windows 7 Professional.

Vous pouvez essayer d'utiliser le contrôle href="http://msdn.microsoft.com/en-us/library/aa733698%28VS.60%29.aspx" Microsoft Sysinfo qui vient avec VB6 et vérifier OSPlatform, OSBuild et OSVERSION propertys pour correspondre avec le bon OS version #

La réponse acceptée a travaillé pour ma demande jusqu'à ce que je l'ai essayé sur Windows 10. Même après la mise à jour du code pour les détails du numéro de version comme indiqué ici il a signalé la mauvaise version de Windows. Il se trouve parce que:

Applications pour Windows ne se manifeste pas 8.1 ou Windows 10 renvoie la valeur de la version Windows 8 OS (6.2). Une fois qu'une demande se manifeste pour une version du système d'exploitation donné, GetVersionEx renvoie toujours la version que l'application se manifeste dans les versions ultérieures. Pour manifester vos applications pour Windows 8.1 ou Windows 10, reportez-vous à Cibler votre application pour Windows .

Ainsi, afin d'obtenir la version correcte de Windows pour montrer, il revient à ajouter une section du 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 puis l'API GetVersionInfo fonctionne comme prévu. Cette section était manifeste une nouveauté de Windows 7, je crois.

Cependant, une mise en garde très important est que vous devez réellement avoir testé votre application sur chaque version du système d'exploitation que vous listez comme étant compatible avec. Ces paramètres affectent certaines fonctions de Windows, non seulement la façon dont les informations de version de Windows est signalé.

Voici une méthode très simple que j'utilise pour déterminer 32 vs 64 bits du système d'exploitation:

OSBits = IIf(Len(Environ$("PROGRAMFILES(X86)")) > 0, 64, 32)

le système d'exploitation définit la variable d'environnement « PROGRAMFILES (X86) » Dans Windows, 64 bits, mais il ne fonctionne pas sur les systèmes 32 bits. Il ne m'a pas encore ...

Ah, trouvé! Je ne l'utilise pas personnellement cette classe parce que pour mes besoins, il est surpuissant, mais il est certainement l'exemple le plus de version OpSys approfondies que je suis venu à travers. Crédit pour celui-ci va à Kenneth Ives.

* Je suppose que StackOverflow ne pas comme d'énormes blocs de code, donc la classe (clsOperSystem.cls) est situé dans la section KiCrypt Demo , une excellente compilation d'algorithmes de hachage et de chiffrement.

sur WINDOWS 10 TRAVAIL VB6 - fonctionne pas en mode debug - uniquement sur le travail d'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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top