PDA

View Full Version : کد VB برای تشخیص تمام نسخه های ویندوز



بابک زواری
پنج شنبه 16 بهمن 1382, 18:05 عصر
این کد برای اجرا نیاز به یک ماژول یک فرم که روی آن دو لیبل باشه دارد در کد توضیحات لازمه هست و تمام و یندوزها رو از هم تشخیص میده .
موفق باشید

'This example needs a form and a module.
'On the form, their should be two Labels (lbl_operatingplatform
'and lbl_operatingsystem)
'IN A FORM:
Private Sub Form_Load()
Select Case OperatingPlatform
Case Enum_OperatingPlatform.Platform_Windows_32: lbl_operatingplatform.Caption = "Windows 32"
Case Enum_OperatingPlatform.Platform_Windows_95_98_ME: lbl_operatingplatform.Caption = "Windows 95/98/ME"
Case Enum_OperatingPlatform.Platform_Windows_NT_2K_XP: lbl_operatingplatform.Caption = "Windows NT/2K"
End Select
Select Case OperatingSystem
Case System_Windows_32: lbl_operatingsystem.Caption = "Windows 32"
Case System_Windows_95: lbl_operatingsystem.Caption = "Windows 95"
Case System_Windows_98: lbl_operatingsystem.Caption = "Windows 98"
Case System_Windows_ME: lbl_operatingsystem.Caption = "Windows ME"
Case System_Windows_NT: lbl_operatingsystem.Caption = "Windows NT"
Case System_Windows_2K: lbl_operatingsystem.Caption = "Windows 2K"
Case System_Windows_XP: lbl_operatingsystem.Caption = "Windows XP"
End Select
End Sub
'IN A MODULE:
Private Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Public Enum Enum_OperatingPlatform
Platform_Windows_32 = 0
Platform_Windows_95_98_ME = 1
Platform_Windows_NT_2K_XP = 2
End Enum
Public Enum Enum_OperatingSystem
System_Windows_32 = 0
System_Windows_95 = 1
System_Windows_98 = 2
System_Windows_ME = 3
System_Windows_NT = 4
System_Windows_2K = 5
System_Windows_XP = 6
End Enum
Public Function OperatingPlatform() As Enum_OperatingPlatform
Dim lpVersionInformation As OSVERSIONINFO
lpVersionInformation.dwOSVersionInfoSize = Len(lpVersionInformation)
Call GetVersionExA(lpVersionInformation)
OperatingPlatform = lpVersionInformation.dwPlatformId
End Function
Public Function OperatingSystem() As Enum_OperatingSystem
Dim lpVersionInformation As OSVERSIONINFO
lpVersionInformation.dwOSVersionInfoSize = Len(lpVersionInformation)
Call GetVersionExA(lpVersionInformation)
If (lpVersionInformation.dwPlatformId = Platform_Windows_32) Then
OperatingSystem = System_Windows_32
ElseIf (lpVersionInformation.dwPlatformId = Platform_Windows_95_98_ME) And (lpVersionInformation.dwMinorVersion = 0) Then
OperatingSystem = System_Windows_95
ElseIf (lpVersionInformation.dwPlatformId = Platform_Windows_95_98_ME) And (lpVersionInformation.dwMinorVersion = 10) Then
OperatingSystem = System_Windows_98
ElseIf (lpVersionInformation.dwPlatformId = Platform_Windows_95_98_ME) And (lpVersionInformation.dwMinorVersion = 90) Then
OperatingSystem = System_Windows_ME
ElseIf (lpVersionInformation.dwPlatformId = Platform_Windows_NT_2K_XP) And (lpVersionInformation.dwMajorVersion < 5) Then
OperatingSystem = System_Windows_NT
ElseIf (lpVersionInformation.dwPlatformId = Platform_Windows_NT_2K_XP) And (lpVersionInformation.dwMajorVersion = 5) And (lpVersionInformation.dwMinorVersion = 0) Then
OperatingSystem = System_Windows_2K
ElseIf (lpVersionInformation.dwPlatformId = Platform_Windows_NT_2K_XP) And (lpVersionInformation.dwMajorVersion = 5) And (lpVersionInformation.dwMinorVersion = 1) Then
OperatingSystem = System_Windows_XP
End If
End Function

sohrab o
شنبه 22 بهمن 1384, 19:07 عصر
آقا ویندوز من xp اما بهم میگه NT

بابک زواری
شنبه 22 بهمن 1384, 21:16 عصر
سهراب جان مثل اینکه مسئول پرونده های راکد شدی :چشمک:
این کد ما N سال پیشه ؛ اما درستی ایش رو که من مطمئنم ؛ چون خیلی جاها داره استفاده میشه و یک کد استاندارد هست.
یک تست دیگه رو کامپیوترهای دیگه بکن ببین چی میگه ؛ یک نگاه هم بکن ببین ویندوزت مشکل نداره .
موفق باشی

saina2006
شنبه 22 بهمن 1384, 22:16 عصر
منم امتحان کردم و ویندوزم را NT می گه در حالی که XP است

sohrab o
شنبه 22 بهمن 1384, 23:02 عصر
ببخشید که من به موضوعات قدیمی توجه میکنم
من چون تازه وارد سایت شدم مسائل برام تازگی داره
بازم شرمنده

mr.eyar
یک شنبه 08 مرداد 1391, 12:07 عصر
سلام
با استفاده از توابع API + دوتا تکست باکس
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long

Private Sub Command1_Click()
End
End Sub

Private Sub Form_Load()
Dim Info As OSVERSIONINFO, strOs As String
Dim Retval As Long, Result As String

Me.AutoRedraw = True
Info.dwOSVersionInfoSize = Len(Info)
Retval = GetVersionEx(Info)
If Retval = 0 Then MsgBox "Error": Exit Sub
Select Case Info.dwPlatformId
Case 0
strOs = "Windows 3.x"
Case 1
If (Info.dwMinorVersion = 0) Then
strOs = "Windows 95"
End If
If (Info.dwMinorVersion = 10) Then
strOs = "Windows 98"
End If
If (Info.dwMinorVersion = 90) Then
strOs = "Windows ME"
End If
Case 2
If (Info.dwMajorVersion < 5) Then
strOs = "Windows NT"
End If
If (Info.dwMajorVersion = 5 And Info.dwMinorVersion = 0) Then
strOs = "Windows 2K"
End If
If (Info.dwMajorVersion = 5 And Info.dwMinorVersion = 1) Then
strOs = "Windows XP"
End If
End Select
Text1.Text = strOs
Result = Str$(Info.dwMajorVersion) + "." + LTrim(Str(Info.dwMinorVersion))
Text2.Text = Result
End Sub

mohammadriano
یک شنبه 08 مرداد 1391, 13:47 عصر
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
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 = "NT"

Select Case osv.dwVerMajor
Case 3
GetWindowsVersion = "NT 3.5"
Case 4
GetWindowsVersion = "NT 4.0"
Case 5
Select Case osv.dwVerMinor
Case 0
GetWindowsVersion = "2000"
Case 1
GetWindowsVersion = "XP"
Case 2
GetWindowsVersion = "Server 2003"
End Select
Case 6
Select Case osv.dwVerMinor
Case 0
GetWindowsVersion = "Vista"
Case 1
GetWindowsVersion = "Windows 7"
End Select
End Select

Case VER_PLATFORM_WIN32_WINDOWS:
Select Case osv.dwVerMinor
Case 0
GetWindowsVersion = "95"
Case 90
GetWindowsVersion = "Me"
Case Else
GetWindowsVersion = "98"
End Select
End Select
Else
GetWindowsVersion = "Unable to identify your version of Windows."
End If
End Function

meys34
یک شنبه 08 مرداد 1391, 17:53 عصر
مرسی کد جالب و روونی بود فقط برای WIN8(6.2) هم اینو اضافه کنیم

Case 6
Select Case osv.dwVerMinor
Case 0
GetWindowsVersion = "Vista"
Case 1
GetWindowsVersion = "Windows 7"
Case 2
GetWindowsVersion = "Windows 8"
End Select



از زمان ویندوز 2000 به بعد هم یه امکان جدید اضافه شده به این تابع که میتونیم Service Pack رو بدست بیاریم:

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


برای استفاده از این تابع یه برنامه نوشتم که ضمیمه کردم... برای Windows 1.0 جواب میده تا Windows 8

فقط توجه کنید که برای ویندوز های قدیمی تابع جدید جواب نمیده برای حل مشکل از کد زیر استفاده شد


Public Function GetOSVersionString() As String

Dim osv As OSVERSIONINFO
Dim osvEx As OSVERSIONINFOEX
Dim Result As Long
' first call GetVersionEx with an OSVERSIONINFOEX structure
' if this returns 0, it is not supported
' and retry with an OSVERSIONINFO
osvEx.dwOSVersionExInfoSize = Len(osvEx)
Result = GetVersionEx(osvEx)
If Result = 0 Then
osv.dwOSVersionInfoSize = Len(osv)
If GetVersionEx2(osv) = 1 Then
GetOSVersionString = GetOSVersion(osv)
Else
GetOSVersionString = "Unknown"
End If
Else
GetOSVersionString = GetOSVersionEx(osvEx)
End If

End Function



منابع:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx
http://he.xian.blog.163.com/blog/static/39039010201072291134216/



لطفا از ضمیمه پست بعدی استفاده کنید...

meys34
چهارشنبه 08 شهریور 1391, 13:19 عصر
سلام دوستان
با اومدن ویندوز 8 خودم برنامه پست قبلی رو تست کردم و دیدم edition ویندوز رو غلط تشخیص میده (البته بعدا فهمیدم مشکل از جای دیگه است و تو ویندوز قبلی هم شانسی درست جواب داده بوده)

92001


به همین خاطر دست به کار شدم و همون کاری رو کردم که msdn گفته بود و از تابع زیر استفاده کردم
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724358(v=vs.85).aspx

Private Declare Function GetProductInfo Lib "Kernel32" ( _
ByVal dwOSMajorVersion As Long, _
ByVal dwOSMinorVersion As Long, _
ByVal dwSpMajorVersion As Long, _
ByVal dwSpMinorVersion As Long, _
ByRef pdwReturnedProductType As Long _
) As Boolean

یه چنتا لوگو هم از ویندوز های مختلف پیدا کردم بهش اضافه کردم...
این هم تصویر نهایی

92003



چقدر این لوگوی ویندوز هشت شبیه اولین نسخه از ویندوزها هست:متفکر::متفکر::متفکر::متف ر:

92004

mohammadriano
پنج شنبه 09 شهریور 1391, 05:08 صبح
سلام دوستان
با اومدن ویندوز 8 خودم برنامه پست قبلی رو تست کردم و دیدم edition ویندوز رو غلط تشخیص میده (البته بعدا فهمیدم مشکل از جای دیگه است و تو ویندوز قبلی هم شانسی درست جواب داده بوده)

مطمعن هستید از نسخه اورجینال ویندوز 8 استفاده می کنید؟!
ببین عزیز من شما Compatibility ویژوال بیسیک 6 رو روی هر کدام از نسخه های قبلی ویندوز تنظیم کنید در زمانی که برنامه خودتون رو از داخل VB6 اجرا کنید Compatibility تنظیم شده شما را نشان می دهد.
92040
ولی زمانی که exe از برنامه خودتون تهیه می کنید دقیقاً ویندوز شما را شناسایی می کند.
ضمیمه ها

project.vbp
92041

project.exe
92042

موفق باشید

meys34
پنج شنبه 09 شهریور 1391, 14:45 عصر
مطمعن هستید از نسخه اورجینال ویندوز 8 استفاده می کنید؟!
نه...
ولی مطمئن هستم که هنوز ویندوز 8 اورجینال رسما نیومده... میگن این نسخه ای که داریم RTM هست که بیرون درز کرده ولی فقط خدا عالمه که چیه...


با اومدن ویندوز 8 خودم برنامه پست قبلی رو تست کردم و دیدم edition ویندوز رو غلط تشخیص میده (البته بعدا فهمیدم مشکل از جای دیگه است و تو ویندوز قبلی هم شانسی درست جواب داده بوده)

محمد جان ایراد از کدهاش بود... اینجا رو ببین
Select Case GetVersionEx.wProductType
Case PRODUCT_BUSINESS
GetOSVersionEx = "Business"
معنای GetVersionEx.wProductType اینه که توسایت MSDN نوشته...



wProductType

Any additional information about the system. This member can be one of the following values.

VER_NT_DOMAIN_CONTROLLER 0x0000002
VER_NT_SERVER 0x0000003
VER_NT_WORKSTATION 0x0000001


ایراد کار هم از اینجا بود... ویندوز من 7 Ultimate بود و خروجی GetVersionEx.wProductType برابر 1...

در حالی که تو ویندوز 8 Enterprise هم، این مقدار برابر 1 هست...



VER_NT_WORKSTATION 0x0000001 =The operating system is Windows 8, Windows 7, Windows Vista, Windows XP Professional, Windows XP Home Edition, or Windows 2000 Professional.

نتیجه اینکه کد قبلی همیشه edition ویندوز رو به اشتباه ultimate تشخیص خواهد داد...:متفکر::متفکر::متفکر::مت فکر:

Private Const PRODUCT_ULTIMATE As Long = &H1
:شیطان::شیطان:
برای بدست آوردن edition از یه تابع دیگه باید استفاده می شد... به همین خاطر ضمیمه پست قبلی ام رو پاک کردم و کد جدید قرار دادم...
و نتیجه شد این

http://barnamenevis.org/attachment.php?attachmentid=92003&d=1346230847

البته یادم رفت بگم که edition هایی رو هم به کد جدید اضافه کردم(از خودم که نه از سایت microsoft)...
مثلا نسخه های مهمی چون Enterprise ، PRODUCT_CORE ، Hyper-V Server و ... هم اضافه شد که قبلا نبود...

:لبخندساده::لبخندساده::لبخن ساده::لبخندساده::لبخندساده: :لبخندساده::لبخندساده::لبخن ساده::لبخندساده::لبخندساده: :لبخندساده::لبخندساده::لبخن ساده::لبخندساده::لبخندساده:




ببین عزیز من شما Compatibility ویژوال بیسیک 6 رو روی هر کدام از نسخه های قبلی ویندوز تنظیم کنید در زمانی که برنامه خودتون رو از داخل VB6 اجرا کنید Compatibility تنظیم شده شما را نشان می دهد.

ولی زمانی که exe از برنامه خودتون تهیه می کنید دقیقاً ویندوز شما را شناسایی می کند.

موفق باشید

مرسی جالب بود... امتحان نکرده بودم...
جالبه که MSDN چیز دیگه ای گفته...


If compatibility mode is in effect, the GetVersionEx function reports the operating system as it identifies itself, which may not be the operating system that is installed. For example, if compatibility mode is in effect, GetVersionEx reports the operating system that is selected for application compatibility.

حالا اگه بخواهیم فایل exe مون مثل برنامه های دیگه compatibility رو تشخیص بده چیکار کنیم؟؟؟؟