﻿<?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++博客-c++,信息安全，密码学应用</title><link>http://www.cppblog.com/Alex-Lee/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 21:24:13 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 21:24:13 GMT</pubDate><ttl>60</ttl><item><title>请大家帮忙：如何将windows系统服务程序移植为linux系统服务？</title><link>http://www.cppblog.com/Alex-Lee/archive/2012/02/04/164943.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Sat, 04 Feb 2012 08:03:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2012/02/04/164943.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/164943.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2012/02/04/164943.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/164943.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/164943.html</trackback:ping><description><![CDATA[<div><span style="font-family: simsun; line-height: 23px; ">各位好，我有个windows系统服务程序，需要移植到linux系统下。比如windows下有安装、卸载、自动开机运行、停止等功能，linux如何处理？另外这个服务是个socket服务，linux的socket服务需要注意哪些？<br /><br />能给我提供资料文章、或者示例代码都行.搜索了好久，就是没有找到想要的，估计是linux不熟悉，不知道咋搜索。谢谢。<br /><br />收集到资料就撤。。</span></div><img src ="http://www.cppblog.com/Alex-Lee/aggbug/164943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2012-02-04 16:03 <a href="http://www.cppblog.com/Alex-Lee/archive/2012/02/04/164943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转： 十个最近超流行的笑话（少儿不宜）</title><link>http://www.cppblog.com/Alex-Lee/archive/2009/12/02/102384.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Wed, 02 Dec 2009 05:25:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2009/12/02/102384.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/102384.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2009/12/02/102384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/102384.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/102384.html</trackback:ping><description><![CDATA[<div class=thread_content>转： <a href="http://home.cnblogs.com/group/topic/10722.html">http://home.cnblogs.com/group/topic/10722.html</a>
<p><br><br>1 小姐向police解释自己没有MaiYin：我只是把两元的避孕套卖到了二百元，最多算抬高物价。 <br><br>　　pol.ice：后来呢？ <br><br>　　小姐说：教他如何使用，属于售后服务。 <br><br>2　　演出结束，领导上台拉住漂亮的蒙古族女演员的手嘘寒问暖不放手，还一个劲地问叫什么名字？女演员激动地说：玛勒格碧. <br><br>3　生日派对上蛋糕只剩下一块，上面恰好写着生日两个字。男孩大方地拿起刀一分为二，温柔地对女孩说：&#8220;我负责&#8216;日&#8217;，你负责&#8216;生&#8217;，好吗？&#8221; <br><br>4　　人生感语：当工作和<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%88%B1%E6%83%85">爱情</span>不如意时，可掏出小弟弟，凝视它、静思它所蕴含之精神：能长能短，能粗能细，能伸能曲，能软能硬，学学它，眼前的困难算个鸟！ <br><br>5　 一幼儿园的小破孩躲在厕所里吸烟，被老师抓到，老师问他为什么吸烟，他低下头，深沉的回答：祖国未统一，心情很郁闷！ <br><br>6　　处长与漂亮的处女跳舞，舞曲高潮时处长有点激动，下面挺了起来，处女察觉后好奇地问：你下面是什么？处长：我下面是科长。处女：官不大还挺硬 <br><br>7　　女市长和男书记共同赴宴，席间高兴之余，书记说：书记一般都干过市长！女市长机灵地应答：是的，书记一般是市长生（升）的！ <br><br>8　　有人说：聪明的女人可以激励男人,秀美的女人可以迷惑男人,有才华的女人可以吸引男人,有地位的女人可以玩转男人,什么都有的女人可以搞惨一批男人! <br><br>9　　有一对男女过桥，桥上有一只老虎怒目而视，女略思索后脱衣而过。男也学脱衣而过，却被老虎扑倒。男不解？老虎说：你以为你有根小棍儿就是武松了？ <br><br>10　　老师让学生用&#8220;皱纹&#8221;造句，一学生写：我爸爸的蛋上有很多皱纹，老师批评家长不该啥地方都让孩子看。家长解释说：这孩子从小粗心，少写一个&#8220;脸&#8221;字。你笑了吗?笑了就请回个贴好吗？</p>
<p>&nbsp;</p>
<p><span style="COLOR: #ff0000">&nbsp;&nbsp; 感觉不错,顶下..</span></p>
<p><span style="COLOR: #ff0000">&nbsp;&nbsp; 当作支持 !!</span></p>
</div>
<img src ="http://www.cppblog.com/Alex-Lee/aggbug/102384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2009-12-02 13:25 <a href="http://www.cppblog.com/Alex-Lee/archive/2009/12/02/102384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>哈希结构</title><link>http://www.cppblog.com/Alex-Lee/archive/2009/10/22/99145.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Wed, 21 Oct 2009 16:31:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2009/10/22/99145.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/99145.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2009/10/22/99145.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/99145.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/99145.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:                                                             哈希结构<br><br>                                                                                                         C++博客   Alex-Lee   2009-10-21<br><br>       哈希结构在处理大量数据时具有很好的优势，在插入，查询，删除等操作上具有常量的时间复杂度O(1)。使用范围是数据集具有自然数上的关键字域（不是自然数也需要能够转为自然数域），通过哈希函数将关键字映射到寻址数组的槽。由于关键字域U[0...n]与寻址数组[0...m]中，总是n>m，也就是说，总有多个关键字对应一个槽。这个碰撞就需要通过一些方法改变。可以通过拉链法（链表法）和开放地址法。对于拉链法中，链表不能太长，否则影响速度，最好控制在10个元素之内，这样就要去寻址数组长度m>= n/10，这样就会多消耗些空间。为了让每个链表长度基本一致，就需要&nbsp;&nbsp;<a href='http://www.cppblog.com/Alex-Lee/archive/2009/10/22/99145.html'>阅读全文</a><img src ="http://www.cppblog.com/Alex-Lee/aggbug/99145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2009-10-22 00:31 <a href="http://www.cppblog.com/Alex-Lee/archive/2009/10/22/99145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速排序算法、计数排序算法</title><link>http://www.cppblog.com/Alex-Lee/archive/2009/10/20/99065.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Tue, 20 Oct 2009 14:18:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2009/10/20/99065.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/99065.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2009/10/20/99065.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/99065.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/99065.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 快速排序算法、计数排序算法<br>   <br>                                                                                                               C++博客    Alex-Lee  2009-10-20<br><br>      快速排序是分治算法，将数组分为几部分，在各部分内完成排序，递归排序。算法时间复杂度O(nlgn)。这是比较排序算法中速度最快的一个算法了。计数排序、基数排序、桶排序算法是非比较排序算法，他们的算法复杂度是O(n)。快速排序算法在选取支点上要有技巧，最好能达到随即要求。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/Alex-Lee/archive/2009/10/20/99065.html'>阅读全文</a><img src ="http://www.cppblog.com/Alex-Lee/aggbug/99065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2009-10-20 22:18 <a href="http://www.cppblog.com/Alex-Lee/archive/2009/10/20/99065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优先级队列</title><link>http://www.cppblog.com/Alex-Lee/archive/2009/10/18/98872.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Sun, 18 Oct 2009 10:49:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2009/10/18/98872.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/98872.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2009/10/18/98872.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/98872.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/98872.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  优先级队列<br><br>                                                                                                   C++博客   Alex-Lee   2009-10-18<br>       <br>        上篇随笔谈到了堆结构的一个应用就是堆排序算法，虽然堆排序算法性能不错，但是比起快速排序算法还是有些差距。但是堆结构的另外一个应该就比较广泛了，就是优先级队列。<br>        优先级队列有3中操作：插入(O(lgn))，最大最小值(O(1)),删去最大最小值(O(lgn))。其算法性能很好，在优先级调度作业上应用比较广泛。基于优先级的调度算法中，基于堆结构的实现算法是一个比较好选择。在事件驱动的仿真器中也有应用。&nbsp;&nbsp;<a href='http://www.cppblog.com/Alex-Lee/archive/2009/10/18/98872.html'>阅读全文</a><img src ="http://www.cppblog.com/Alex-Lee/aggbug/98872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2009-10-18 18:49 <a href="http://www.cppblog.com/Alex-Lee/archive/2009/10/18/98872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆排序算法</title><link>http://www.cppblog.com/Alex-Lee/archive/2009/10/15/98716.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Thu, 15 Oct 2009 13:01:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2009/10/15/98716.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/98716.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2009/10/15/98716.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/98716.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/98716.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 堆排序算法<br><br>                                                                                                               ---------- C++博客 Alex-Lee   2009-10-15<br><br>      （二叉）堆结构是一种数组对象，它可以被视为一颗完全二叉树。算法时间复杂度O(nlgn)，具有插入排序和合并排序的优点。堆结构满足堆性质：对除根以外的每个节点i,满足A[PARENT(i)] >= A[i]。<br>   <br>       堆排序算法实现有三个部分完成：<br>1，保持堆性质函数heap_ify;<br>2,构建堆函数build_heap;<br>3,堆排序函数 heap_sort;<br>另外，在优先级队列中有extract-max 过程和insert过程，在作业队列中常用，比如消息队列。这部分在优先级排序中说明。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/Alex-Lee/archive/2009/10/15/98716.html'>阅读全文</a><img src ="http://www.cppblog.com/Alex-Lee/aggbug/98716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2009-10-15 21:01 <a href="http://www.cppblog.com/Alex-Lee/archive/2009/10/15/98716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>证书的申请过程（usbkey）</title><link>http://www.cppblog.com/Alex-Lee/archive/2009/05/10/82505.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Sun, 10 May 2009 11:31:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2009/05/10/82505.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/82505.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2009/05/10/82505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/82505.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/82505.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 证书的申请过程（usbkey）&nbsp;&nbsp;<a href='http://www.cppblog.com/Alex-Lee/archive/2009/05/10/82505.html'>阅读全文</a><img src ="http://www.cppblog.com/Alex-Lee/aggbug/82505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2009-05-10 19:31 <a href="http://www.cppblog.com/Alex-Lee/archive/2009/05/10/82505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC下CSocket编程详解</title><link>http://www.cppblog.com/Alex-Lee/archive/2009/04/15/79974.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Wed, 15 Apr 2009 03:10:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2009/04/15/79974.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/79974.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2009/04/15/79974.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/79974.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/79974.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MFC下CSocket编程详解转自：http://blog.csdn.net/yejiansnake/archive/2008/03/13/2175778.aspxMFC下CSocket编程详解:&nbsp;1. 常用的函数和注意事项(详细的函数接口说明请查看MSDN):&nbsp;&nbsp;&nbsp; CSocket::Create 初始化(一般写服务器程序都不要用为好,用下面的...&nbsp;&nbsp;<a href='http://www.cppblog.com/Alex-Lee/archive/2009/04/15/79974.html'>阅读全文</a><img src ="http://www.cppblog.com/Alex-Lee/aggbug/79974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2009-04-15 11:10 <a href="http://www.cppblog.com/Alex-Lee/archive/2009/04/15/79974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SetWindowsHookEx函数详解</title><link>http://www.cppblog.com/Alex-Lee/archive/2009/03/29/78236.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Sun, 29 Mar 2009 01:06:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2009/03/29/78236.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/78236.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2009/03/29/78236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/78236.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/78236.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowsHookEx函数详解<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转正自：<a href="http://blog.csdn.net/hejinjiang/archive/2008/03/19/2197066.aspx">http://blog.csdn.net/hejinjiang/archive/2008/03/19/2197066.aspx</a><br><br><br><br><br><br><br>SetWindowsHookEx-HOOK 钩子详细介绍 <br>基本概念 <br>钩子(Hook)，是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息，而且所监视的窗口可以是其他进程所创建的。当消息到达后，在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 <br>钩子实际上是一个处理消息的程序段，通过系统调用，把它挂入系统。每当特定的消息发出，在没有到达目的窗口前，钩子程序就先捕获该消息，亦即钩子函数先得到控制权。这时钩子函数即可以加工处理（改变）该消息，也可以不作处理而继续传递该消息，还可以强制结束消息的传递。<br>--------------------------------------------------------------------------------</p>
<p>运行机制</p>
<p>1、钩子链表和钩子子程：</p>
<p>每一个Hook都有一个与之相关联的指针列表，称之为钩子链表，由系统来维护。这个列表的指针指向指定的，应用程 序定义的，被Hook子程调用的回调函数，也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时，系统就把这个消息传递到Hook子程。 一些Hook子程可以只监视消息，或者修改消息，或者停止消息的前进，避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始， 而最早安装的钩子放在最后，也就是后加入的先获得控制权。</p>
<p>Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载，Windows 便释放其占用的内存，并更新整个Hook链表。如果程序安装了钩子，但是在尚未卸载钩子之前就结束了，那么系统会自动为它做卸载钩子的操作。</p>
<p>钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数，只能定义为普通的C函数。用以监视系统或某一特定类型的事件，这些事件可以是与某一特定线程关联的，也可以是系统中所有线程的事件。</p>
<p>钩子子程必须按照以下的语法：</p>
<p>LRESULT CALLBACK HookProc<br>(<br>int nCode, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WPARAM wParam, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPARAM lParam<br>);</p>
<p>HookProc是应用程序定义的名字。</p>
<p>nCode参数是Hook代码，Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型，每一种Hook都有自己的Hook代码特征字符集。</p>
<p>wParam和lParam参数的值依赖于Hook代码，但是它们的典型值是包含了关于发送或者接收消息的信息。</p>
<p>2、钩子的安装与释放：</p>
<p>使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。 SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时，系统就调用与这个Hook关联的 Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个 Hook子程需要调用CallNextHookEx函数。</p>
<p>HHOOK SetWindowsHookEx( <br>int idHook,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 钩子的类型，即它处理的消息类型<br>HOOKPROC lpfn,&nbsp;&nbsp; // 钩子子程的地址指针。如果dwThreadId参数为0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 或是一个由别的进程创建的线程的标识，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // lpfn必须指向DLL中的钩子子程。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 除此以外，lpfn可以指向当前进程的一段钩子子程代码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 钩子函数的入口地址，当钩子钩到任何消息后便调用这个函数。<br>HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的<br>DLL。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果dwThreadId 标识当前进程创建的一个线程，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 而且子程代码位于当前进程，hMod必须为NULL。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 可以很简单的设定其为本应用程序的实例句柄。<br>DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果为0，钩子子程与所有的线程关联，即为全局钩子。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ); </p>
<p>　　函数成功则返回钩子子程的句柄，失败返回NULL。</p>
<p>　　以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程，且被钩子子程先处理。</p>
<p>在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后，如果想要该消息继续传递，那么它必须调用另外一个 SDK中的API函数CallNextHookEx来传递它，以执行钩子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值， 返回值的类型依赖于钩子的类型。这个函数的原型如下：</p>
<p>LRESULT CallNextHookEx<br>&nbsp;&nbsp; (<br>&nbsp;&nbsp;&nbsp; HHOOK hhk;<br>&nbsp;&nbsp;&nbsp; int nCode;<br>&nbsp;&nbsp;&nbsp; WPARAM wParam;<br>&nbsp;&nbsp;&nbsp; LPARAM lParam;<br>&nbsp;&nbsp;&nbsp; );</p>
<p>hhk为当前钩子的句柄，由SetWindowsHookEx()函数返回。</p>
<p>NCode为传给钩子过程的事件代码。</p>
<p>wParam和lParam 分别是传给钩子子程的wParam值，其具体含义与钩子类型有关。</p>
<p><br>钩子函数也可以通过直接返回TRUE来丢弃该消息，并阻止该消息的传递。否则的话，其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。</p>
<p>钩子在使用完之后需要用UnHookWindowsHookEx()卸载，否则会造成麻烦。释放钩子比较简单，UnHookWindowsHookEx()只有一个参数。函数原型如下：</p>
<p>UnHookWindowsHookEx<br>(<br>HHOOK hhk;<br>);</p>
<p>函数成功返回TRUE，否则返回FALSE。</p>
<p>3、一些运行机制：</p>
<p>在Win16环境中，DLL的全局数据对每个载入它的进程来说都是相同的；而在Win32环境中，情况却发生了变化，DLL函数中的代码所创建的任何对象（包括变量）都归调用它的线程或进程所有。当进程在载入DLL时，操作系统自动把DLL地址映射到该进程的私有空间，也就是进程的虚拟地址空间，而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据，它们的名称相同，但其值却并不一定是相同的，而且是互不干涉的。</p>
<p><br>因此，在Win32环境下要想在多个进程中共享数据，就必须进行必要的设置。在访问同一个Dll的各进程 之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来，放置在一个独立的数据段里，并把该段的属性设置为共享。必须给这些 变量赋初值，否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。</p>
<p>#pragma data_seg预处理指令用于设置共享数据段。例如：</p>
<p>#pragma data_seg("SharedDataName")<br>HHOOK hHook=NULL;<br>#pragma data_seg()</p>
<p>在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量将被访问该Dll的所有进程看到和共享。再加上一条指令#pragma comment(linker,"/section:.SharedDataName,rws"),那么这个数据节中的数据可以在所有DLL的实例之间共 享。所有对这些数据的操作都针对同一个实例的，而不是在每个进程的地址空间中都有一份。</p>
<p>当进程隐式或显式调用一个动态库里的函数时，系统都要把这个动态库映射到这个进程的虚拟地址空间里(以下简称"地址空间")。这使得DLL成为进程的一部分，以这个进程的身份执行，使用这个进程的堆栈。</p>
<p>4、系统钩子与线程钩子：</p>
<p>SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。</p>
<p><br>线程勾子用于监视指定线程的事件消息。线程勾子一般在当前线程或者当前线程派生的线程内。</p>
<p><br>系统勾子监视系统中的所有线程的事件消息。因为系统勾子会影响系统中所有的应用程序，所以勾子函数必须放在独立的动态链接库(DLL) 中。系统自动将包含"钩子回调函数"的DLL映射到受钩子函数影响的所有进程的地址空间中，即将这个DLL注入了那些进程。</p>
<p>几点说明：</p>
<p>（1）如果对于同一事件（如鼠标消息）既安装了线程勾子又安装了系统勾子，那么系统会自动先调用线程勾子，然后调用系统勾子。 </p>
<p>（2）对同一事件消息可安装多个勾子处理过程，这些勾子处理过程形成了勾子链。当前勾子处理结束后应把勾子信息传递给下一个勾子函数。 </p>
<p>（3）勾子特别是系统勾子会消耗消息处理时间，降低系统性能。只有在必要的时候才安装勾子，在使用完毕后要及时卸载。</p>
<p><br>--------------------------------------------------------------------------------</p>
<p>钩子类型</p>
<p>每一种类型的Hook可以使应用程序能够监视不同类型的系统消息处理机制。下面描述所有可以利用的Hook类型。</p>
<p>1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks</p>
<p>WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程，并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。</p>
<p>WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构，再传递到Hook子程。</p>
<p>CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值，同样也包括了与这个消息关联的消息参数。</p>
<p>2、WH_CBT Hook</p>
<p>在以下事件之前，系统都会调用WH_CBT Hook子程，这些事件包括：</p>
<p>1. 激活，建立，销毁，最小化，最大化，移动，改变尺寸等窗口事件；</p>
<p>2. 完成系统指令；</p>
<p>3. 来自系统消息队列中的移动鼠标，键盘事件；</p>
<p>4. 设置输入焦点事件；</p>
<p>5. 同步系统消息队列事件。</p>
<p><br>Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。</p>
<p>3、WH_DEBUG Hook</p>
<p>在系统调用系统中与其他Hook关联的Hook子程之前，系统会调用WH_DEBUG Hook子程。你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程。</p>
<p>4、WH_FOREGROUNDIDLE Hook</p>
<p>当应用程序的前台线程处于空闲状态时，可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时，系统就会调用WH_FOREGROUNDIDLE Hook子程。</p>
<p>5、WH_GETMESSAGE Hook</p>
<p>应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入，以及其他发送到消息队列中的消息。</p>
<p>6、WH_JOURNALPLAYBACK Hook</p>
<p>WH_JOURNALPLAYBACK Hook使应用程序可以插入消息到系统消息队列。可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook已经安装，正常的鼠标和键盘事件就是无效的。</p>
<p>WH_JOURNALPLAYBACK Hook是全局Hook，它不能象线程特定Hook一样使用。</p>
<p>WH_JOURNALPLAYBACK Hook返回超时值，这个值告诉系统在处理来自回放Hook当前消息之前需要等待多长时间（毫秒）。这就使Hook可以控制实时事件的回放。</p>
<p>WH_JOURNALPLAYBACK是system-wide local hooks，它們不會被注射到任何行程位址空間。</p>
<p>7、WH_JOURNALRECORD Hook</p>
<p>WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的，可以使用这个Hook记录连续的鼠标和键盘事件，然后通过使用WH_JOURNALPLAYBACK Hook来回放。</p>
<p>WH_JOURNALRECORD Hook是全局Hook，它不能象线程特定Hook一样使用。</p>
<p>WH_JOURNALRECORD是system-wide local hooks，它們不會被注射到任何行程位址空間。</p>
<p>8、WH_KEYBOARD Hook</p>
<p>在应用程序中，WH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息，这些消息通过GetMessage or PeekMessage function返回。可以使用这个Hook来监视输入到消息队列中的键盘消息。</p>
<p>9、WH_KEYBOARD_LL Hook</p>
<p>WH_KEYBOARD_LL Hook监视输入到线程消息队列中的键盘消息。</p>
<p>10、WH_MOUSE Hook</p>
<p>WH_MOUSE Hook监视从GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个Hook监视输入到消息队列中的鼠标消息。</p>
<p>11、WH_MOUSE_LL Hook</p>
<p>WH_MOUSE_LL Hook监视输入到线程消息队列中的鼠标消息。</p>
<p>12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks</p>
<p>WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以监视菜单，滚动条，消息框，对话框消息并且发现用户使用ALT+TAB or ALT+ESC 组合键切换窗口。WH_MSGFILTER Hook只能监视传递到菜单，滚动条，消息框的消息，以及传递到通过安装了Hook子程的应用程序建立的对话框的消息。WH_SYSMSGFILTER Hook监视所有应用程序消息。</p>
<p><br>WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以在模式循环期间过滤消息，这等价于在主消息循环中过滤消息。</p>
<p><br>通过调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。通过使用这个函数，应用程序能够在模式循环期间使用相同的代码去过滤消息，如同在主消息循环里一样。</p>
<p>13、WH_SHELL Hook</p>
<p>外壳应用程序可以使用WH_SHELL Hook去接收重要的通知。当外壳应用程序是激活的并且当顶层窗口建立或者销毁时，系统调用WH_SHELL Hook子程。</p>
<p>WH_SHELL 共有５钟情況：</p>
<p>1. 只要有个top-level、unowned 窗口被产生、起作用、或是被摧毁；</p>
<p>2. 当Taskbar需要重画某个按钮；</p>
<p>3. 当系统需要显示关于Taskbar的一个程序的最小化形式；</p>
<p>4. 当目前的键盘布局状态改变；</p>
<p>5. 当使用者按Ctrl+Esc去执行Task Manager（或相同级别的程序）。</p>
<p>按照惯例，外壳应用程序都不接收WH_SHELL消息。所以，在应用程序能够接收WH_SHELL消息之前，应用程序必须调用SystemParametersInfo function注册它自己。<br></p>
<img src ="http://www.cppblog.com/Alex-Lee/aggbug/78236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2009-03-29 09:06 <a href="http://www.cppblog.com/Alex-Lee/archive/2009/03/29/78236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类成员函数指针是什么?(C++)</title><link>http://www.cppblog.com/Alex-Lee/archive/2009/03/18/76981.html</link><dc:creator>Alex-Lee</dc:creator><author>Alex-Lee</author><pubDate>Wed, 18 Mar 2009 03:06:00 GMT</pubDate><guid>http://www.cppblog.com/Alex-Lee/archive/2009/03/18/76981.html</guid><wfw:comment>http://www.cppblog.com/Alex-Lee/comments/76981.html</wfw:comment><comments>http://www.cppblog.com/Alex-Lee/archive/2009/03/18/76981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alex-Lee/comments/commentRss/76981.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alex-Lee/services/trackbacks/76981.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 类成员函数指针&nbsp;&nbsp;<a href='http://www.cppblog.com/Alex-Lee/archive/2009/03/18/76981.html'>阅读全文</a><img src ="http://www.cppblog.com/Alex-Lee/aggbug/76981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alex-Lee/" target="_blank">Alex-Lee</a> 2009-03-18 11:06 <a href="http://www.cppblog.com/Alex-Lee/archive/2009/03/18/76981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>