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

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

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

DoALLProcessesTerminateQQ;//终止qq

 其中listEachProcTerminateQQ是你自己定义的函数名。
目的:通过本次练习,掌握函数指针的使用,理解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:39 demons 阅读(1367) 评论(3)  编辑 收藏 引用 所属分类: Program in Windows

FeedBack:
# re: 利用函数指针实现相同框架代码的重用的一个示例
2012-11-04 15:06 | Jason Huang
您好,

我是猎头顾问Jason,现在给一家创业型美企(中美都有研发中心,全球不超过100人,业务是PC/MAC/iOS/Android/WP平台的视频电话,海淀区苏州街)招聘C++高级开发工程师和QA。

也欢迎搞服务器开发的人转过来做这个。

开发要求精通Linux or Windows底层知识,精通C++,精通数据结构和算法;

测试要求精通Linux命令,精通SQL Programming,能独立完成测试项目。

开发年薪30-40万,测试20-30万,并有大量期权。

谢谢,
Jason huang
jason@isofttalent.com
010-5283 7763  回复  更多评论
  
# re: 利用函数指针实现相同框架代码的重用的一个示例
2012-11-05 09:26 | zuhd
if ( !pfn(pe32))//此处调用作为参数传进的函数指针(注意会根据pfn反回的值决定是否跳出循环)

看不出来你这什么时候返回false  回复  更多评论
  
# re: 利用函数指针实现相同框架代码的重用的一个示例
2012-11-05 14:31 | demons
@zuhd
比如有时我们需要判断系统当前是否启动某个程序,如果已经找到了一个实例,就不必继续查找了,这时就返回false,框架中while循环就会结束,扫描终止。  回复  更多评论
  

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



<2012年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜