【vc++精品源码栏目提醒】:以下是网学会员为您推荐的vc++精品源码-枚举进程的几种方法 - 软件工程,希望本篇文章对您学习有所帮助。
昨天在对 Windows 服务学习的时候突然想到编写一个在一段时间间隔后对系统进程进行列举,从而可以根据查看输出内容判断系统是否出现了异常,但以回忆自己以前对进程的学习都忘完了,只好又从新在网上搜查一番,看看各位的高招。
然后为了不在犯同样的错误,把它记录下来吧。
恩,只要 CSDN 一天还在,这些东西应该是会在的吧。
还真别说,在网上一搜的话,各位大侠的文章确实写得很好,本来我觉得他们的水平比我的是在高的太多,干脆直接转载算了,以免那些朋友在访问我的博客时看到我自己糟糕的文章大骂我一番,后来一想,既然是为了学习,我还是写写自己理解的东西吧,并把网址提供给各位,希望有幸被你们先搜索到我博客的时,可以在看不懂的情况下去看以看原帖。
四种方法实现 VC 枚举系统当前进程(原帖)http://safe.zol.com.cn/2005/0427/167328.shtml方法一:使用 ToolHelp Service 提供的 API 函数来实现对进程的枚举,实现非常简单。
1、调用 CreateToolhelp32Snapshot 创建进程快照,返回快照句柄。
2、使用 Process32First 从意思就知道是对第一个进程进行操作,就是入口进程。
3、使用 Process32Next 逐个的读取进程,就像游标一样吧,多放在循环中。
哈哈,三个函数就搞定了。
三个函数的实现可以这样比喻,调用 CreateToolhelp32Snapshot给系统中的进程照了一张照片,上面就有系统中的进程了,一排一排的很多让我们眼花缭乱,为了我们不至于看错我们只有从照片的开始第一条记录,用手指一条一条的往下数最后一直看完。
由此来看,CreateToolhelp32Snapshot 返回的就是那一张纸了,我们把眼睛放在纸上看时,可以看纸上的任何一个地方,而此处我们的目的是要看第一条记录,因此要看第一条记录就相当于 Process32First 函数,看来第一条后,我冲动了想看第二条,看了第二条忍不住又要看第三条,这个就相当于调用了 Process32Next 函数,当然如果记录看完了,就没有看到了,把纸或照片还给别人吧,如果觉得照得不好看,就把它烧了吧,哈哈。
很明显在上面的过程中,我们在看照片的过程中,我们怎么知道我们看到是第一条记录,第二条呢,怎么知道上面的是头,下面的是脚呢。
我们人是思考的动物,习惯成自然后,很多东西不需要特别去想,哈哈,可能是缓存的容量比较大,速度也比较快吧。
但计算机就不一样了,它不行。
它必须要把照片给明确的分解开了,指定照片上的这个地方必须放头,那个地方必须放脚,哈哈,头大的就惨了,计算机可能就会认为你的头是没有嘴或把你的身体都认为是头了,它真的懵了,哈哈。
所以不要和计算机开玩笑。
我们就来看看他是怎么对照片作规定的呢,请看下面的结构:typedef struct tagPROCESSENTRY32 DWORD dwSize //规定大小了吧,这里不同的是所有的器官都是一样大的 DWORD cntUsage //进程被引用数, DWORD th32ProcessID //进程 ID 头从上到下序号应该排一把 ULONG_PTR th32DefaultHeapID //默认堆 ID DWORD th32ModuleID DWORD cntThreads DWORD th32ParentProcessID LONG pcPriClassBase DWORD dwFlags //不使用 TCHAR szExeFileMAX_PATH //进程名称 PROCESSENTRY32typedef PROCESSENTRY32 PPROCESSENTRY32恩,使用时在慢慢去体会成员的意思吧。
各个函数HANDLE WINAPI CreateToolhelp32Snapshot DWORD dwFlags //系统快照要查看的信息类型 DWORD th32ProcessID //值 0 表示当前进程BOOL WINAPI Process32First HANDLE hSnapshot //CreateToolhelp32Snapshot创建的快照句柄 LPPROCESSENTRY32 lppe //指向进程入口结构BOOL WINAPI Process32Next HANDLE hSnapshot //这里参数同 Process32First LPPROCESSENTRY32 lppe //同上总之,不管怎样,现在我们可以把这张照片给分解下来,如果是罪犯的话,就告诉警察吧,等着领赏。
实现代码如下:其实现将进程显示到列表框中。
void CTerminateProcessDlg::OnGetProcessm_ListBox.ResetContentCString m_outputHANDLE hProcessSn