我想檢測任何Windows版本從95到Win 7.如何從VB 6應用程序中確定Windows版本?
我也想顯示,如果操作系統是32位或64位。
就是這樣;這很簡單。 :)我可以使用什麼代碼在VB 6應用程序中執行此操作?
我想檢測任何Windows版本從95到Win 7.如何從VB 6應用程序中確定Windows版本?
我也想顯示,如果操作系統是32位或64位。
就是這樣;這很簡單。 :)我可以使用什麼代碼在VB 6應用程序中執行此操作?
更新:對於正確檢測的Windows 8.1和Windows 10碼,見this answer。
下面仍然工作正常,舊版本的Windows,但它會爲Windows 8的
在底部顯示的「位數」的測試代碼比Windows 8報告任何新的代碼(查看是否操作系統即使在Windows 10上,32位或64位仍然有效。
以下代碼將返回一個字符串值,指示當前版本的Windows。基本上,它所做的只是從Windows獲取系統版本號使用GetVersionEx
API function,然後將這些匹配到已知版本的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
啊,發現它!我不親自使用這個類,因爲我的需要它是過度的,但它絕對是我遇到的最全面的OpSys版本示例。這一個信貸去Kenneth Ives。
*我猜StackOverflow不喜歡巨大的代碼塊,所以類(clsOperSystem.cls)位於KiCrypt Demo,這是散列和加密算法的優秀彙編。
你可以嘗試使用自帶VB6微軟Sysinfo control和檢查OSPlatform,OSBuild和OSVERSION propertys,以配合適當的OS Version #
還有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
你可以做類似於上述科迪灰色提供解析Version
值,或解析純文本Caption
值,其中有像Microsoft(R) Windows(R) Server 2003, Standard Edition
和Microsoft Windows 7 Professional
上市的case語句的東西。
接受的答案工作了我的申請,直到我甚至爲更新版本號的代碼之後試了一下在Windows 10細節as listed here該公司報告了錯誤的Windows版本。事實證明,這是因爲:
不適用於Windows 8.1或Windows 10的應用程序將返回Windows 8 OS版本值(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版本信息的報告方式。
這裏是一個非常簡單的方法我用它來確定32與64位操作系統:
OSBits = IIf(Len(Environ$("PROGRAMFILES(X86)")) > 0, 64, 32)
在64位Windows中,OS設置環境變量「PROGRAMFILES(X86)」,但它不不適用於32位系統。它沒有讓我失望尚未...
工作在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)
osv.OSVSize = LEN(OSV)讓我在VB2010Espress一個錯誤:它已被分配AV之前變量「OSV」用來ALUE .... – 2011-08-22 12:13:17
@RemusRigo:**是的,當然**這段代碼是* VB 6 *,自2002年以來(稱爲VB 7)更新回到1998年左右的Visual Basic的每個版本的舊版本最後有基於.NET Framework,甚至最初稱爲VB.NET。他們已經因爲放棄了「.NET」部分,因爲每個人都完全忘記了VB 6。它甚至不是由微軟支持了,因爲它是近15歲。 VB 6和VB.NET *完全不同,並且在一個**中工作的代碼在另一箇中不起作用。你需要編寫.NET代碼。你正在看錯標籤的問題。 – 2011-08-22 12:15:57