我想检测从95到Win 7的任何Windows版本。
如果操作系统是32位或64位,我也想显示。
就是这样;就这么简单。 :)我可以使用什么代码在VB 6应用程序中执行此操作?
答案 0 :(得分:27)
更新:对于正确检测Windows 8.1和Windows 10的代码,请参阅this answer。
以下代码仍适用于旧版Windows,但它会报告比Windows 8更新的任何内容,因为它是Windows 8。
底部显示的“位”测试代码(查看操作系统是32位还是64位仍然有效,即使在Windows 10上也是如此。
以下代码将返回一个字符串值,指示当前版本的Windows。基本上,它所做的就是使用GetVersionEx
API function从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
此外,如果您不需要定位最早版本的Windows,则可以通过传递OSVERSIONINFOEX
structure来获取更多信息。我只是用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
答案 1 :(得分:4)
还有WMI Tasks for Operating Systems。
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
值,或解析纯文本Caption
值,该值包含Microsoft(R) Windows(R) Server 2003, Standard Edition
和{Microsoft Windows 7 Professional
等列表{1}}。
答案 2 :(得分:2)
您可以尝试使用VB6附带的Microsoft Sysinfo control并检查OSPlatform,OSBuild和OSVersion属性是否与正确的OS Version #匹配
答案 3 :(得分:1)
接受的答案适用于我的应用程序,直到我在Windows 10上尝试它。即使在更新版本号详细信息的代码as listed here之后,它也报告了错误的Windows版本。事实证明这是因为:
未在Windows 8.1或Windows 10中显示的应用程序将返回Windows 8操作系统版本值(6.2)。一旦应用程序显示给定的操作系统版本,GetVersionEx将始终返回应用程序在将来的版本中显示的版本。要显示Windows 8.1或Windows 10的应用程序,请参阅Targeting your application for 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版本信息的方式。
答案 4 :(得分:1)
这是一个非常简单的方法,用于确定32位与64位操作系统:
OSBits = IIf(Len(Environ$("PROGRAMFILES(X86)")) > 0, 64, 32)
在64位Windows中,操作系统设置环境变量“PROGRAMFILES(X86)”,但它不在32位系统上。它还没有让我失望......
答案 5 :(得分:0)
*我猜StackOverflow不喜欢大量的代码块,所以类(clsOperSystem.cls)位于KiCrypt Demo,这是一个很好的哈希和加密算法汇编。
答案 6 :(得分:0)
在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)