在Windows Mobile(WM) 操作系统中,用户经常会遇到内存使用的问题,尤其是当运行多个应用程序时。然而,标准的WM任务管理器并不提供每个进程的内存使用情况,这使得用户难以确定哪些应用程序占用了过多的内存。本文将介绍如何利用Toolhelp32库开发一个内存使用分析工具,以解决这一问题。
不会花太多时间描述整个应用程序是如何工作的,这是相当标准的。有一个名为Toolhelp32.cs的文件,其中包含了使用Toolhelp32库所需的所有P/Invoke签名。以下是执行繁重工作的代码块。
C#
uint
GetMemUsage(
uint
ProcId)
{
uint
MemUsage =
0
;
IntPtr
hHeapSnapshot =
Toolhelp32.CreateToolhelp32Snapshot(Toolhelp32.TH32CS_SNAPHEAPLIST, ProcId);
if
(hHeapSnapshot != INVALID_HANDLE_VALUE)
{
Toolhelp32.HEAPLIST32 HeapList =
new
Toolhelp32.HEAPLIST32();
HeapList.dwSize = (
uint
)Marshal.SizeOf(HeapList);
if
(Toolhelp32.Heap32ListFirst(hHeapSnapshot,
ref
HeapList))
{
do
{
Toolhelp32.HEAPENTRY32 HeapEntry =
new
Toolhelp32.HEAPENTRY32();
HeapEntry.dwSize = (
uint
)Marshal.SizeOf(HeapEntry);
if
(Toolhelp32.Heap32First(hHeapSnapshot,
ref
HeapEntry,
HeapList.th32ProcessID, HeapList.th32HeapID))
{
do
{
MemUsage += HeapEntry.dwBlockSize;
}
while
(Toolhelp32.Heap32Next(hHeapSnapshot,
ref
HeapEntry));
}
}
while
(Toolhelp32.Heap32ListNext(hHeapSnapshot,
ref
HeapList));
}
Toolhelp32.CloseToolhelp32Snapshot(hHeapSnapshot);
}
return
MemUsage;
}
CreateToolhelp32Snapshot创建一个进程、线程、堆和进程模块的快照。传入TH32CS_SNAPHEAPLIST,告诉它想要关于堆列表的信息。一旦有了快照,就用Heap32ListFirst和Heap32ListNext调用来遍历堆列表。对于每个列表,用Heap32First和Heap32Next遍历堆,并为每个列表中的每个条目累加块大小。瞧,这就是一个进程的总分配块。