Visual Basic物理内存

时间:2012-07-04 06:09:54

标签: vb.net visual-studio memory ram

我正在尝试通过Visual Basic安装在我的电脑上的物理内存量(总RAM)。问题是我得到一个返回“0字节”。此外我还会尝试你得到百分比在Windows中使用的,可用RAM的数量,总页面数,免费页面和显示RAM资源监视器等用法的图表。问题是我无法获得正确数量的空闲RAM以便与其他人一起推进

我做错了什么? 谢谢。

这是我的代码:

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

我已经解决了这个问题。现在我想知道是否有可能做出这样的事情: http://s18.postimage.org/7zn5adst3/Memory.jpg。我怎么能这样做。非常感谢你。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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))

答案 2 :(得分: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