Могу ли я определить, нахожусь ли я на ОС Win7 от VB6? - PullRequest
3 голосов
/ 12 мая 2011

У меня есть старая программа, написанная на VB6, которая должна работать на 3 разных платформах, включая мой ноутбук с Win7.Я гуглил, как определить ОС из VB6, и нашел некоторый код, который я слегка изменил следующим образом:

Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer

Public Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId 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 As Long = 2


Private Function GetOS() As String
    Dim osinfo As OSVERSIONINFO
    Dim retvalue As Integer
    Dim sOS as String

    osinfo.dwOSVersionInfoSize = 148
    osinfo.szCSDVersion = Space$(128)
    retvalue = GetVersionExA(osinfo)

    Select Case osinfo.dwMajorVersion
        Case 7
            sOS = "?"  'Win7?
        Case 6
            sOS = "Vista"
         Case 5
            sOS = "XP"
         Case 4
            sOS = "Win2000"
     End Select

     MsgBox (sOS)
     return sOS     

End Function

Когда я запускаю это с моего ноутбука WIN7, osinfo.dwMajorVersion = 5, что говорит о том, что он на XPмашина.

Что здесь происходит?Могу ли я определить, использую ли я Win7, используя этот метод?Какой лучший способ получить нужную мне информацию?

Ответы [ 7 ]

8 голосов
/ 12 мая 2011

Windows 7 на самом деле версия 6.1 , а не версия 7. Вы проверяете неправильный номер. В противном случае, я не совсем уверен, почему код, который вы показали, не работает. По крайней мере, одна проблема заключается в том, что в VB 6 нет ключевого слова return. Последняя строка в вашей функции GetOS должна быть GetOS = sOS. Как только я исправлю эти проблемы, у меня это тоже будет отлично работать.

У меня есть полное рабочее решение, доступное здесь . Он обнаруживает все известные версии Windows быстро и точно. Я лично проверил это, по крайней мере, на 5 разных версиях Windows без каких-либо проблем. Все, что вам нужно сделать, это скопировать и вставить код в ваш проект, и он просто работает.

Вот доказательство того, что он работает правильно на моем ноутбуке с Windows 7:

Я действительно не уверен, почему все так стараются предложить альтернативные, частично работающие решения. Этот гарантирован на работу или ваши деньги обратно. Если это не работает для вас, убедитесь, что вы не запускаете приложение в «Режим Windows XP» или на какой-либо другой виртуальной машине.

4 голосов
/ 12 мая 2011

Windows 7 имеет версию 6.1.7600, это Majorversion 6, minorversion 1, build 7600 в вашем коде.Причина, по которой вы видите MajorVersion 5, возможно, связана с настройкой совместимости.Щелкните правой кнопкой мыши свой .exe, выберите свойства и перейдите на вкладку «Совместимость».

3 голосов
/ 18 ноября 2012

Я перепробовал все вызовы API и код, но всегда получал Windows XP по той или иной причине.Использовал этот "хак", чтобы решить мою проблему, и он работает для меня.

Private Function GetMyWindowsVersion() As String    
Dim r As Long, bFile As Integer, verString As String, fResult As String, bracketStart As Integer, verInfo As String, bracketEnd As Integer, versionLength As Integer

fResult = "Windows OS"

bFile = FreeFile
Open App.Path & "\checkos.bat" For Output As #bFile    
    Print #bFile, "@echo off"    
    Print #bFile, "ver > version.txt"    
    Print #bFile, "exit"    
Close #bFile

r = Shell(App.Path & "\checkos.bat", vbMinimizedNoFocus)

bFile = FreeFile    
Open App.Path & "\version.txt" For Input As #bFile    
    Do Until EOF(bFile)    
        Line Input #bFile, verString    
        If Trim(verString) <> "" Then    
            bracketStart = InStr(verString, "[")    
            bracketEnd = InStr(verString, "]")    
            If bracketStart And bracketEnd > 0 Then    
                versionLength = bracketEnd - bracketStart    
                verInfo = Mid(verString, bracketStart + 1, versionLength - 1)    
                If InStr(verString, "6.2") Then    
                    fResult = "Windows 8 " & verInfo    
                End If    
                If InStr(verString, "6.1") Then    
                    fResult = "Windows 7 " & verInfo    
                End If    
                If InStr(verString, "5.") Then    
                    fResult = "Windows XP " & verInfo    
                End If    
                Exit Do    
                Else    
                fResult = verString    
                Exit Do    
            End If    
        End If    
    Loop    
Close #bFile    
GetMyWindowsVersion = fResult    
End Function
0 голосов
/ 13 февраля 2014

Это то, что вы ищете ....

Option Explicit



Private Const VER_PLATFORM_WIN32s = 0
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32_NT = 2

Private Const VER_NT_WORKSTATION = 1
Private Const VER_NT_DOMAIN_CONTROLLER = 2
Private Const VER_NT_SERVER = 3

Private Type OSVERSIONINFOEX
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
    wServicePackMajor As Integer
    wServicePackMinor As Integer
    wSuiteMask As Integer
    wProductType As Byte
    wReserved As Byte
End Type

Private Declare Function GetVersionExA Lib "kernel32" (ByRef lpVersionInformation As OSVERSIONINFOEX) As Long




Public Function GetWindowsVersion() As String
    Dim osinfo As OSVERSIONINFOEX
    Dim retvalue As Integer

    osinfo.dwOSVersionInfoSize = 148
    osinfo.szCSDVersion = Space$(128)
    retvalue = GetVersionExA(osinfo)

    With osinfo
        Select Case .dwPlatformId
            Case 1
                Select Case .dwMinorVersion
                    Case 0:         GetWindowsVersion = "Windows 95"
                    Case 10:        GetWindowsVersion = "Windows 98"
                    Case 90:        GetWindowsVersion = "Windows Millenium"
                End Select

            Case 2
                Select Case .dwMajorVersion
                    Case 3:         GetWindowsVersion = "Windows NT 3.51"
                    Case 4:         GetWindowsVersion = "Windows NT 4.0"

                    Case 5
                        Select Case .dwMinorVersion
                            Case 0: GetWindowsVersion = "Windows 2000"
                            Case 1: GetWindowsVersion = "Windows XP"
                            Case 2: GetWindowsVersion = "Windows 2003"
                        End Select

                    Case 6
                        Select Case .dwMinorVersion
                            Case 0: GetWindowsVersion = "Windows Vista/2008"
                            Case 1: GetWindowsVersion = "Windows 7/2008 R2"
                            Case 2: GetWindowsVersion = "Windows 8/2012"
                            Case 3: GetWindowsVersion = "Windows 8.1/2012 R2"
                        End Select
                End Select

            Case Else
                GetWindowsVersion = "Failed"
        End Select
    End With
End Function
0 голосов
/ 13 мая 2011

Спасибо за код. Однако я пробовал это на Windows 7 Ultimate, и он сообщает как «XP» с «версией 5.1»?

Хорошо, я только что попробовал следующее, и, кажется, работает нормально. Это использует элемент управления MS SysInfo.

Private Sub Command2_Click()

    Dim MsgEnd As String
    Select Case SysDetectOS.OSPlatform
        Case 0
            MsgEnd = "Unidentified"
        Case 1
            MsgEnd = "Windows 95, ver. " & _
                     CStr(SysDetectOS.OSVersion) & "(" & _
                     CStr(SysDetectOS.OSBuild) & ")"
        Case 2
            MsgEnd = "Windows NT, ver. " & _
                     CStr(SysDetectOS.OSVersion) & "(" & _
                     CStr(SysDetectOS.OSBuild) & ")"

            If SysDetectOS.OSVersion >= 6.01 Then
                MsgEnd = MsgEnd + " Win7"
            End If        
    End Select
    MsgBox "System: " & MsgEnd    
End Sub
0 голосов
/ 12 мая 2011

Ваши поиски неверны; dwMajorVersion 5 - это win2k или XP, 6 - это сервер 2k8 R2 или Win 7 - вам нужно принять во внимание dwMinorVersion, чтобы сделать ваше обнаружение точным. ( Таблица значений )

0 голосов
/ 12 мая 2011

Взгляните на следующий сайт . Это работает для обнаружения Vista и Windows 2008, с некоторыми незначительными улучшениями, это должно работать для Windows 7.

...