2011-01-29 63 views

回答

27

更新:對於正確檢測的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 
+0

osv.OSVSize = LEN(OSV)讓我在VB2010Espress一個錯誤:它已被分配AV之前變量「OSV」用來ALUE .... – 2011-08-22 12:13:17

+0

@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

0

啊,發現它!我不親自使用這個類,因爲我的需要它是過度的,但它絕對是我遇到的最全面的OpSys版本示例。這一個信貸去Kenneth Ives。

*我猜StackOverflow不喜歡巨大的代碼塊,所以類(clsOperSystem.cls)位於KiCrypt Demo,這是散列和加密算法的優秀彙編。

2

你可以嘗試使用自帶VB6微軟Sysinfo control和檢查OSPlatform,OSBuild和OSVERSION propertys,以配合適當的OS Version #

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 

你可以做類似於上述科迪灰色提供解析Version值,或解析純文本Caption值,其中有像Microsoft(R) Windows(R) Server 2003, Standard EditionMicrosoft Windows 7 Professional上市的case語句的東西。

1

接受的答案工作了我的申請,直到我甚至爲更新版本號的代碼之後試了一下在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版本信息的報告方式。

1

這裏是一個非常簡單的方法我用它來確定32與64位操作系統:

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

在64位Windows中,OS設置環境變量「PROGRAMFILES(X86)」,但它不不適用於32位系統。它沒有讓我失望尚未...

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) 
相關問題