﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-不在浮沙筑高台-demons-文章分类-10信安小组</title><link>http://www.cppblog.com/Duwen/category/20168.html</link><description>C++/OS/disassembly/Anti-virus</description><language>zh-cn</language><lastBuildDate>Sat, 03 Nov 2012 09:48:02 GMT</lastBuildDate><pubDate>Sat, 03 Nov 2012 09:48:02 GMT</pubDate><ttl>60</ttl><item><title>利用函数指针实现相同框架代码的重用的一个示例</title><link>http://www.cppblog.com/Duwen/articles/194203.html</link><dc:creator>demons</dc:creator><author>demons</author><pubDate>Sat, 03 Nov 2012 09:18:00 GMT</pubDate><guid>http://www.cppblog.com/Duwen/articles/194203.html</guid><wfw:comment>http://www.cppblog.com/Duwen/comments/194203.html</wfw:comment><comments>http://www.cppblog.com/Duwen/articles/194203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Duwen/comments/commentRss/194203.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Duwen/services/trackbacks/194203.html</trackback:ping><description><![CDATA[<p>题目：<br />DoALLProcesses(<span style="font-family:宋体;">参数</span>)<span style="font-family:宋体;">函数为接受一个函数指针，确保我下面代码成功：</span></p>  <p>DoALLProcesses(<span style="font-size: 13px; background-color: #eeeeee;">&nbsp;listEachProc</span>);<span style="font-family:宋体;">可以输出每个进程的基本信息。</span></p>  <p>DoALLProcesses<span style="font-family:宋体;">（</span>TerminateQQ<span style="font-family:宋体;">）</span>;//<span style="font-family:宋体;">终止</span>qq</p>  <p>&nbsp;<span style="font-family:宋体;">其中</span>PrintEachProcName<span style="font-family:宋体;">和</span>TerminateQQ<span style="font-family:宋体;">是你自己定义的函数名。<br />目的：通过本次练习，掌握函数指针的使用，理解C语言中如何利用函数指针对相同框架代码重用。<br /><br />分析：由提议可知</span>DoALLProcesses为遍历进程的框架代码,具体看代码。<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;"stdafx.h"<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;&lt;Windows.h&gt;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;&lt;tlhelp32.h&gt;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">typedef&nbsp;bool&nbsp;(*DOEACHPROCFUN)(PROCESSENTRY32&nbsp;&amp;pe32,&nbsp;HANDLE&nbsp;hProcess);</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">bool</span>&nbsp;listEachProc(PROCESSENTRY32&nbsp;&amp;pe32)<span style="color: #008000; ">//</span><span style="color: #008000; ">列出进程</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span>{<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;flag=0;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">判断是否是第一行</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(flag==0)<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=1;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%-30s%-10s%-15s%-15s\n","Process&nbsp;Name","PID","ThreadsCount","Priority");&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_tprintf(&nbsp;_T("%-30s%-10ld%-15ld%-15ld\n"),&nbsp;pe32.szExeFile,pe32.th32ProcessID,<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pe32.cntThreads,pe32.pcPriClassBase);&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;TRUE;<br /><span style="color: #008080; ">20</span>&nbsp;}<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;terminateQQ(PROCESSENTRY32&nbsp;&amp;pe32)<span style="color: #008000; ">//</span><span style="color: #008000; ">若是QQ就终止</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #008000; "></span>{<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(_tcsicmp(pe32.szExeFile,_T("QQ.exe"))==0)<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hProcess=OpenProcess(PROCESS_TERMINATE&nbsp;,FALSE,pe32.th32ProcessID);<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TerminateProcess(hProcess,0);<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("A&nbsp;QQ&nbsp;process&nbsp;been&nbsp;terminated&nbsp;!\n");<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">表示继续查找</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">32</span>&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">DoALLProcesses&nbsp;为枚举进程的框架代码，没找到一个，就会对它调用pfn所指向的函数</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">36</span>&nbsp;BOOL&nbsp;DoALLProcesses(&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;(&nbsp;*pfn)(PROCESSENTRY32&nbsp;&amp;pe32)&nbsp;)<span style="color: #008000; ">//</span><span style="color: #008000; ">注意函数指针做参数的语法</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #008000; "></span>{<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hProcessSnap;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESSENTRY32&nbsp;pe32;<br /><span style="color: #008080; ">40</span>&nbsp;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hProcessSnap&nbsp;=&nbsp;CreateToolhelp32Snapshot(&nbsp;TH32CS_SNAPPROCESS,&nbsp;0&nbsp;);<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(&nbsp;hProcessSnap&nbsp;==&nbsp;INVALID_HANDLE_VALUE&nbsp;)<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cerr&lt;&lt;&nbsp;"CreateToolhelp32Snapshot&nbsp;error\n"&nbsp;;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>(&nbsp;FALSE&nbsp;);<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pe32.dwSize&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(&nbsp;PROCESSENTRY32&nbsp;);<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(&nbsp;!Process32First(&nbsp;hProcessSnap,&nbsp;&amp;pe32&nbsp;)&nbsp;)<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cerr&lt;&lt;"Process32First&nbsp;"&nbsp;;&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(&nbsp;hProcessSnap&nbsp;);&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>(&nbsp;FALSE&nbsp;);<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">do</span><br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;!pfn(pe32))<span style="color: #008000; ">//</span><span style="color: #008000; ">此处调用作为参数传进的函数指针(注意会根据pfn反回的值决定是否跳出循环)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(&nbsp;Process32Next(&nbsp;hProcessSnap,&nbsp;&amp;pe32&nbsp;)&nbsp;);<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(&nbsp;hProcessSnap&nbsp;);<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>(&nbsp;TRUE&nbsp;);<br /><span style="color: #008080; ">63</span>&nbsp;}<br /><span style="color: #008080; ">64</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br /><span style="color: #008080; ">65</span>&nbsp;{<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DoALLProcesses(listEachProc);<span style="color: #008000; ">//</span><span style="color: #008000; ">列举所有进程</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;printf("\n\n");<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DoALLProcesses(terminateQQ);<span style="color: #008000; ">//</span><span style="color: #008000; ">终止所有QQ进程</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">70</span>&nbsp;}<br /><span style="color: #008080; ">71</span></div><p>&nbsp;</p><img src ="http://www.cppblog.com/Duwen/aggbug/194203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Duwen/" target="_blank">demons</a> 2012-11-03 17:18 <a href="http://www.cppblog.com/Duwen/articles/194203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>