Visual Basic.NET und psapi.DLL (Prozessinfos)

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Visual Basic.NET und psapi.DLL (Prozessinfos)

    Moin :)
    Ich möchte gerne von einem beliebigen Prozess die Informationen wieviel Arbeitsspeicher dieser gerade verbraucht.
    Da mein Programm auch unter Windows XP ausgeführt werden muss, benötige ich einen Funktionierten Code.
    Die Lösung mit dem PerformanceCounter("Process", "Working Set - Private" ging leider nicht, weil XP dies nicht mehr unterstützt.
    Außerdem ist die Funktion auch sehr langsam…
    Es dauert mehre Sekunden bis, Werte angezeigt werden.
    Und WMI könnte mir leider auch nicht helfen.
    Da alle Werte die angezeigt werden, falsch sind.

    Zum Glück habe ich ein Projekt mit dem Namen „Advanced Task Manager“ gefunden, dieses arbeitet mit der älteren psapi.DLL.
    Damit ist es mir nun möglich, die passenden Werte auszulesen.
    Auch unter Windows XP.
    Außerdem ist diese Funktion wirklich sehr schnell.
    Jedenfalls wenn ich das Programm starte, habe ich keine Wartezeiten.
    Danke an @-Franky-, für deinen Tipp mit den PerformanceCounter-APIs (Pdh.dll) vom anderen Beitrag.

    Ich suche ich jemand, der das C++ Projekt anschaut und mir den Codeteil, den ich für meine Funktion brauche in VB.NET übersetzt. :!:

    Freue mich auf eure Hilfe.
    BIG THX




    Quellcode zu diesem C++ Projekt:
    AdvancedTaskManager__src.zip

    Datei von:
    codeproject.com/Articles/12360/Advanced-Task-Manager-in-MFC
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Kannst du das Zeug nicht einfach übers Forum hochladen oder einfach die Quelle schicken wo du das her hast? Github oder sowas?
    Wäre das nicht besser aufgehoben im Marktplatz wenn du jemanden suchst der das für dich übersetzt?

    Ansonsten schau dir das pinvoke Projekt auf Github an: github.com/dotnet/pinvoke
    da gibt es auch die psapi.dll Funktionen drin. Sogar mit Tests.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @xChRoNiKx
    Ich habe die Datei nun hochgeladen und die Quelle eingetragen.
    Falls ich hier keine Lösung finde, werde ich es dann im Marktplatz versuchen.
    Danke für den Link, diesen werde ich mir baldmöglichst anschauen. :thumbup:
    Visual Basic.NET 8o
    MS-SQL
    8o
    Ich habe die Lösung nun gefunden, war nicht einfach.
    Auf Windows 2000 und XP erfolgreich getestet!
    Hier der Code für jeden mit dem gleichen Problem.
    Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.InteropServices
    3. Namespace ApiReference
    4. Class ApiExample
    5. Public Structure PROCESS_MEMORY_COUNTERS
    6. Public cb As UInt32
    7. Public PageFaultCount As UInt32
    8. Public PeakWorkingSetSize As UIntPtr
    9. Public WorkingSetSize As UIntPtr
    10. Public QuotaPeakPagedPoolUsage As UIntPtr
    11. Public QuotaPagedPoolUsage As UIntPtr
    12. Public QuotaPeakNonPagedPoolUsage As UIntPtr
    13. Public QuotaNonPagedPoolUsage As UIntPtr
    14. Public PagefileUsage As UIntPtr
    15. Public PeakPagefileUsage As UIntPtr
    16. End Structure
    17. Public Structure PROCESS_MEMORY_COUNTERS_EX
    18. Public cb As UInt32
    19. Public PageFaultCount As UInt32
    20. Public PeakWorkingSetSize As UIntPtr
    21. Public WorkingSetSize As UIntPtr
    22. Public QuotaPeakPagedPoolUsage As UIntPtr
    23. Public QuotaPagedPoolUsage As UIntPtr
    24. Public QuotaPeakNonPagedPoolUsage As UIntPtr
    25. Public QuotaNonPagedPoolUsage As UIntPtr
    26. Public PagefileUsage As UIntPtr
    27. Public PeakPagefileUsage As UIntPtr
    28. Public PrivateUsage As UIntPtr
    29. End Structure
    30. Public Structure COMPATIBLE_PROCESS_MEMORY_COUNTERS
    31. Public Sub New(pmc As PROCESS_MEMORY_COUNTERS)
    32. cb = pmc.cb
    33. PageFaultCount = pmc.PageFaultCount
    34. PeakWorkingSetSize = pmc.PeakWorkingSetSize
    35. WorkingSetSize = pmc.WorkingSetSize
    36. QuotaPeakPagedPoolUsage = pmc.QuotaPeakPagedPoolUsage
    37. QuotaPagedPoolUsage = pmc.QuotaPagedPoolUsage
    38. QuotaPeakNonPagedPoolUsage = pmc.QuotaPeakNonPagedPoolUsage
    39. QuotaNonPagedPoolUsage = pmc.QuotaNonPagedPoolUsage
    40. PagefileUsage = pmc.PagefileUsage
    41. PeakPagefileUsage = pmc.PeakPagefileUsage
    42. PrivateUsage = UIntPtr.Zero
    43. End Sub
    44. Public Sub New(pmcex As PROCESS_MEMORY_COUNTERS_EX)
    45. cb = pmcex.cb
    46. PageFaultCount = pmcex.PageFaultCount
    47. PeakWorkingSetSize = pmcex.PeakWorkingSetSize
    48. WorkingSetSize = pmcex.WorkingSetSize
    49. QuotaPeakPagedPoolUsage = pmcex.QuotaPeakPagedPoolUsage
    50. QuotaPagedPoolUsage = pmcex.QuotaPagedPoolUsage
    51. QuotaPeakNonPagedPoolUsage = pmcex.QuotaPeakNonPagedPoolUsage
    52. QuotaNonPagedPoolUsage = pmcex.QuotaNonPagedPoolUsage
    53. PagefileUsage = pmcex.PagefileUsage
    54. PeakPagefileUsage = pmcex.PeakPagefileUsage
    55. PrivateUsage = pmcex.PrivateUsage
    56. End Sub
    57. Public cb As UInt32
    58. Public PageFaultCount As UInt32
    59. Public PeakWorkingSetSize As UIntPtr
    60. Public WorkingSetSize As UIntPtr
    61. Public QuotaPeakPagedPoolUsage As UIntPtr
    62. Public QuotaPagedPoolUsage As UIntPtr
    63. Public QuotaPeakNonPagedPoolUsage As UIntPtr
    64. Public QuotaNonPagedPoolUsage As UIntPtr
    65. Public PagefileUsage As UIntPtr
    66. Public PeakPagefileUsage As UIntPtr
    67. Public PrivateUsage As UIntPtr
    68. End Structure
    69. <DllImport("psapi")>
    70. Public Shared Function GetProcessMemoryInfo(hProcess As IntPtr, ByRef cpmc As COMPATIBLE_PROCESS_MEMORY_COUNTERS, cb As Int32) As [Boolean]
    71. End Function
    72. Public Shared Sub Main(args As String())
    73. Dim cpmc As COMPATIBLE_PROCESS_MEMORY_COUNTERS = Nothing
    74. Dim p As Process = Nothing
    75. For Each p In Process.GetProcessesByName("Notepad") ' <------- HIER DEN PROZESS EINTRAGEN!
    76. Dim type As Int32
    77. If type = 0 Then
    78. cpmc.cb = CType(Marshal.SizeOf(GetType(PROCESS_MEMORY_COUNTERS)), UInt32)
    79. Else
    80. cpmc.cb = CType(Marshal.SizeOf(GetType(PROCESS_MEMORY_COUNTERS_EX)), UInt32)
    81. End If
    82. If GetProcessMemoryInfo(p.Handle, cpmc, CType(cpmc.cb, Int32)) Then
    83. Console.WriteLine("-------------------------------------")
    84. Console.WriteLine(p.ProcessName)
    85. Console.WriteLine("-------------------------------------")
    86. Console.WriteLine("PageFaultCount = {0}", cpmc.PageFaultCount)
    87. Console.WriteLine("PeakWorkingSetSize = {0}", cpmc.PeakWorkingSetSize)
    88. Console.WriteLine("WorkingSetSize = {0}", cpmc.WorkingSetSize)
    89. Console.WriteLine("QuotaPeakPagedPoolUsage = {0}", cpmc.QuotaPeakPagedPoolUsage)
    90. Console.WriteLine("QuotaPagedPoolUsage = {0}", cpmc.QuotaPagedPoolUsage)
    91. Console.WriteLine("QuotaPeakNonPagedPoolUsage = {0}", cpmc.QuotaPeakNonPagedPoolUsage)
    92. Console.WriteLine("QuotaNonPagedPoolUsage = {0}", cpmc.QuotaNonPagedPoolUsage)
    93. Console.WriteLine("PagefileUsage = {0}", cpmc.PagefileUsage)
    94. Console.WriteLine("PeakPagefileUsage = {0}", cpmc.PeakPagefileUsage)
    95. Console.WriteLine("PrivateUsage = {0}", cpmc.PrivateUsage)
    96. End If
    97. Next
    98. If p Is Nothing Then Console.WriteLine("Prozess nicht gefunden!")
    99. Console.ReadKey()
    100. End Sub
    101. End Class
    102. End Namespace
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss
    Keine Ahnung wo Du das herkopiert hast. Aber so ganz scheinen einige Sachen nicht korrekt zu sein. PROCESS_MEMORY_COUNTERS -> cb As UInt32. Laut MS Doku ist das aber ein DWORD (Integer). PeakWorkingSetSize As UIntPtr. Laut MS-Doku ist das ein SIZE_T (UInteger) usw. Erspart Dir schon mal ein paar CType. As [Boolean] <- Klammern können weg und das sollte m.E. gemarshallt werden -> <MarshalAs(UnmanagedType.Bool )>. PROCESS_MEMORY_COUNTERS (ab Windows XP) / PROCESS_MEMORY_COUNTERS_EX (ab Windows XP mit SP2 und höher) <- Weiche für OS Version um die richtige Struct zu verwenden?
    Mfg -Franky-