如何从VB 6应用程序中确定Windows版本?

SOF*_*ser 18 windows vb6 windowsversion 32bit-64bit

我想检测从95到Win 7的任何Windows版本.

如果操作系统是32位或64位,我也想显示.

而已; 就这么简单.:)我可以使用什么代码在VB 6应用程序中执行此操作?

Cod*_*ray 28

更新:对于正确检测Windows 8.1和Windows 10的代码,请参阅此答案.

下面的代码仍适用于旧版本的Windows,但它会报告比Windows 8更新的任何东西,因为它是Windows 8.

底部显示的"位数"测试代码(查看操作系统是32位还是64位仍然有效,即使在Windows 10上也是如此.

以下代码将返回一个字符串值,指示当前版本的Windows.基本上,它所做的就是使用GetVersionExAPI函数从Windows获取系统版本号,然后将它们与已知版本的Windows进行匹配.

(请注意,某些内容未被完美检测到.例如,64位版本的Windows XP可能会报告为Server 2003.例如,用于确定用户是运行Windows Vista还是Server 2008的代码也未被检测到但是你可以根据需要调整它并调整它.)

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
Run Code Online (Sandbox Code Playgroud)

此外,如果您不需要定位最早版本的Windows,则可以通过传递OSVERSIONINFOEX结构来获取更多信息.我刚用C++编写了这段代码,文档非常容易理解.


确定主机操作系统是否是VB 6可执行文件的32位或64位有点棘手.原因是因为VB 6无法编译64位应用程序.您在VB 6中编写的所有内容都将作为32位应用程序运行.32位应用程序在Windows-on-Windows(WOW64)子系统中的64位版本的Windows上运行.他们总是会将当前版本的Windows报告为32位,因为这就是他们所看到的.

我们可以通过最初假设主机操作系统是32位来解决这个问题,并试图证明这是错误的.这是一些示例代码:

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
Run Code Online (Sandbox Code Playgroud)