2012-07-04 3 views
1

Я пытаюсь получить объем физической памяти (Total RAM), установленный на моем ПК через Visual Basic. Проблема в том, что я получаю как возвращаемый «0 байт». Далее я также попробую yo получить процент использования, объем бесплатной ОЗУ, общий пейджинг, бесплатную страницу и график, показывающий использование, например, монитор ресурсов для ОЗУ, в Windows. Проблема в том, что я не могу получить правильное количество бесплатной памяти сначала продвигайтесь вместе с другими.Visual Basic Physical Memory

Что я делаю неправильно? Спасибо.

Это мой код:

Option Strict On 
Option Explicit On 
Imports System.Math 
Imports System.Management 
Imports System.Runtime.InteropServices 
Public Class Form1 
    Inherits System.Windows.Forms.Form 
#Region " API " 
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _ 
    Private Structure MEMORYSTATUSEX 
     Dim dwLength As Integer 
     Dim dwMemoryLoad As Integer 
     Dim ullTotalPhys As ULong 
    End Structure 
    Private memoryInfo As MEMORYSTATUSEX 
    Private Declare Auto Sub GlobalMemoryStatusEx Lib "kernel32" (ByRef lpBuffer As MEMORYSTATUSEX) 
#End Region 


#Region " Variables " 

    Private mullTotalRAM As ULong 

#End Region 

#Region " Form Events " 
    Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load 
     ' set title 
     Me.Text = My.Application.Info.Title & " " & My.Application.Info.Version.Major.ToString & "." & _ 
      My.Application.Info.Version.Minor.ToString 

     Application.DoEvents() 
     GetMemoryInfo() 
     Timer1.Enabled = True 
    End Sub 

#End Region 

#Region " Information Gathering and Display " 

    Private Sub GetMemoryInfo() 

     System.Windows.Forms.Application.DoEvents() 

     ' set size of structure (required by this api call) 
     memoryInfo.dwLength = Marshal.SizeOf(memoryInfo) 
     GlobalMemoryStatusEx(memoryInfo) 

     mullTotalRAM = memoryInfo.ullTotalPhys 

     txtRAM.Text = FormatBytes(mullTotalRAM) 

    End Sub 

#End Region 

#Region " Update Timer " 

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) 

     GetMemoryInfo() 

     Application.DoEvents() 

    End Sub 

#End Region 


#Region " Formatting Routines " 

    Private Function FormatBytes(ByVal ullBytes As ULong) As String 
     Dim dblTemp As Double 

     Try 
      Select Case ullBytes 
       Case Is >= 1073741824 'GB 
        dblTemp = CDbl(ullBytes/1073741824) 
        Return FormatNumber(dblTemp, 2) & " GB" 
       Case 1048576 To 1073741823 
        dblTemp = CDbl(ullBytes/1048576) 'MB 
        Return FormatNumber(dblTemp, 0) & " MB" 
       Case 1024 To 1048575 
        dblTemp = CDbl(ullBytes/1024) 'KB 
        Return FormatNumber(dblTemp, 0) & " KB" 
       Case 0 To 1023 
        dblTemp = ullBytes ' bytes 
        Return FormatNumber(dblTemp, 0) & " bytes" 
       Case Else 
        Return "" 
      End Select 
     Catch 
      Return "" 
     End Try 

    End Function 


#End Region 


    Private Sub ramaTotalRAM_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ramaTotalRAM.Enter 

    End Sub 

    Private Sub txtRAM_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtRAM.TextChanged 

    End Sub 
End Class 

Я решил эту problem.Now Я интересно, если это возможно, чтобы сделать что-то вроде этого: http://s18.postimage.org/7zn5adst3/Memory.jpg .Как может я it.thank вас очень много.

+0

Какую операционную систему вы используете? –

+0

Это не VB, но, возможно, VB.Net. – Bob77

+0

@Bob Riemersma: Я использую visual studio 2008, и это приложение .vb («Form1.vb» - это имя для него). –

ответ

2

Некоторые простые одностенные, чтобы получить работу:

TotalPhysicalMemory

MsgBox(String.Format("TotalPhysicalMemory: {0} MBytes", System.Math.Round(My.Computer.Info.TotalPhysicalMemory/(1024 * 1024)), 2).ToString) 

AvailablePhysicalMemory

MsgBox(String.Format("AvailablePhysicalMemory: {0} MBytes", System.Math.Round(My.Computer.Info.AvailablePhysicalMemory/(1024 * 1024)), 2).ToString) 

TotalVirtualMemory

MsgBox(String.Format("TotalVirtualMemory: {0} MBytes", System.Math.Round(My.Computer.Info.TotalVirtualMemory/(1024 * 1024)), 2).ToString) 

AvailableVirtualMemory

MsgBox(String.Format("AvailableVirtualMemory: {0} MBytes", System.Math.Round(My.Computer.Info.AvailableVirtualMemory/(1024 * 1024)), 2).ToString) 

или

Изменение API Децл к этому (заметьте, что .dll отсутствует в вас код)

Private Declare Auto Sub GlobalMemoryStatusEx Lib "kernel32.dll" (ByRef lpBuffer As MEMORYSTATUSEX) 
+0

, изменив объявление API «kernel32.dll», он все равно не будет работать. Вышеприведенный код, да, он работает, большое спасибо. Я также пробовал это раньше. Я все еще не понимаю, почему мой метод выиграл ' t, поскольку в программе, которую я использую в качестве модели, она работает как charm.I до сих пор получить 0 байт из последнего case.If я удалить эту часть с Case 0 до 1023 он ничего не возвращает, когда я запускаю его Коробка пуста. Я все еще не могу понять это. Большое вам спасибо. –

0

Вот pastebin рабочего примера

Я был в состоянии заставить его работать, используя это определение GlobalMemoryStatusEx и ниже MEMORYSTATUSEX

Private Declare Auto Sub GlobalMemoryStatusEx Lib "kernel32" (<[In](), Out()> lpBuffer As MEMORYSTATUSEX) 

и объявить его как

Private memoryInfo As MEMORYSTATUSEX = New MEMORYSTATUSEX 

и зарегестрировано

'memoryInfo.dwLength = CUInt(Marshal.SizeOf(memoryInfo)) 

Я не знаю, где вы определили свою структуру для MEMORYSTATUSEX, но в соответствии с Pinvoke.net это должно быть.

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _ 
Public Class MEMORYSTATUSEX 

    ''' <summary> 
    ''' Initializes a new instance of the <see cref="T:MEMORYSTATUSEX" /> class. 
    ''' </summary> 
    Public Sub New() 
    Me.dwLength = CType(Marshal.SizeOf(GetType(MEMORYSTATUSEX)), UInt32) 
    End Sub 
    ' Fields 
    ''' <summary> 
    ''' Size of the structure, in bytes. You must set this member before calling GlobalMemoryStatusEx. 
    ''' </summary> 
    Public dwLength As UInt32 
    ''' <summary> 
    ''' Number between 0 and 100 that specifies the approximate percentage of physical memory that is in use (0 indicates no memory use and 100 indicates full memory use). 
    ''' </summary> 
    Public dwMemoryLoad As UInt32 
    ''' <summary> 
    ''' Total size of physical memory, in bytes. 
    ''' </summary> 
    Public ullTotalPhys As UInt64 
    ''' <summary> 
    ''' Size of physical memory available, in bytes. 
    ''' </summary> 
    Public ullAvailPhys As UInt64 
    ''' <summary> 
    ''' Size of the committed memory limit, in bytes. This is physical memory plus the size of the page file, minus a small overhead. 
    ''' </summary> 
    Public ullTotalPageFile As UInt64 
    ''' <summary> 
    ''' Size of available memory to commit, in bytes. The limit is ullTotalPageFile. 
    ''' </summary> 
    Public ullAvailPageFile As UInt64 
    ''' <summary> 
    ''' Total size of the user mode portion of the virtual address space of the calling process, in bytes. 
    ''' </summary> 
    Public ullTotalVirtual As UInt64 
    ''' <summary> 
    ''' Size of unreserved and uncommitted memory in the user mode portion of the virtual address space of the calling process, in bytes. 
    ''' </summary> 
    Public ullAvailVirtual As UInt64 
    ''' <summary> 
    ''' Size of unreserved and uncommitted memory in the extended portion of the virtual address space of the calling process, in bytes. 
    ''' </summary> 
    Public ullAvailExtendedVirtual As UInt64 
End Class 

Вы также можете посмотреть на Microsoft.VisualBasic.Devices.ComputerInfo класса

Dim info As Microsoft.VisualBasic.Devices.ComputerInfo = New Microsoft.VisualBasic.Devices.ComputerInfo 
Debug.Print(CStr(info.TotalPhysicalMemory)) 
Debug.Print(CStr(info.TotalVirtualMemory)) 
Debug.Print(CStr(info.AvailablePhysicalMemory)) 
+0

У меня есть аналогичное приложение, и он используется MEMORYSTATUSEX, и он работает, он показывает мне правильное количество ОЗУ, но в моем случае это не сработает. –

+0

Я только что закончил часть, показывающую бесплатную ОЗУ, и по-прежнему «0 байт» в результате. В том же приложении, которое я нашел в Интернете, он показывает мне правильную сумму. Это что-то вроде диалогового окна, которое показывает вывод. устанавливается как только чтение: true, accept возвращает: true и модификаторы: public. –

+0

@TeoRoxy добавил дополнительную информацию. Мне не удалось заставить ваш код работать с вашей структурой, я использовал ту, которую я опубликовал, и даже тогда мне пришлось изменить объявление GlobalMemoryStatusEX. Таким образом, вышеизложенное работает, я не уверен, почему ваш не работает. –

0
Friend Sub ReleaseMemory() 
     Try 
      GC.Collect() 
      GC.WaitForPendingFinalizers() 
      If Environment.OSVersion.Platform = PlatformID.Win32NT Then 
       SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1) 
      End If 
     Catch ex As Exception 
      LogError(ex.ToString()) 
     End Try 
    End Sub