95からWin 7までのWindowsバージョンを検出したい。
OSが32ビットか64ビットかを表示したい。
それでおしまい;とても簡単です。 :) VB 6アプリケーション内からこれを行うためにどのコードを使用できますか?
更新:Windows 8.1およびWindows 10を正しく検出するコードについては、 この回答 を参照してください。
以下のコードは、古いバージョンのWindowsでも問題なく機能しますが、Windows 8より新しいものはすべてWindows 8として報告されます。
下部に表示されている「ビット数」テストコード(OSが32ビットか64ビットかを確認するには、Windows 10でも動作します。
次のコードは、Windowsの現在のバージョンを示す文字列値を返します。基本的には、 GetVersionEx
API関数 を使用して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実行可能ファイルからホストOSが32ビットか64ビットかを判断するのは少し難しいです。理由はVB 6は64ビットアプリケーションをコンパイルします。VB 6で記述したものはすべて、32ビットアプリケーションとして実行されます。32ビットアプリケーションは、Windows-on-Windowsの64ビットバージョンのWindowsで実行されます。 (WOW64)サブシステム。Windowsの現在のバージョンを常に32ビットとして報告します。
ホストOSが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
オペレーティングシステムの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によって提供されたcaseステートメントと同様のことを実行して、Version
値を解析するか、Microsoft(R) Windows(R) Server 2003, Standard Edition
のようなリストがあるプレーンテキストCaption
値を解析できます。 _Microsoft Windows 7 Professional
_。
VB6に付属しているMicrosoft Sysinfo control を使用してみて、OSPlatform、OSBuild、およびOSVersionプロパティが適切な OSバージョン# と一致することを確認してください。
32ビットと64ビットのオペレーティングシステムを判別するために使用する非常に簡単な方法を次に示します。
OSBits = IIf(Len(Environ$("PROGRAMFILES(X86)")) > 0, 64, 32)
64ビットWindowsでは、OSは環境変数「PROGRAMFILES(X86)」を設定しますが、32ビットシステムでは設定しません。まだ失敗していません...
受け入れられた回答は、Windows 10で試すまで私のアプリケーションで機能しました。バージョン番号の詳細のコードを更新した後でも ここにリストされているように 間違ったWindowsバージョンを報告しました。これは次の理由によります:
Windows 8.1またはWindows 10で明示されていないアプリケーションは、Windows 8 OSバージョン値(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の機能にも影響します。
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)
ああ、見つけた!私は個人的にこのクラスを使用していません。これは、必要以上に過剰であるためです。しかし、これは、私が遭遇した中で最も完全なOpSysバージョンの例です。これは、Kenneth Ives氏の功績によるものです。
* StackOverflowはコードの巨大なブロックを好まないので、クラス(clsOperSystem.cls)は KiCrypt Demo にあり、ハッシュと暗号化アルゴリズムの優れたコンパイルです。