如何从 VB 6 应用程序确定 Windows 版本? [英] How can I determine the Windows version from a VB 6 app?
问题描述
我想检测从 95 到 Win 7 的任何 Windows 版本.
I want to detect any Windows versions from 95 to Win 7.
我还想显示操作系统是 32 位还是 64 位.
I also would like to display if the OS is 32-bit or 64-bit.
就是这样;就这么简单.:) 我可以使用什么代码在 VB 6 应用程序中执行此操作?
That's it; it's that simple. :) What code could I use to do this from within a VB 6 application?
推荐答案
更新:有关正确检测 Windows 8.1 和 Windows 10 的代码,请参阅此答案.
Update: For code that correctly detects Windows 8.1 and Windows 10, see this answer.
下面的代码仍然适用于旧版本的 Windows,但它会将任何比 Windows 8 更新的内容报告为 Windows 8.
The code below still works fine for older versions of Windows, but it will report anything newer than Windows 8 as being Windows 8.
位"底部显示的测试代码(查看操作系统是 32 位还是 64 位仍然有效,即使在 Windows 10 上也是如此.
The "bitness" testing code shown at the bottom (to see if the OS is 32-bit or 64-bit still works, even on Windows 10.
以下代码将返回一个字符串值,指示当前的 Windows 版本.基本上,它所做的就是使用 GetVersionEx 从 Windows 获取系统版本号
API 函数,然后匹配已知的 Windows 版本.
The following code will return a string value indicating the current version of Windows. Basically, all it's doing is getting the system version numbers from Windows using the GetVersionEx
API function, and then matching those up to the known versions of Windows.
(请注意,有些东西没有被完美检测到.例如,64 位版本的 Windows XP 可能会报告为 Server 2003.例如,用于确定用户运行的是 Windows Vista 还是 Server 2008 的代码具有也没有写出来.但你可以根据需要调整它.)
(Note that some things are not detected perfectly. For example, a 64-bit version of Windows XP would likely be reported as Server 2003. Code to determine whether the user is running Windows Vista or Server 2008, for example, has also not been written. But you can take this and tweak it as desired.)
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
此外,如果您不需要针对最早版本的 Windows,您可以通过传递 OSVERSIONINFOEX
结构.我刚刚用 C++ 编写了该代码,而且文档非常容易理解.
Additionally, if you don't need to target the earliest versions of Windows, you can get more information by passing the OSVERSIONINFOEX
structure instead. I just wrote that code in C++, and the documentation is surprisingly easy to follow.
从 VB 6 可执行文件中确定主机操作系统是 32 位还是 64 位有点棘手.原因是因为VB 6 不能编译64 位应用程序.您在 VB 6 中编写的所有内容都将作为 32 位应用程序运行.并且 32 位应用程序在 Windows-on-Windows (WOW64) 子系统中的 64 位版本的 Windows 上运行.他们将始终将当前版本的 Windows 报告为 32 位,因为这就是他们所看到的.
Determining if the host OS is 32-bit or 64-bit from a VB 6 executable is a little trickier. The reason is because VB 6 can't compile 64-bit applications. Everything you write in VB 6 will run as a 32-bit application. And 32-bit applications run on 64-bit versions of Windows in the Windows-on-Windows (WOW64) subsystem. They will always report the current version of Windows as 32-bit, because that's what they see.
我们可以通过最初假设主机操作系统是 32 位并尝试证明这是错误的来解决这个问题.下面是一些示例代码:
We can work around this by initially assuming that the host OS is 32-bit, and attempting to prove this wrong. Here's some sample 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
这篇关于如何从 VB 6 应用程序确定 Windows 版本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!