Update: Per il codice che rileva correttamente di Windows 8.1 e Windows 10 , vedi this answer.
Il codice sotto funziona ancora bene per le vecchie versioni di Windows, ma segnalerà nulla più recente di Windows 8 come Windows 8.
Il "numero di bit" codice di test mostrato in basso (per vedere se il sistema operativo è a 32-bit o 64-bit funziona ancora, anche su Windows 10.
il seguente codice restituirà un valore stringa che indica la versione corrente di Windows. in pratica, tutto ciò che sta facendo sta ottenendo i numeri di versione del sistema da Windows utilizzando GetVersionEx
API function e quindi confrontandoli con le versioni note di Windows.
(notare che alcune cose non vengono rilevate perfettamente. Ad esempio, una versione a 64 bit di Windows XP verrebbe probabilmente segnalata come Server 2003. Il codice per determinare se l'utente esegue Windows Vista o Server 2008, ad esempio, non è stato ancora scritto. Ma si può prendere questo e modificarlo, se lo desideri.)
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
Inoltre, se non avete bisogno di indirizzare le prime versioni di Windows, è possibile ottenere ulteriori informazioni facendo passare il OSVERSIONINFOEX
structure invece. Ho appena scritto quel codice in C++ e la documentazione è sorprendentemente facile da seguire.
Determinare se il sistema operativo host è a 32-bit o 64-bit da un VB 6 eseguibile è un po 'più complicato. Il motivo è che VB 6 non può compilare applicazioni a 64 bit. Tutto ciò che scrivi in VB 6 verrà eseguito come un'applicazione a 32 bit. E le applicazioni a 32 bit vengono eseguite su versioni a 64 bit di Windows nel sottosistema Windows-on-Windows (WOW64). Riporteranno sempre la versione corrente di Windows come 32-bit, perché è quello che vedono.
Siamo in grado di aggirare questo presupponendo inizialmente che il sistema operativo host sia a 32 bit e che tenti di dimostrare questo errore. Ecco alcuni esempi di codice:
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
osv.OSVSize = Len (osv) mi riceve un errore in VB2010Espress: la variabile 'osv' viene utilizzata prima che sia stata assegnata ale .... –
@RemusRigo: ** Sì, certo! ** Questo codice è per * VB 6 *, la vecchia versione aggiornata l'ultima volta intorno al 1998. Ogni versione di Visual Basic dal 2002 (chiamata VB 7) ha stato basato su .NET Framework e originariamente era chiamato VB.NET. Da allora hanno abbandonato la parte ".NET" perché tutti sono completamente dimenticati di VB 6. Non è nemmeno più supportato da Microsoft perché ha quasi 15 anni. VB 6 e VB.NET sono * totalmente * diversi, e il codice che funziona in uno ** non funzionerà ** nell'altro. È necessario scrivere codice .NET. Stai guardando le domande con il tag sbagliato. –
Sono nuovo a VB/VB.NET, puoi dirmi come correggere l'errore? –