不在浮沙筑高台-demons
C++/OS/disassembly/Anti-virus
posts - 5,  comments - 5,  trackbacks - 0

题目:
DoALLProcesses(参数)函数为接受一个函数指针,确保我下面代码成功:

DoALLProcesses( listEachProc);可以输出每个进程的基本信息。

DoALLProcessesTerminateQQ;//终止qq

 其中PrintEachProcNameTerminateQQ是你自己定义的函数名。
目的:通过本次练习,掌握函数指针的使用,理解C语言中如何利用函数指针对相同框架代码重用。

分析:由提议可知
DoALLProcesses为遍历进程的框架代码,具体看代码。

 1 
 2 #include "stdafx.h"
 3 #include <Windows.h>
 4 #include <tlhelp32.h>
 5 #include <iostream>
 6 using namespace std;
 7 //typedef bool (*DOEACHPROCFUN)(PROCESSENTRY32 &pe32, HANDLE hProcess);
 8 bool listEachProc(PROCESSENTRY32 &pe32)//列出进程
 9 {
10     static char flag=0; //判断是否是第一行
11     if (flag==0)
12     {
13         flag=1;
14         
15         printf("%-30s%-10s%-15s%-15s\n","Process Name","PID","ThreadsCount","Priority");    
16     }
17     _tprintf( _T("%-30s%-10ld%-15ld%-15ld\n"), pe32.szExeFile,pe32.th32ProcessID,
18         pe32.cntThreads,pe32.pcPriClassBase);    
19     return TRUE;
20 }
21 
22 bool terminateQQ(PROCESSENTRY32 &pe32)//若是QQ就终止
23 {
24     if(_tcsicmp(pe32.szExeFile,_T("QQ.exe"))==0)
25     {
26     HANDLE hProcess=OpenProcess(PROCESS_TERMINATE ,FALSE,pe32.th32ProcessID);
27         TerminateProcess(hProcess,0);
28         printf("A QQ process been terminated !\n");
29     }
30     return true;//表示继续查找
31 
32 }
33 
34 //DoALLProcesses 为枚举进程的框架代码,没找到一个,就会对它调用pfn所指向的函数
35 
36 BOOL DoALLProcesses( bool ( *pfn)(PROCESSENTRY32 &pe32) )//注意函数指针做参数的语法
37 {
38     HANDLE hProcessSnap;
39     PROCESSENTRY32 pe32;
40 
41     hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
42     if( hProcessSnap == INVALID_HANDLE_VALUE )
43     {
44         cerr<< "CreateToolhelp32Snapshot error\n" ;
45         return( FALSE );
46     }
47 
48     pe32.dwSize = sizeof( PROCESSENTRY32 );
49     if( !Process32First( hProcessSnap, &pe32 ) )
50     {
51         cerr<<"Process32First " ; 
52         CloseHandle( hProcessSnap );   
53         return( FALSE );
54     }
55     do
56     {
57         if ( !pfn(pe32))//此处调用作为参数传进的函数指针(注意会根据pfn反回的值决定是否跳出循环)
58             break;    
59     }
60     while( Process32Next( hProcessSnap, &pe32 ) );
61     CloseHandle( hProcessSnap );
62     return( TRUE );
63 }
64 int _tmain(int argc, _TCHAR* argv[])
65 {
66     DoALLProcesses(listEachProc);//列举所有进程
67     printf("\n\n");
68     DoALLProcesses(terminateQQ);//终止所有QQ进程
69     return 0;
70 }
71

 

posted on 2012-11-03 17:18 demons 阅读(180) 评论(0)  编辑 收藏 引用 所属分类: 10信安小组

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2024年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜