c#调用API(kernel32)获取内存信息。

sinat_15262463 2014-07-02 12:25:46

/// <summary>
/// 收集内存情况
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct MEMORYSTATUS
{
public uint dwLength;
public uint dwMemoryLoad;
public ulong ullTotalPhys;
public ulong ullAvailPhys;
public ulong ullTotalPageFile;
public ulong ullAvailPageFile;
public ulong ullTotalVirtual;
public ulong ullAvailVirtual;
public ulong ullAvailExtendedVirtual;
}



这是定义的结构体。


获取信息的时候,

MEMORYSTATUS memStatus = new MEMORYSTATUS();

GlobalMemoryStatus(ref memStatus);//给此结构赋值


获取系统总内存的时候,用的 memStatus.ullTotalPhys 获取。


但是获取的是一个很大的值,除了6次1024,才得到16(电脑16GB内存)。


这是哪里错了???
...全文
380 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
宝_爸 2014-07-02
  • 打赏
  • 举报
回复
On computers with more than 4 GB of memory, the GlobalMemoryStatus function can return incorrect information, reporting a value of –1 to indicate an overflow. For this reason, applications should use the GlobalMemoryStatusEx function instead. 来自msdn: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366586(v=vs.85).aspx
tiannailu 2014-07-02
  • 打赏
  • 举报
回复
Byte->KB->MB->GB 应该是四次吧?
sinat_15262463 2014-07-02
  • 打赏
  • 举报
回复
引用 7 楼 findcaiyzh 的回复:

       [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
        private class MEMORYSTATUSEX
        {
                  public uint dwLength;
            public uint dwMemoryLoad;
                  public ulong ullTotalPhys;
                  public ulong ullAvailPhys;
                  public ulong ullTotalPageFile;
                  public ulong ullAvailPageFile;
                  public ulong ullTotalVirtual;
                  public ulong ullAvailVirtual;
                  public ulong ullAvailExtendedVirtual;
                  public MEMORYSTATUSEX()
            {
                      this.dwLength = (uint) Marshal.SizeOf(typeof( MEMORYSTATUSEX ));
            }
        }


         [return: MarshalAs(UnmanagedType.Bool)]
         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
         static extern bool GlobalMemoryStatusEx( [In, Out] MEMORYSTATUSEX lpBuffer);
参考: http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html
OK 多谢!
tiannailu 2014-07-02
  • 打赏
  • 举报
回复
引用 7 楼 findcaiyzh 的回复:

       [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
        private class MEMORYSTATUSEX
        {
                  public uint dwLength;
            public uint dwMemoryLoad;
                  public ulong ullTotalPhys;
                  public ulong ullAvailPhys;
                  public ulong ullTotalPageFile;
                  public ulong ullAvailPageFile;
                  public ulong ullTotalVirtual;
                  public ulong ullAvailVirtual;
                  public ulong ullAvailExtendedVirtual;
                  public MEMORYSTATUSEX()
            {
                      this.dwLength = (uint) Marshal.SizeOf(typeof( MEMORYSTATUSEX ));
            }
        }


         [return: MarshalAs(UnmanagedType.Bool)]
         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
         static extern bool GlobalMemoryStatusEx( [In, Out] MEMORYSTATUSEX lpBuffer);
参考: http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html
宝_爸 2014-07-02
  • 打赏
  • 举报
回复

       [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
        private class MEMORYSTATUSEX
        {
                  public uint dwLength;
            public uint dwMemoryLoad;
                  public ulong ullTotalPhys;
                  public ulong ullAvailPhys;
                  public ulong ullTotalPageFile;
                  public ulong ullAvailPageFile;
                  public ulong ullTotalVirtual;
                  public ulong ullAvailVirtual;
                  public ulong ullAvailExtendedVirtual;
                  public MEMORYSTATUSEX()
            {
                      this.dwLength = (uint) Marshal.SizeOf(typeof( MEMORYSTATUSEX ));
            }
        }


         [return: MarshalAs(UnmanagedType.Bool)]
         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
         static extern bool GlobalMemoryStatusEx( [In, Out] MEMORYSTATUSEX lpBuffer);
参考: http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html
宝_爸 2014-07-02
  • 打赏
  • 举报
回复
GlobalMemoryStatus如何定义的?
sinat_15262463 2014-07-02
  • 打赏
  • 举报
回复
引用 2 楼 findcaiyzh 的回复:
On computers with more than 4 GB of memory, the GlobalMemoryStatus function can return incorrect information, reporting a value of –1 to indicate an overflow. For this reason, applications should use the GlobalMemoryStatusEx function instead. 来自msdn: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366586(v=vs.85).aspx
新手,不是太懂。 多指点几句呗....
sinat_15262463 2014-07-02
  • 打赏
  • 举报
回复
引用 2 楼 findcaiyzh 的回复:
On computers with more than 4 GB of memory, the GlobalMemoryStatus function can return incorrect information, reporting a value of –1 to indicate an overflow. For this reason, applications should use the GlobalMemoryStatusEx function instead. 来自msdn: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366586(v=vs.85).aspx
注意到这个问题了。 你看下我定义的结构体,已经是用到GlobalMemoryStatusEx了
sinat_15262463 2014-07-02
  • 打赏
  • 举报
回复
引用 1 楼 tiannailu 的回复:
Byte->KB->MB->GB 应该是四次吧?
应该是四次啊。。。 不过除了6次才得到16. 所以就很奇怪。

111,111

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧