95からWin7までのWindowsバージョンを検出したい。
OSが32ビットか64ビットかを表示したいのですが。
それでおしまい; とても簡単です。:) VB 6アプリケーション内からこれを行うためにどのコードを使用できますか?
95からWin7までのWindowsバージョンを検出したい。
OSが32ビットか64ビットかを表示したいのですが。
それでおしまい; とても簡単です。:) VB 6アプリケーション内からこれを行うためにどのコードを使用できますか?
更新: Windows8.1およびWindows10を正しく検出するコードについては、この回答を参照してください。
以下のコードは、古いバージョンのWindowsでも正常に機能しますが、Windows8より新しいものはすべてWindows8として報告されます。
下部に表示されている「ビットネス」テストコード(OSが32ビットか64ビットかを確認するために、Windows10でも機能します。
次のコードは、Windowsの現在のバージョンを示す文字列値を返します。GetVersionEx
基本的には、 API関数を使用してWindowsからシステムバージョン番号を取得し、それらを既知のバージョンのWindowsと照合するだけです。
(完全に検出されないものもあることに注意してください。たとえば、64ビットバージョンのWindowsXPはServer2003として報告される可能性があります。たとえば、ユーザーがWindowsVistaまたはServer2008を実行しているかどうかを判断するコードも検出されていません。書かれていますが、これを取り、必要に応じて微調整することができます。)
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++で書いたばかりで、ドキュメントは驚くほど簡単に理解できます。
ホストOSがVB6実行可能ファイルから32ビットか64ビットかを判断するのは、少し注意が必要です。その理由は、VB6が64ビットアプリケーションをコンパイルできないためです。VB 6で記述したものはすべて、32ビットアプリケーションとして実行されます。また、32ビットアプリケーションは、Windows-on-Windows(WOW64)サブシステムの64ビットバージョンのWindowsで実行されます。彼らは常に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
上記のCodyGrayによって提供されたcaseステートメントと同様のことを実行して、値を解析するか、およびのようなリストを持つVersion
プレーンテキスト値を解析できます。Caption
Microsoft(R) Windows(R) Server 2003, Standard Edition
Microsoft Windows 7 Professional
VB6に付属のMicrosoftSysinfoコントロールを使用して、OSPlatform、OSBuild、およびOSVersionのプロパティが適切なOSバージョンと一致するかどうかを確認してください。
受け入れられた答えは、Windows 10で試すまで、私のアプリケーションで機能しました。ここにリストされているバージョン番号の詳細のコードを更新した後でも、間違ったWindowsバージョンが報告されました。これは次の理由によることがわかります。
Windows8.1またはWindows10でマニフェストされていないアプリケーションは、Windows 8 OSのバージョン値(6.2)を返します。特定のオペレーティングシステムバージョンに対してアプリケーションがマニフェストされると、GetVersionExは、将来のリリースでアプリケーションがマニフェストされるバージョンを常に返します。Windows8.1またはWindows10用のアプリケーションをマニフェストするには、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>
そして、GetVersionInfoAPIは期待どおりに機能します。このマニフェストセクションは、Windows7の時点で新しいものだと思います。
ただし、非常に重要な注意点は、互換性があるとリストしている各オペレーティングシステムバージョンでアプリケーションを実際にテストしている必要があるということです。これらの設定は、Windowsのバージョン情報が報告される方法だけでなく、特定のWindows機能に影響します。
これは、32ビットと64ビットのオペレーティングシステムを判別するために使用する非常に簡単な方法です。
OSBits = IIf(Len(Environ$("PROGRAMFILES(X86)")) > 0, 64, 32)
64ビットWindowsでは、OSは環境変数「PROGRAMFILES(X86)」を設定しますが、32ビットシステムでは設定しません。まだ失敗していません...
ああ、見つけた!私のニーズのためにこのクラスを個人的に使用することはありませんが、これは間違いなく私が遭遇した中で最も徹底的なOpSysバージョンの例です。これのクレジットはケネスアイブスに行きます。
* StackOverflowは巨大なコードブロックを好まないので、クラス(clsOperSystem.cls)はハッシュと暗号化アルゴリズムの優れたコンパイルであるKiCryptデモにあります。
WINDOWS10VB6で動作する -デバッグモードでは動作しない-実行時にのみ動作する
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)