2011-01-29 18 views
17

मैं 95 से विन 7 तक किसी भी विंडोज संस्करण का पता लगाना चाहता हूं।मैं वीबी 6 ऐप से विंडोज संस्करण कैसे निर्धारित कर सकता हूं?

मैं यह भी प्रदर्शित करना चाहता हूं कि ओएस 32-बिट या 64-बिट है या नहीं।

यही है; यह इत्ना आसान है। :) वीबी 6 एप्लिकेशन के भीतर से ऐसा करने के लिए मैं किस कोड का उपयोग कर सकता हूं?

उत्तर

27

अद्यतन मिलान करने के लिए: कोड है कि सही ढंग से Windows 8.1 और Windows 10 का पता लगाता है के लिए , this answer देखें।

अभी भी Windows के पुराने संस्करणों के लिए ठीक काम करता है, लेकिन यह कुछ भी नया रिपोर्ट विंडोज 8 से Windows 8

नीचे दिखाया गया "bitness" परीक्षण कोड होने के रूप में होगा नीचे कोड (यदि ओएस को देखने के लिए 32-बिट या 64-बिट अभी भी काम करता है, यहां तक ​​कि विंडोज 10.

पर निम्न कोड विंडोज के वर्तमान संस्करण का संकेत एक स्ट्रिंग मान वापस आ जाएगी है। Windows से सिस्टम संस्करण संख्या हो रही मूल रूप से, यह सब कर रहा है है GetVersionEx API function का उपयोग करके, और उसके बाद विंडोज के ज्ञात संस्करणों से मेल खाते हैं।

(ध्यान दें कि कुछ चीजें पूरी तरह से नहीं मिली हैं। उदाहरण के लिए, Windows XP का 64-बिट संस्करण सर्वर 2003 के रूप में रिपोर्ट किया जाएगा। यह निर्धारित करने के लिए कोड कि उपयोगकर्ता Windows Vista या Server 2008 चला रहा है, उदाहरण के लिए, भी लिखा नहीं गया है। लेकिन आप इस ले जा सकते हैं और यह tweak के रूप में वांछित।)

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 पास करके और अधिक जानकारी प्राप्त कर सकते हैं। मैंने बस उस कोड को सी ++ में लिखा है, और दस्तावेज़ीकरण का पालन करना आश्चर्यजनक रूप से आसान है।


निर्धारण करता है, तो मेजबान ओएस 32-बिट या एक वीबी 6 निष्पादन से 64-बिट एक छोटे से जटिल काम है है। इसका कारण यह है कि वीबी 6 64-बिट अनुप्रयोगों को संकलित नहीं कर सकता है। वीबी 6 में जो कुछ भी आप लिखते हैं वह 32-बिट एप्लिकेशन के रूप में चलाया जाएगा। और 32-बिट अनुप्रयोग विंडोज़-ऑन-विंडोज (WOW64) उपप्रणाली में विंडोज़ के 64-बिट संस्करणों पर चलते हैं। वे हमेशा विंडोज़ के मौजूदा संस्करण की रिपोर्ट 32-बिट के रूप में करेंगे, क्योंकि वे यही देखते हैं।

हम शुरू में यह मानकर काम कर सकते हैं कि मेजबान ओएस 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 
+0

osv.OSVSize = लेन (ओएसवी) मुझे VB2010Espress में एक त्रुटि प्राप्त करता है: वैरिएबल 'ओएसवी' का उपयोग एवी को सौंपा जाने से पहले किया जाता है alue .... –

+0

@RemusRigo: ** हां, ज़ाहिर है! ** यह कोड * वीबी 6 * के लिए है, पुराना संस्करण पिछली बार 1 99 8 में अपडेट किया गया था। 2002 से विजुअल बेसिक के प्रत्येक संस्करण (जिसे वीबी 7 कहा जाता है) .NET Framework पर आधारित है, और मूल रूप से VB.NET भी कहा जाता था। तब से उन्होंने ".NET" भाग गिरा दिया है क्योंकि हर कोई पूरी तरह से वीबी 6 के बारे में भूल गया है। यह माइक्रोसॉफ्ट द्वारा अब भी समर्थित नहीं है क्योंकि यह लगभग 15 साल पुराना है। वीबी 6 और वीबी.नेट * पूरी तरह से * अलग हैं, और कोड जो एक ** में काम करता है, दूसरे में ** काम नहीं करेगा। आपको .NET कोड लिखना होगा। आप गलत टैग के साथ प्रश्न देख रहे हैं। –

+0

मैं वीबी/वीबी.नेट के लिए नया हूं, क्या आप मुझे बता सकते हैं कि त्रुटि को कैसे ठीक किया जाए? –

0

आह, इसे मिला! मैं व्यक्तिगत रूप से इस वर्ग का उपयोग नहीं करता क्योंकि मेरी ज़रूरतों के लिए यह अधिक है, लेकिन यह निश्चित रूप से सबसे अच्छा ओपिस संस्करण उदाहरण है जो मैंने पार किया है। इसके लिए क्रेडिट केनेथ इव्स में जाता है।

* मुझे लगता है कि स्टैक ओवरफ्लो को कोड के भारी ब्लॉक पसंद नहीं हैं, इसलिए कक्षा (clsOperSystem.cls) KiCrypt Demo में स्थित है, हैश और एन्क्रिप्शन एल्गोरिदम का उत्कृष्ट संकलन।

2

आप कर सकते थे माइक्रोसॉफ्ट Sysinfo control कि VB6 के साथ आता है का उपयोग करके देखें और OSPlatform, OSBuild के लिए जाँच करें और OSVersion propertys के साथ उचित OS Version #

4

WMI Tasks for Operating Systems भी है।

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 

आप Version मान पार्स, या पार्स करने के लिए सादा पाठ Caption मूल्य है, जो Microsoft(R) Windows(R) Server 2003, Standard Edition और Microsoft Windows 7 Professional तरह प्रविष्टियां मौजूद हैं ऊपर कोड़ी ग्रे द्वारा प्रदान की मामले में बयान के लिए इसी तरह कुछ कर सकते हैं।

1

स्वीकार किए गए उत्तर ने मेरे आवेदन के लिए काम किया जब तक कि मैंने इसे विंडोज 10 पर नहीं किया। संस्करण संख्या विवरण as listed here के लिए कोड को अपडेट करने के बाद भी यह गलत विंडोज संस्करण की सूचना दी। यह पता चला है क्योंकि:

विंडोज 8.1 या विंडोज 10 के लिए प्रकट नहीं किए गए एप्लिकेशन विंडोज 8 ओएस संस्करण मान (6.2) वापस कर देंगे। एक बार एक ऑपरेटिंग सिस्टम संस्करण के लिए एप्लिकेशन प्रकट होने के बाद, GetVersionEx हमेशा उस संस्करण को वापस कर देगा जो भविष्य में रिलीज़ के लिए एप्लिकेशन प्रकट होता है। विंडोज 8.1 या विंडोज 10 के लिए अपने अनुप्रयोगों को प्रकट करने के लिए, Targeting your application for 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 एपीआई अपेक्षा के अनुरूप काम करता है। यह मैनिफेस्ट अनुभाग विंडोज 7 के रूप में नया था, मुझे विश्वास है।

हालांकि, एक बहुत ही महत्वपूर्ण चेतावनी यह है कि आपको वास्तव में प्रत्येक ऑपरेटिंग सिस्टम संस्करण पर अपने आवेदन का परीक्षण करना होगा जिसे आप इसे संगत के रूप में सूचीबद्ध करते हैं। ये सेटिंग्स कुछ विंडोज फ़ंक्शंस को प्रभावित करती हैं, न केवल विंडोज संस्करण की जानकारी की सूचना दी जाती है।

+0

अच्छा, अधिक जानकारी के लिए कोडी ग्रे के अपडेट किए गए लिंक को ऊपर देखें।हालांकि यहां पहला जवाब मेरे उद्देश्यों के अनुरूप है क्योंकि W10 संस्करण की परवाह नहीं है (हालांकि इसे चलाने के बावजूद): पी, –

1

यहाँ एक बहुत ही सरल विधि मैं 32 बनाम 64 बिट ऑपरेटिंग सिस्टम का निर्धारण करने के लिए उपयोग है:

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

64-बिट Windows में, ओएस सेट वातावरण चर "ProgramFiles (x86)" लेकिन यह नहीं करता है 32-बिट सिस्टम पर नहीं है। यह मुझे अभी तक WINDOWS पर विफल नहीं है ...

0

काम 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)