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

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

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

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

Solutions Collecting From Web of "如何从VB 6应用程序中确定Windows版本?"

更新:有关正确检测Windows 8.1和Windows 10的代码,请参阅此答案 。

下面的代码对于旧版本的Windows仍然可以正常工作,但是它会报告比Windows 8更新的任何东西。

底部显示的“位”测试代码(查看操作系统是32位还是64位,即使在Windows 10上也能正常工作。

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

(请注意,有些东西没有完全检测到,例如,Windows XP的64位版本可能会报告为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 

此外,如果不需要定位最早版本的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 hmodulee As Long, ByVal lpProcName As String) As Long Private Declare Function GetmoduleeHandle Lib "kernel32" _ Alias "GetmoduleeHandleA" (ByVal lpmoduleeName 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(GetmoduleeHandle("kernel32"), "IsWow64Process") ' The function exists, so call it If handle <> 0 Then IsWow64Process GetCurrentProcess(), is64Bit End If ' Return the value IsHost64Bit = is64Bit End Function 

还有操作系统的WMI任务 。

 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 

您可以执行与上面的Cody Gray提供的案例相似的语句来解析Version值,或者解析具有Microsoft(R) Windows(R) server 2003, Standard EditionMicrosoft Windows 7 Professional等列表的纯文本Caption值。

您可以尝试使用VB6附带的Microsoft Sysinfo控件 ,并检查OSPlatform,OSBuild和OSVersion propertys以匹配正确的操作系统版本#

被接受的答案为我的应用程序工作,直到我在Windows 10上尝试它。即使在更新版本号细节的代码在此处列出后,它报告错误的Windows版本。 原来这是因为:

不适用于Windows 8.1或Windows 10的应用程序将返回Windows 8操作系统版本值(6.2)。 一旦某个应用程序出现在给定的操作系统版本中,GetVersionEx将始终返回该应用程序在未来发行版中的版本。 要为Windows 8.1或Windows 10显示您的应用程序,请参阅针对您的Windows应用程序 。

所以为了获得正确的Windows版本,它相当于添加一个应用程序清单部分:

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

然后GetVersionInfo API按预期工作。 我相信这个清单部分是Windows 7的新功能。

但是,一个非常重要的警告是,您必须在您列出的兼容的每个操作系统版本上测试您的应用程序。 这些设置会影响某些Windows功能,而不仅仅是Windows版本信息的报告方式。

这是一个非常简单的方法来确定32位和64位操作系统:

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

在64位Windows中,操作系统设置环境变量“PROGRAMFILES(X86)”,但不在32位系统上。 它还没有让我失望

啊,找到了! 我不亲自使用这个类,因为我的需要是过度的,但它绝对是我遇到的最全面的OpSys版本的例子。 这个信用肯尼思艾夫斯。

*我猜StackOverflow不喜欢巨大的代码块,所以类(clsOperSystem.cls)位于KiCrypt演示中 ,这是散列和加密算法的优秀汇编。

在WINDOWS 10 VB6上工作不能在调试模式下 工作只能在运行时工作

 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 

呼叫

 Dim lpVersionInformation As RTL_OSVERSIONINFOEX lpVersionInformation.dwOSVersionInfoSize = Len(lpVersionInformation) RtlGetVersion(lpVersionInformation)