PDA

View Full Version : سوال: مشکلات برنامه نویسی با وجود تفاوت بین xp و vista ( راه حل ؟ )



rezapassword
چهارشنبه 25 دی 1387, 17:49 عصر
سلام دوستان
برای برای بدست اوردن مقدار رم سیستم از این کد استفاده میکنم


Dim c As New Management.ManagementObjectSearcher("SELECT * FROM Win32_LogicalMemoryConfiguration")
Dim memory As String
'----------------------------
For Each ObjMng In c.Get
memory = ObjMng("TotalPhysicalMemory").ToString

Next
'---------------------------
TextBox4.Text = (memory)



اما ظاهرا این
FROM Win32_LogicalMemoryConfiguration
در ویندوز ویستا وجود نداره و برنامه خطا میده
از چه تابعی استفاده کنم که در xp و vista یک مقدار رو به من بده ؟
سپاس

Mehdi Asgari
پنج شنبه 26 دی 1387, 21:13 عصر
زیاد به WMI اعتماد نکن
می خواستم بگم برو از API استفاده کن (GlobalMemoryStatusEx ) ولی دیدم VB .NET خودش اینو داره:


Dim info As New Microsoft.VisualBasic.Devices.ComputerInfo()
Dim memory = info.TotalPhysicalMemory
Console.WriteLine("{0:0} GB = {1:0} MB", memory / (1024 ^ 3), memory / (1024 ^ 2))

rezapassword
جمعه 27 دی 1387, 10:06 صبح
سلام اقا مهدی
این استفاده شما از دیوایس عدد بسیار نا صحیحی رو میده
WMI بسیار دقیق تر هست
ایا با WMI نمیشود کاری کرد ؟
از پاسخت ممنونم

Mehdi Asgari
جمعه 27 دی 1387, 10:42 صبح
این هم قطعه کد جدید که علاوه بر کد بالایی ، از GlobalMemoryStatusEx هم استفاده می کنه.
هم روی Vista SP1 تست کردم و هم XP SP2 ، هر دو روش در هر دو سیستم عامل درست جواب میدن (در اولی 3 گیگابایت و در دومی 628 مگابایت رم داشتم)


Imports System.Runtime.InteropServices

Module Module1
<StructLayoutAttribute(LayoutKind.Sequential)> _
Public Class MEMORYSTATUSEX
Public dwLength As UInteger
Public dwMemoryLoad As UInteger
Public ullTotalPhys As ULong
Public ullAvailPhys As ULong
Public ullTotalPageFile As ULong
Public ullAvailPageFile As ULong
Public ullTotalVirtual As ULong
Public ullAvailVirtual As ULong
Public ullAvailExtendedVirtual As ULong

Public Sub New()
dwLength = System.Runtime.InteropServices.Marshal.SizeOf(GetT ype(MEMORYSTATUSEX))
End Sub
End Class

Partial Public Class NativeMethods
<DllImportAttribute("kernel32.dll", EntryPoint:="GlobalMemoryStatusEx")> _
Public Shared Function GlobalMemoryStatusEx(<OutAttribute()> <[In]()> ByVal lpBuffer As MEMORYSTATUSEX) As Boolean
End Function
End Class


Sub Main()

Dim info As New Microsoft.VisualBasic.Devices.ComputerInfo()
Dim memory = info.TotalPhysicalMemory
Console.WriteLine("{0:0} MB", memory / (1024 ^ 2))


Dim ms As New MEMORYSTATUSEX
NativeMethods.GlobalMemoryStatusEx(ms)
Dim memory2 = ms.ullTotalPhys
Console.WriteLine("{0:0} MB", memory2 / (1024 ^ 2))

End Sub

End Module


پ ن: من VB.NET کار نیستم ، شاید روش های دیگه ای هم باشه. تجربه هم بهم میگه زیاد به WMI اعتماد نکنم.

rezapassword
جمعه 27 دی 1387, 13:36 عصر
سلام دوست من
نشد !
میشه بگی چرا WMI بده ؟
خوب گلم تجربیاتتو برا ما هم بزار !

Mehdi Asgari
جمعه 27 دی 1387, 15:22 عصر
لطفا مشکلت رو دقیق تر مطرح کن.
سیستم عاملت چیه ؟
کدی رو که کامپایل می کنی بذار اینجا.
چه خطایی می گیری ؟
{ عجیبه ، چون این API اصلا مختص هیچ نسخۀ خاصی از ویندوز نیست؛ خود دات نت فریم ورک هم از این تابع API استفاده می کنه برای گزارش میزان حافظه}
API های ویندوز توابعی هستن که میلیون ها برنامه دارن ازشون استفاده می کنن و تضمین میشه که همیشه جواب بدن (خود .NET هم یه wrapper هست روی توابع API) اما در مورد WMI اتفاقاتی ممکنه بیفته که به جواب نرسی ؛ مثلا ممکنه کاربر روی سیستمش WMI رو disable کرده باشه. (خود من Stop کردمش ولی در مواقع نیاز Start میشه)

اگه خیلی اصرار بر استفاده از WMI داری ، اینم کدی که رو سیستم من جواب داد:



Dim c As New Management.ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem")

Dim x = c.Get()
For Each ObjMng In c.Get
Dim memory = ObjMng("TotalPhysicalMemory")
Console.WriteLine("{0:0} MB", memory / (1024 ^ 2))

Next

اینجا رو هم ببین:
http://www.microsoft.com/technet/scriptcenter/topics/help/wmi.mspx

rezapassword
جمعه 27 دی 1387, 17:44 عصر
سلام دوست من
نمیدونم چرا تمام کد های شما یک مقدار می دهد اما خوشبختانه هم در xp و هم در vista کار میکند
خیلی خیلی سپاس