RAM auslesen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von tuvok.

    RAM auslesen

    Hallo Ihr Lieben,
    ich hab da mal ne Frage.. ich hab in dem Testrechner 16GB RAM drin .. habe 2 verschiedene Auslesevarianten getestet

    Variante 1

    VB.NET-Quellcode

    1. Dim ram As Double
    2. ram = (My.Computer.Info.TotalPhysicalMemory) / (1024 ^ 3)
    3. Ram_Box.Text = ram.ToString("0.00")


    Variante 2

    VB.NET-Quellcode

    1. ' Verfügbaren und freien Arbeitsspeicher via WMI ermitteln
    2. Public Sub GetRAMInfo(ByRef sTotal As String, ByRef sFree As String)
    3. On Error GoTo ErrHandler
    4. Dim oWMI As Object
    5. Dim oResult As Object
    6. Dim oItem As Object
    7. Dim sSQL As String
    8. ' Verweis auf WMI erstellen
    9. Set oWMI = GetObject("winmgmts:")
    10. ' WMI-Abfrage für den verfügbaren RAM
    11. sSQL = "Select TotalPhysicalMemory from Win32_ComputerSystem"
    12. Set oResult = oWMI.ExecQuery(sSQL)
    13. For Each oItem In oResult
    14. sTotal = FormatRam(oItem.TotalPhysicalMemory)
    15. Exit For
    16. Next
    17. ' WMI-Abfrage für den freien Arbeitsspeicher
    18. sSQL = "SELECT FreePhysicalMemory from Win32_OperatingSystem"
    19. Set oResult = oWMI.ExecQuery(sSQL)
    20. For Each oItem In oResult
    21. sFree = FormatRam(oItem.FreePhysicalMemory * 1024)
    22. Exit For
    23. Next
    24. On Error GoTo 0
    25. Exit Sub
    26. ErrHandler:
    27. End Sub
    28. ' Hilfsfunktion zur Formatierung der ermittelten Bytes
    29. ' in KB, MB bzw. GB
    30. Private Function FormatRam(ByVal oRam As Variant) As String
    31. ' RAM-Angabe formatieren
    32. If (((oRam / 1024) / 1024) / 1024) >= 1 Then
    33. ' GB
    34. FormatRam = Format(((oRam / 1024) / 1024) / 1024, "###,##0.0#") & " GB"
    35. ElseIf ((oRam / 1024) / 1024) >= 1 Then
    36. ' MB
    37. FormatRam = Format((oRam / 1024) / 1024, "###,##0.0#") & " MB"
    38. Else
    39. ' KB
    40. FormatRam = Format(oRam / 1024, "###,##0.0#") & " KB"
    41. End If
    42. End Function


    Aufruf Beispiel:

    VB.NET-Quellcode

    1. Dim sTotal As String
    2. Dim sFree As String
    3. ' RAM-Info
    4. GetRAMInfo sTotal, sFree
    5. ' Anzeige in Label-Controls
    6. Label1.Caption = "Verfügbarer RAM: " & sTotal
    7. Label2.Caption = "Freier RAM: " & sFree


    Quelle: vbarchiv.net/tipps/tipp_1738-r…er-via-wmi-ermitteln.html


    das Problem was ich bei beiden habe ist, dass des Ding nichts genau schreibt .. immer nur 15,96 oder irgendwas in der Richtung .. was mach ich falsch das es nicht die 16GB anzeigt oder die 8 oder 4 GB oder 256mb
    wäre schön wenn mir da mal jemand helfen würde...
    wenn wir schon dabei sind.. gibts noch ne Möglichkeit herauszufinden wieviele Bänke belegt sind 1 von 2 oder 2 von 2 oder sowas halt

    Danke ?(
    Ich wuesste noch diesemoeglichkeit, aber da muesste man auch Runden.

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
    4. Private Class MEMORYSTATUSEX
    5. Public dwLength As UInteger
    6. Public dwMemoryLoad As UInteger
    7. Public ullTotalPhys As ULong
    8. Public ullAvailPhys As ULong
    9. Public ullTotalPageFile As ULong
    10. Public ullAvailPageFile As ULong
    11. Public ullTotalVirtual As ULong
    12. Public ullAvailVirtual As ULong
    13. Public ullAvailExtendedVirtual As ULong
    14. Public Sub New()
    15. Me.dwLength = CUInt(Marshal.SizeOf(GetType(MEMORYSTATUSEX)))
    16. End Sub
    17. End Class
    18. <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    19. Private Shared Function GlobalMemoryStatusEx(<[In](), Out()> ByVal lpBuffer As MEMORYSTATUSEX) As <MarshalAs(UnmanagedType.Bool)> Boolean
    20. End Function
    21. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    22. Dim memory As New MEMORYSTATUSEX
    23. If GlobalMemoryStatusEx(memory) Then
    24. Debug.WriteLine(memory.ullAvailPhys)
    25. Debug.WriteLine(memory.ullAvailVirtual)
    26. Debug.WriteLine(Math.Round(memory.ullTotalPhys / (1024 ^ 3), 2))
    27. Debug.WriteLine(memory.ullTotalVirtual)
    28. End If
    29. End Sub
    30. End Class
    And i think to myself... what a wonderfuL World!
    Hallo,
    das runden ist ja nicht das Problem .. wenn er richtig rundet.. :)

    wenn ich Strg+Pause drücke .. steht doch da bei System z.b. 8GB installiert (7,88GB verfügbar)
    wo holt er sich diese Info das 8 GB installiert sind her? das wär ma gut zu wissen .. weil da zeigt er es ja richtig an
    Bei WMI gibt es eine Klasse die heißt Win32_PhysicalMemory.
    Dort hast pro Instanz eine Property Capacity.
    Addierst die alle zusammen hast die Gesamtanzahl in Bytes. Teilst das durch 1073741824 (1024³) kommst auf GB und das sollte dann auch entsprechend 4 oder 8 usw sein.
    Das ist meine Signatur und sie wird wunderbar sein!
    Ok Danke probier ich mal aus



    ähm @Mono mir fällt grade auf das meine 2 Variante doch schon WMI benutzt.. :)

    Beiträge zusammengefügt. Für nachträgliche Informationen bitte bearbeiten! ~Thunderbolt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()

    Ja aber nicht die von mir genannten Klasse.

    Etwa so:

    VB.NET-Quellcode

    1. Dim c as int64
    2. c=0
    3. Dim searcher As New ManagementObjectSearcher( _
    4. "root\CIMV2", _
    5. "SELECT Capacity FROM Win32_PhysicalMemory")
    6. For Each queryObj As ManagementObject in searcher.Get()
    7. c = c+ Convert.ToInt64(queryObj("Capacity"))
    8. Next
    9. Debug.print (c/1024/1024/1024.toString)


    Als Ansatz
    Das ist meine Signatur und sie wird wunderbar sein!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mono“ ()

    tuvok schrieb:

    (1024 ^ 3)
    Teste mal die Laufzeit dieses Ausdrucks gegen (1024 * 1024 * 1024). 8o
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ~blaze~ schrieb:

    Noch eleganter
    wäre, das Resultat reinzuschreiben.
    Ich gehe mal davon aus, dass das nur ein Mal berechnet wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Eddy schrieb:

    wenn nicht
    Mich schon.
    Wahrscheinlich optimiert das der VB-Compiler.
    Ich hatte im Hinterkopf die Funktion Math.Pow(1024, 3), die bringt mal einen schlappen Faktor 45: 2000 => 90000.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!