[VC2010] メモリ情報を取得する方法

◆概要

 WinAPIのGlobalMemoryStatusを利用してメモリ情報を取得する方法です。
GlobalMemoryStatusは、物理メモリと仮想メモリの両方に関するシステムの現在の使用状況の情報を取得します。
4Gバイト以下の物理メモリ容量を取得するときに、この関数を使います。搭載容量と空き容量が取得できます。

仮想アドレス空間の拡張部分に関する情報を取得する場合や、4GB を超えるメインメモリを実装したコンピュータでアプリケーションを実行する可能性がある場合は、GlobalMemoryStatusEx 関数を使ってください。

定数
dwLength
構造体のサイズを指定します。

dwMemoryLoad
メモリの使用状況がパーセンテージで格納されます(0 〜 100)。

dwTotalPhys
物理メモリの容量がバイト単位で格納されます。

dwAvailPhys
物理メモリの空き容量がバイト単位で格納されます。

dwTotalPageFile
ページ ファイル(仮想メモリ)の容量がバイト単位で格納されます。

dwAvailPageFile
ページ ファイル(仮想メモリ)の空き容量がバイト単位で格納されます。

dwTotalVirtual
ユーザーが使用できるアドレス空間の容量がバイト単位で格納されます。

dwAvailVirtual
ユーザーが使用できるアドレス空間の空き容量がバイト単位で格納されます。

 MemoryStatus構造体のメンバはDOUBLE WORD(符号無し32bit整数値)なのでintではなくuintととして扱うのがポイントです。

◆コード

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace GetDeviceMemory
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        ///<summary>
        ///WinAPIのGlobalMemoryStatusを利用してメモリ情報取得する
        ///</Summary>
        ///

        // GlobalMemoryStatusの引数として渡す構造体の宣言
        public struct MemoryStatus
        {
            public int dwLengt;
            public uint dwMemoryLoad;
            public uint dwTotalPhys;
            public uint dwAvailPhys;
            public uint dwTotalPageFile;
            public uint dwAvailPageFile;
            public uint dwTotalVirtual;
            public uint dwAvailVirtual;
        }

        // Win32 API宣言
        [DllImport("kernel32.dll")]
        extern static void GlobalMemoryStatus(ref MemoryStatus lpbuffer);
        public static uint GetTotalPhysMemorySize()
        {
            // 物理メモリの容量
            try
            {
                MemoryStatus ms = new MemoryStatus();
                ms.dwLengt = Marshal.SizeOf(ms);
                GlobalMemoryStatus(ref ms);
                return ms.dwTotalPhys;
            }
            catch (ArgumentNullException e)
            {
                throw (e);
            }
        }
        public static uint GetLoadPhysMemorySize()
        {
            // メモリの使用状況がパーセンテージで格納されます(0 〜 100)。
            try
            {
                MemoryStatus ms = new MemoryStatus();
                ms.dwLengt = Marshal.SizeOf(ms);
                GlobalMemoryStatus(ref ms);
                return ms.dwMemoryLoad;
            }
            catch (ArgumentNullException e)
            {
                throw (e);
            }
        }
       
       public void ShowMemory()
       {
           string Totalmemory;
           string LoadMemory;

           Totalmemory = GetTotalPhysMemorySize().ToString(); ;
           LoadMemory = GetLoadPhysMemorySize().ToString();
           MessageBox.Show("全メモリ:" + Totalmemory 
               +"\n"+ "メモリの使用割合(%):" + LoadMemory);

       }

       private void button1_Click(object sender, EventArgs e)
       {
           ShowMemory();
       }

    }
}

◆実行結果
実行結果


Microsoft.VisualBasic.dllを利用する方法

4GBを超えるメモリ容量を取得する場合、Microsoft.VisualBasic.dllを利用する方法があります。
これを利用するためには、[プロジェクト]-[参照の追加]でMicrosoft.VisualBasic.dllへの参照の追加が必要です。

static ulong GetTotalMemoryInBytes()
{
    // 物理メモリの搭載容量を取得する
    //Microsoft.VisualBasic.dllへの参照の追加が必要
    return new Microsoft.VisualBasic.Devices
        .ComputerInfo().TotalPhysicalMemory;
}
static ulong GetAbaliableMemoryInBytes()
{
    // 使用可能なメモリ容量を取得する
    // Microsoft.VisualBasic.dllへの参照の追加が必要
    return new Microsoft.VisualBasic.Devices
        .ComputerInfo().AvailablePhysicalMemory;
}
private void button2_Click(object sender, EventArgs e)
{
    ulong totalmem  = GetTotalMemoryInBytes();
    ulong avalemem = GetAbaliableMemoryInBytes();
    MessageBox.Show("物理メモリの搭載容量:" + totalmem.ToString("#,00") + "Byte"
        + "\n" + "使用可能メモリの容量:" + avalemem.ToString("#,00") + "Byte");
}
◆実行結果

実行結果


▼ページトップへ