Windows API一日一练 91 GetProcessMemoryInfo函数

当大家打开Windows任务管理器时,就会看到每个进程使用内存的分布情况,往往会发现有一些进程占用大量的内存,在这种情况也是一种异常情况,可以作为是否恶意软件的标志之一。下面就来使用API函数GetProcessMemoryInfo来获取内存的使用情况。

函数GetProcessMemoryInfo声明如下:

BOOL

WINAPI

GetProcessMemoryInfo(

HANDLE Process,

PPROCESS_MEMORY_COUNTERS ppsmemCounters,

DWORD cb

);

Process是获取内存使用情况的进程句柄。

ppsmemCounters是返回内存使用情况的结构。

cb是结构的大小。

调用函数的例子如下:

#001 //获取某一个进程的内存信息。

#002  //蔡军生 2007/12/18 QQ:9073204 深圳

#003  void TestGetProcessMemoryInfo(void)

#004  {

#005         //

#006         const int nBufSize = 512;

#007         TCHAR chBuf[nBufSize];

#008         ZeroMemory(chBuf,nBufSize);

#009

#010         //

#011         DWORD dwProcs[1024];

#012         DWORD dwNeeded;

#013

#014         //枚举所有进程ID。

#015         if ( !EnumProcesses( dwProcs, sizeof(dwProcs), &dwNeeded ) )

#016         {

#017               //输出出错信息。

#018               wsprintf(chBuf,_T("EnumProcesses failed (%d)./n"), GetLastError() );

#019               OutputDebugString(chBuf);

#020

#021               return;

#022         }

#023

#024         // 计算有多少个进程ID。

#025         DWORD dwProcCount = dwNeeded / sizeof(DWORD);

#026

#027         wsprintf(chBuf,_T("EnumProcesses Count(%d)./n"), dwProcCount );

#028         OutputDebugString(chBuf);

#029

#030         //遍历所有进程ID,打开进程。

#031         for (DWORD i = 0; i < dwProcCount; i++)

#032         {

#033               wsprintf(chBuf,_T("EnumProcesses (%d)./r/n"), dwProcs[i] );

#034               OutputDebugString(chBuf);

#035

#036               //根据进程ID打开进程。

#037               HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |

#038                    PROCESS_VM_READ,

#039                    FALSE, dwProcs[i] );

#040

#041               if (hProcess)

#042               {

#043                    //

#044                    PROCESS_MEMORY_COUNTERS pmc;

#045                    pmc.cb = sizeof(PROCESS_MEMORY_COUNTERS);

#046

#047                    //获取这个进程的内存使用情况。

#048                   if ( ::GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )

#049                    {

#050                          ZeroMemory(chBuf,nBufSize);

#051

#052                          wsprintf(chBuf,_T("/t缺页中断次数: 0x%08X/n"), pmc.PageFaultCount );

#053                          OutputDebugString(chBuf);

#054

#055                          wsprintf(chBuf,_T("/t使用内存高峰: 0x%08X/n"),

#056                               pmc.PeakWorkingSetSize );

#057                          OutputDebugString(chBuf);

#058

#059                          wsprintf(chBuf,_T("/t当前使用的内存: 0x%08X/n"), pmc.WorkingSetSize );

#060                          OutputDebugString(chBuf);

#061

#062                          wsprintf(chBuf,_T("/t使用页面缓存池高峰: 0x%08X/n"),

#063                               pmc.QuotaPeakPagedPoolUsage );

#064                          OutputDebugString(chBuf);

#065

#066                          wsprintf(chBuf,_T("/t使用页面缓存池: 0x%08X/n"),

#067                               pmc.QuotaPagedPoolUsage );

#068                          OutputDebugString(chBuf);

#069

#070                          wsprintf(chBuf,_T("/t使用非分页缓存池高峰: 0x%08X/n"),

#071                               pmc.QuotaPeakNonPagedPoolUsage );

#072                          OutputDebugString(chBuf);

#073

#074                          wsprintf(chBuf,_T("/t使用非分页缓存池: 0x%08X/n"),

#075                               pmc.QuotaNonPagedPoolUsage );

#076                          OutputDebugString(chBuf);

#077

#078                          wsprintf(chBuf,_T("/t使用分页文件: 0x%08X/n"), pmc.PagefileUsage );

#079                          OutputDebugString(chBuf);

#080

#081                          wsprintf(chBuf,_T("/t使用分页文件的高峰: 0x%08X/n"),

#082                               pmc.PeakPagefileUsage );

#083                          OutputDebugString(chBuf);

#084                    }

#085

#086                    //

#087                    CloseHandle(hProcess);

#088               }

#089         }

#090

#091  }

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skiwnchh/p/10346919.html

时间: 2024-10-07 10:50:31

Windows API一日一练 91 GetProcessMemoryInfo函数的相关文章

Windows API一日一练 4 MessageBox函数

为了显示提示信息给用户,Windows是提供了一个非常方便的API函数MessageBox给用户使用,使用这个API函数可以显示简单的文字信息出来,提醒或提示用户进行下一步操作. 函数声明如下: WINUSERAPI int WINAPI MessageBoxA( __in_opt HWND hWnd, __in_opt LPCSTR lpText, __in_opt LPCSTR lpCaption, __in UINT uType); WINUSERAPI int WINAPI Messag

Windows API一日一练 25 CreateSolidBrush函数

当你看到Windows显示的按钮时,背景颜色是灰色的.当你看到缺省的窗口背景时,它是白色的.当你的老板需要你创建一个黑色背景的按钮时,你会怎么样做呢?其实在Windows里先用API函数CreateSolidBrush创建画刷,然后调用FillRect函数来填充背景.这样来,不管你需要什么样的背景,都随心所欲了吧.现在先来搞懂CreateSolidBrush函数,下次再来练习FillRect. 函数CreateSolidBrush声明如下: WINGDIAPI HBRUSH WINAPI Cre

Windows API一日一练 75 SystemParametersInfo函数

面对华丽的Windows桌面,工作的心情或许好很多,但是久了总会失去兴趣,总想定期地更新桌面的图片.软件开发人员又面对这样的需求了,需要怎么样去做呢?努力去找API函数吧.到目前为止,还有很多变桌面图片的软件,并且还能很挣钱的.其实设置桌面图片的需求,在目前数码相片处理软件也有现实的需求,比如当你去旅游回来后,想把照片当作桌面图片,就可以在处理图片时就设置为桌面图片.这样就需要使用函数SystemParametersInfo来完成这项工作了,当然这个函数还有很多其它功能,比如获取桌面工作区的大小

Windows API一日一练 77 VirtualAlloc函数

上一次学习了全局内存的分配,在Windows里内存管理是分为两部份,全局内存是系统管理的内存,因而所有进程都可以访问的内存,而每一个进程又有自己的内存空间,这就是虚拟内存空间了,而虚拟内存的空间比较大,当物理内存不足时,系统会把虚拟内存的数据保存到硬盘里,这样只要硬盘的空间足够大,每个进程就可以使用3G的内存.虚拟内存分配可以作为程序里分配内存的主要方式,比如大量的数据缓冲区,动态分配内存的空间.使用VirtualAlloc函数来分配内存的速度要比全局内存要快. 函数VirtualAlloc声明

Windows API一日一练 41 FindWindowEx函数

当你想控制一个现有的窗口程序时,就需要获取那个程序的窗口句柄.比如有一些黑客软件需要查找到窗口,然后修改窗口的标题.在外挂流行的今天,惊奇地发现它们也可以修改输入窗口的文字.这其中,就需要使用到FindWindowEx函数来定位窗口.下面就来使用这个函数来实现控制Windows里带的计算器程序.打开计算器程序,最小化在状态下面,运行本例子,点击创建按钮后,就可以点按钮,就会把计算器显示在最前面. 函数FindWindowEx声明如下: #if(WINVER >= 0x0400) WINUSERA

Windows API一日一练 83 GetModuleFileName函数

在开发软件的过程里,经常需要把数据保存到当前执行文件路径下面,或者读取当前执行文件路径下的一些配置信息.这时就需要从当前模块里获取所在的目录路径,以便进行固定的位置操作文件.要解决这个需求,就需要调用API函数GetModuleFileName来获取模块所在的路径. 函数GetModuleFileName声明如下: WINBASEAPI DWORD WINAPI GetModuleFileNameA( __in_opt HMODULE hModule, __out_ecount_part(nSi

Windows API一日一练 43 WaitForSingleObject函数

上面已经介绍怎么样创建一个简单的线程,在那里就需要使用函数WaitForSingleObject,它是用来做什么的呢?其实它是用来实现等待线程结束的,它的机理是这样的,通知Windows操作系统,现在我进入睡眼状态,当我关注的对象条件是否满足,如果满足了就吵醒我.在那里关注的对象是线程是否退出,这是一个条件测试.如果不等待线程关闭,就去删除线程的资源,就会出错的.使用前面的线程是简单一些,但它不合适复用,现在就使用C++的类来封装一个比较好用的类,这样就可以很方便地创建很多线程来使用,当然还可以

Windows API一日一练 7 ShowWindow函数

ShowWindow的API函数是显示窗口,但它在第一次调用和以后的调用是有区别的.第一次调用时,它的输入参数nCmdShow是需要输入WinMain函数里传入来的nCmdShow参数,而不能是其它参数. 函数声明如下: WINUSERAPI BOOL WINAPI ShowWindow( __in HWND hWnd, __in int nCmdShow); hWnd是窗口的句柄. nCmdShow是窗口显示的状态.可能设置的值如下: SW_FORCEMINIMIZE是强制窗口最小化,主要使用

Windows API一日一练 81 FormatMessage函数

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 在开发软件的过程里,经常要做的工作就是调试程序,许多问题的出现,不但是逻辑的问题,还有可能是对API的不熟悉,或者某种条件下调用API会出错的.那么这些出错的原因是什么呢?通常只获取到错误码,也就是通过函数GetLastError得到.当然可以根据这个错误码去查找MSDN就可以知道出错的原因,但有时在客户那里并没有MSDN,那么就需