我正在使用GlobalMemoryStatusEx
函数来检索有关内存的信息,但此功能无法正常工作。它为所有属性返回0。我不认为这个功能在我的Windows 7环境中有效。
[StructLayout(LayoutKind.Sequential)]
internal struct MEMORYSTATUSEX
{
internal uint dwLength;
internal uint dwMemoryLoad;
internal ulong ullTotalPhys;
internal ulong ullAvailPhys;
internal ulong ullTotalPageFile;
internal ulong ullAvailPageFile;
internal ulong ullTotalVirtual;
internal ulong ullAvailVirtual;
internal ulong ullAvailExtendedVirtual;
}
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);
private void btnGlobalMemoryStatusEX_Click(object sender, EventArgs e)
{
MEMORYSTATUSEX statEX = new MEMORYSTATUSEX();
GlobalMemoryStatusEx(ref statEX);
double d = (double)statEX.ullTotalPhys;
}
有人能告诉我错误的代码出错了吗?
答案 0 :(得分:10)
我发现自己的错误: http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html
我改变了
internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);
到
static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);
并更改了
GlobalMemoryStatusEx(ref statEX);
到
GlobalMemoryStatusEx(statEX);
它正常工作。 罐
答案 1 :(得分:5)
怎么样:
My.Computer.Info.TotalPhysicalMemory
My.Computer.Info.AvailablePhysicalMemory
答案 2 :(得分:4)
如果是c#,你可以:
引用Microsoft.VisualBasic
程序集。
然后导入Microsoft.VisualBasic.Devices
命名空间
最后使用ComputerInfo获取总物理内存。
int bytesPerMebibyte = (1 << 20); // http://physics.nist.gov/cuu/Units/binary.html
ComputerInfo myCompInfo = new ComputerInfo();
string physicalMemory = "Physical Memory: "
+ (myCompInfo.TotalPhysicalMemory / bytesPerMebibyte) + " MB";
答案 3 :(得分:1)
您可以使用此模板:
long memory = Process.GetCurrentProcess().PeakVirtualMemorySize64;
另一个名为Peak * 64
的属性答案 4 :(得分:0)
在致电statEX.dwLength
之前,您忘了设置GlobalMemoryStatusEx
。
MEMORYSTATUSEX statEX = new MEMORYSTATUSEX();
statEX.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
GlobalMemoryStatusEx(ref statEX);