Windows CE 上 GlobalMemoryStatusEx 的 PInvoke
PInvoke for GlobalMemoryStatusEx on Windows CE
如果您不从事或不了解 Windows CE 和 Compact Framework,请不要投反对票。谢谢
有人知道这个函数在 WinCE 上是否可用吗?(如果是的话)DLL 是什么?我已尝试从 "coredll.dll" 和 "kernel.dll" 调用 PInvoke。 Win32版本来自"kernel32.dll".
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel.dll")] // and "coredll.dll" also doesn't work
public static extern bool GlobalMemoryStatusEx([In,Out] MEMORYSTATUSEX lpBuffer);
当我尝试使用上述函数时出现异常 "Can't find PInvoke DLL 'kernel.dll'."
PS:我使用了大量的 PInvoked 函数,比如这个:
[DllImport("coredll.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int nMsg, IntPtr wParam, IntPtr lParam);
只有GlobalMemoryStatus call, not the extended (...Ex) version. It is located in coredll.dll, see http://pinvoke.net/default.aspx/coredll.GlobalMemoryStatus
已实施 C.Evenhuis 建议的答案并且效果很好。这是供将来可能需要此代码的人使用的代码:
// Structure to allow getting memory usage
public struct MEMORYSTATUS
{
public int nLength;
public int nMemoryLoad;
public uint uTotalPhys;
public uint uAvailPhys;
public uint uTotalPageFile;
public uint uAvailPageFile;
public uint uTotalVirtual;
public uint uAvailVirtual;
}
[DllImport("coredll", EntryPoint="GlobalMemoryStatus", SetLastError = false)]
public static extern void GlobalMemoryStatus(out MEMORYSTATUS memCE);
MEMORYSTATUS mem = new MEMORYSTATUS();
mem.nLength = Marshal.SizeOf(typeof(MEMORYSTATUS));
GlobalMemoryStatus(out mem);
// Label1.Text = (mem.uAvailPhys.ToString() + "Bytes");
我是这样用的
/// <summary>
/// https://msdn.microsoft.com/en-us/library/ee488368.aspx
/// This structure contains information about current memory availability. The GlobalMemoryStatus function uses this structure.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct MemoryStatus
{
/// <summary>
/// Specifies the size, in bytes, of the MEMORYSTATUS structure.
/// Set this member to sizeof(MEMORYSTATUS) when passing it to the GlobalMemoryStatus function.
/// </summary>
public int Length;
/// <summary>
/// Specifies a number between zero and 100 that gives a general idea of current memory use, in which zero indicates no memory use and 100 indicates full memory use.
/// </summary>
public uint MemoryLoad;
/// <summary>
/// Indicates the total number of bytes of physical memory.
/// </summary>
public uint TotalPhys;
/// <summary>
/// Indicates the number of bytes of physical memory available.
/// </summary>
public uint AvailPhys;
/// <summary>
/// Indicates the total number of bytes that can be stored in the paging file.
/// This number does not represent the physical size of the paging file on disk.
/// </summary>
public uint TotalPageFile;
/// <summary>
/// Indicates the number of bytes available in the paging file.
/// </summary>
public uint AvailPageFile;
/// <summary>
/// Indicates the total number of bytes that can be described in the user mode portion of the virtual address space of the calling process.
/// </summary>
public uint TotalVirtual;
/// <summary>
/// Indicates the number of bytes of unreserved and uncommitted memory in the user mode portion of the virtual address space of the calling process.
/// </summary>
public uint AvailVirtual;
[DllImport("coredll.dll")]
private static extern void GlobalMemoryStatus(ref MemoryStatus ms);
public static string GetMemoryStatus()
{
var retValue = new StringBuilder();
MemoryStatus ms = GlobalMemoryStatus();
retValue.AppendLine(string.Format("Memory Load {0} %", ms.MemoryLoad));
retValue.AppendLine(string.Format("Total Phys {0} Kb", ms.TotalPhys / 1024));
retValue.AppendLine(string.Format("Avail Phys {0} Kb", ms.AvailPhys / 1024));
retValue.AppendLine(string.Format("Tota PFile {0} bytes", ms.TotalPageFile));
retValue.AppendLine(string.Format("Avai PFile {0} bytes", ms.AvailPageFile));
retValue.AppendLine(string.Format("Total Virt {0} Kb", ms.TotalVirtual / 1024));
retValue.AppendLine(string.Format("Avail Virt {0} Kb", ms.AvailVirtual / 1024));
return retValue.ToString();
}
public static MemoryStatus GlobalMemoryStatus()
{
MemoryStatus ms = new MemoryStatus();
ms.Length = Marshal.SizeOf(ms);
GlobalMemoryStatus(ref ms);
return ms;
}
public static uint GetMemoryLoad()
{
var ms = GlobalMemoryStatus();
return ms.MemoryLoad;
}
}
您可以签入 Windows CE SDKWinBase.h
typedef struct _MEMORYSTATUS {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORD dwTotalPhys;
DWORD dwAvailPhys;
DWORD dwTotalPageFile;
DWORD dwAvailPageFile;
DWORD dwTotalVirtual;
DWORD dwAvailVirtual;
} MEMORYSTATUS, *LPMEMORYSTATUS;
VOID
WINAPI
GlobalMemoryStatus(
__inout LPMEMORYSTATUS lpBuffer
);
因为在SDK中是_inout。我使用了“ref”参数修饰符。
这就是全部。
如果您不从事或不了解 Windows CE 和 Compact Framework,请不要投反对票。谢谢
有人知道这个函数在 WinCE 上是否可用吗?(如果是的话)DLL 是什么?我已尝试从 "coredll.dll" 和 "kernel.dll" 调用 PInvoke。 Win32版本来自"kernel32.dll".
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel.dll")] // and "coredll.dll" also doesn't work
public static extern bool GlobalMemoryStatusEx([In,Out] MEMORYSTATUSEX lpBuffer);
当我尝试使用上述函数时出现异常 "Can't find PInvoke DLL 'kernel.dll'."
PS:我使用了大量的 PInvoked 函数,比如这个:
[DllImport("coredll.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int nMsg, IntPtr wParam, IntPtr lParam);
只有GlobalMemoryStatus call, not the extended (...Ex) version. It is located in coredll.dll, see http://pinvoke.net/default.aspx/coredll.GlobalMemoryStatus
已实施 C.Evenhuis 建议的答案并且效果很好。这是供将来可能需要此代码的人使用的代码:
// Structure to allow getting memory usage
public struct MEMORYSTATUS
{
public int nLength;
public int nMemoryLoad;
public uint uTotalPhys;
public uint uAvailPhys;
public uint uTotalPageFile;
public uint uAvailPageFile;
public uint uTotalVirtual;
public uint uAvailVirtual;
}
[DllImport("coredll", EntryPoint="GlobalMemoryStatus", SetLastError = false)]
public static extern void GlobalMemoryStatus(out MEMORYSTATUS memCE);
MEMORYSTATUS mem = new MEMORYSTATUS();
mem.nLength = Marshal.SizeOf(typeof(MEMORYSTATUS));
GlobalMemoryStatus(out mem);
// Label1.Text = (mem.uAvailPhys.ToString() + "Bytes");
我是这样用的
/// <summary>
/// https://msdn.microsoft.com/en-us/library/ee488368.aspx
/// This structure contains information about current memory availability. The GlobalMemoryStatus function uses this structure.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct MemoryStatus
{
/// <summary>
/// Specifies the size, in bytes, of the MEMORYSTATUS structure.
/// Set this member to sizeof(MEMORYSTATUS) when passing it to the GlobalMemoryStatus function.
/// </summary>
public int Length;
/// <summary>
/// Specifies a number between zero and 100 that gives a general idea of current memory use, in which zero indicates no memory use and 100 indicates full memory use.
/// </summary>
public uint MemoryLoad;
/// <summary>
/// Indicates the total number of bytes of physical memory.
/// </summary>
public uint TotalPhys;
/// <summary>
/// Indicates the number of bytes of physical memory available.
/// </summary>
public uint AvailPhys;
/// <summary>
/// Indicates the total number of bytes that can be stored in the paging file.
/// This number does not represent the physical size of the paging file on disk.
/// </summary>
public uint TotalPageFile;
/// <summary>
/// Indicates the number of bytes available in the paging file.
/// </summary>
public uint AvailPageFile;
/// <summary>
/// Indicates the total number of bytes that can be described in the user mode portion of the virtual address space of the calling process.
/// </summary>
public uint TotalVirtual;
/// <summary>
/// Indicates the number of bytes of unreserved and uncommitted memory in the user mode portion of the virtual address space of the calling process.
/// </summary>
public uint AvailVirtual;
[DllImport("coredll.dll")]
private static extern void GlobalMemoryStatus(ref MemoryStatus ms);
public static string GetMemoryStatus()
{
var retValue = new StringBuilder();
MemoryStatus ms = GlobalMemoryStatus();
retValue.AppendLine(string.Format("Memory Load {0} %", ms.MemoryLoad));
retValue.AppendLine(string.Format("Total Phys {0} Kb", ms.TotalPhys / 1024));
retValue.AppendLine(string.Format("Avail Phys {0} Kb", ms.AvailPhys / 1024));
retValue.AppendLine(string.Format("Tota PFile {0} bytes", ms.TotalPageFile));
retValue.AppendLine(string.Format("Avai PFile {0} bytes", ms.AvailPageFile));
retValue.AppendLine(string.Format("Total Virt {0} Kb", ms.TotalVirtual / 1024));
retValue.AppendLine(string.Format("Avail Virt {0} Kb", ms.AvailVirtual / 1024));
return retValue.ToString();
}
public static MemoryStatus GlobalMemoryStatus()
{
MemoryStatus ms = new MemoryStatus();
ms.Length = Marshal.SizeOf(ms);
GlobalMemoryStatus(ref ms);
return ms;
}
public static uint GetMemoryLoad()
{
var ms = GlobalMemoryStatus();
return ms.MemoryLoad;
}
}
您可以签入 Windows CE SDKWinBase.h
typedef struct _MEMORYSTATUS {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORD dwTotalPhys;
DWORD dwAvailPhys;
DWORD dwTotalPageFile;
DWORD dwAvailPageFile;
DWORD dwTotalVirtual;
DWORD dwAvailVirtual;
} MEMORYSTATUS, *LPMEMORYSTATUS;
VOID
WINAPI
GlobalMemoryStatus(
__inout LPMEMORYSTATUS lpBuffer
);
因为在SDK中是_inout。我使用了“ref”参数修饰符。
这就是全部。