web-dev-qa-db-ja.com

VB 6アプリからWindowsバージョンを確認するにはどうすればよいですか?

95からWin 7までのWindowsバージョンを検出したい。

OSが32ビットか64ビットかを表示したい。

それでおしまい;とても簡単です。 :) VB 6アプリケーション内からこれを行うためにどのコードを使用できますか?

18
SOF User

更新:Windows 8.1およびWindows 10を正しく検出するコードについては、 この回答 を参照してください。

以下のコードは、古いバージョンのWindowsでも問題なく機能しますが、Windows 8より新しいものはすべてWindows 8として報告されます。

下部に表示されている「ビット数」テストコード(OSが32ビットか64ビットかを確認するには、Windows 10でも動作します。

次のコードは、Windowsの現在のバージョンを示す文字列値を返します。基本的には、 GetVersionEx AP​​I関数 を使用して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
27
Cody Gray

オペレーティングシステムの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_。

4
Joe M

VB6に付属しているMicrosoft Sysinfo control を使用してみて、OSPlatform、OSBuild、およびOSVersionプロパティが適切な OSバージョン# と一致することを確認してください。

2
Mark Hall

32ビットと64ビットのオペレーティングシステムを判別するために使用する非常に簡単な方法を次に示します。

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

64ビットWindowsでは、OSは環境変数「PROGRAMFILES(X86)」を設定しますが、32ビットシステムでは設定しません。まだ失敗していません...

1
MountainMan

受け入れられた回答は、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の機能にも影響します。

1
UuDdLrLrSs

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)
0
zone zone

ああ、見つけた!私は個人的にこのクラスを使用していません。これは、必要以上に過剰であるためです。しかし、これは、私が遭遇した中で最も完全なOpSysバージョンの例です。これは、Kenneth Ives氏の功績によるものです。

* StackOverflowはコードの巨大なブロックを好まないので、クラス(clsOperSystem.cls)は KiCrypt Demo にあり、ハッシュと暗号化アルゴリズムの優れたコンパイルです。

0
Joe Jordan