??xml version="1.0" encoding="utf-8" standalone="yes"?> 感觉不错,下.. 当作支持 !!
能给我提供资料文章、或者示例代码都?搜烦了好久,是没有扑ֈ惌的,估计是linux不熟(zhn),不知道咋搜烦。谢谢?br />
攉到资料就撤。?/span>
]]>
1 姐向police解释自己没有MaiYinQ我只是把两元的避孕套卖C二百元,最多算抬高物h(hun)?
pol.iceQ后来呢Q?
姐_教他如何使用Q属于售后服务?
2 演出l束Q领g台拉住漂亮的蒙古族女演员的手嘘寒问暖不放手,q一个劲地问叫什么名字?x员激动地_玛勒格碧.
3 生日z֯上蛋p只剩下一块,上面恰好写着生日两个字。男孩大方地拿v刀一分ؓ二,温柔地对奛__“我负?#8216;?#8217;Q你负责‘?#8217;Q好吗?”
4 人生感语Q当工作?span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%88%B1%E6%83%85">爱情不如意时Q可掏出弟弟,凝视它、静思它所蕴含之精:能长能短Q能_能l,能能曲Q能软能,学学它,眼前的困隄个鸟Q?
5 一q儿园的破孩躲在厕所里吸烟,被老师抓到Q老师问他Z么吸烟,他低下头Q深沉的回答Q祖国未l一Q心情很郁闷Q?
6 处长与漂亮的处女跌Q舞曲高潮时处长有点Ȁ动,下面ZhQ处奛_觉后好奇地问Q你下面是什么?处长Q我下面是科ѝ处奻I官不大还挺硬
7 奛_长和男书记共同ʎ_席间高兴之余Q书记说Q书C般都q过市长Q女市长机灵地应{:是的Q书C般是市长生(升)的!
8 有h_聪明的女人可以激q?U的女h可以qh男h,有才华的女h可以吸引男h,有地位的女h可以玩{男h,什么都有的女h可以搞惨一批男?
9 有一对男奌桥,桥上有一只老虎怒目而视Q女略思烦后脱衣而过。男也学p而过Q却被老虎扑倒。男不解Q老虎_你以Z有根棍儿就是武松了Q?
10 老师让学生用“q”造句Q一学生写:我爸爸的蛋上有很多皱U,老师批评安不该啥地斚w让孩子看。家长解释说Q这孩子从小_心Q少写一?#8220;?#8221;字。你W了?W了p回个贴好吗?
]]>
C++博客 Alex-Lee 2009-10-21
哈希l构在处理大量数据时h很好的优势,在插入,查询Q删除等操作上具有常量的旉复杂度O(1)。用范围是数据集具有自然数上的关键字域Q不是自然数也需要能够{然数域)Q通过哈希函数关键字映射到寻址数组的槽。由于关键字域U[0...n]与寻址数组[0...m]中,Ln>mQ也是_L多个关键字对应一个槽。这个碰撞就需要通过一些方法改变。可以通过拉链法(链表法)和开攑֜址法。对于拉链法中,链表不能太长Q否则媄响速度Q最好控制在10个元素之内,q样pd址数组长度m>= n/10Q这样就会多消耗些I间。ؓ了让每个链表长度基本一_需?nbsp; 阅读全文
]]>
C++博客 Alex-Lee 2009-10-20
快速排序是分治法Q将数组分ؓ几部分,在各部分内完成排序,递归排序。算法时间复杂度O(nlgn)。这是比较排序算法中速度最快的一个算法了。计数排序、基数排序、桶排序法是非比较排序法Q他们的法复杂度是O(n)。快速排序算法在选取支点上要有技巧,最好能辑ֈ随即要求?
阅读全文
]]>
C++博客 Alex-Lee 2009-10-18
上篇随笔谈到了堆l构的一个应用就是堆排序法Q虽然堆排序法性能不错Q但是比起快速排序算法还是有些差距。但是堆l构的另外一个应该就比较q泛了,是优先U队列?
优先U队列有3中操作:插入(O(lgn))Q最大最?O(1)),删去最大最?O(lgn))。其法性能很好Q在优先U调度作业上应用比较q泛。基于优先的调度算法中Q基于堆l构的实现算法是一个比较好选择。在事g驱动的仿真器中也有应用?nbsp; 阅读全文
]]>
---------- C++博客 Alex-Lee 2009-10-15
Q二叉)堆结构是一U数l对象,它可以被视ؓ一颗完全二叉树。算法时间复杂度O(nlgn)Q具有插入排序和合ƈ排序的优炏V堆l构满堆性质Q对除根以外的每个节点i,满A[PARENT(i)] >= A[i]?
堆排序算法实现有三个部分完成Q?
1Q保持堆性质函数heap_ify;
2,构徏堆函数build_heap;
3,堆排序函?heap_sort;
另外Q在优先U队列中有extract-max q程和insertq程Q在作业队列中常用,比如消息队列。这部分在优先排序中说明?
阅读全文
]]>
]]>
]]>
转正自:http://blog.csdn.net/hejinjiang/archive/2008/03/19/2197066.aspx
SetWindowsHookEx-HOOK 钩子详细介绍
基本概念
钩子(Hook)Q是Windows消息处理机制的一个^?应用E序可以在上面设|子E以监视指定H口的某U消息,而且所监视的窗口可以是其他q程所创徏的。当消息到达后,在目标窗口处理函C前处理它。钩子机制允许应用程序截获处理window消息或特定事件?
钩子实际上是一个处理消息的E序D,通过pȝ调用Q把它挂入系l。每当特定的消息发出Q在没有到达目的H口前,钩子E序先捕获该消息,亦即钩子函数先得到控制权。这旉子函数即可以加工处理Q改变)该消息,也可以不作处理而l传递该消息Q还可以强制l束消息的传递?br>--------------------------------------------------------------------------------
q行机制
1、钩子链表和钩子子程Q?/p>
每一个Hook都有一个与之相兌的指针列表,UC为钩子链表,ql来l护。这个列表的指针指向指定的,应用E?序定义的Q被Hook子程调用的回调函敎ͼ也就是该钩子的各个处理子E。当与指定的Hookcd兌的消息发生时Q系l就把这个消息传递到Hook子程?一些Hook子程可以只监视消息,或者修Ҏ(gu)息,或者停止消息的前进Q避免这些消息传递到下一个Hook子程或者目的窗口。最q安装的钩子攑֜铄开始, 而最早安装的钩子攑֜最后,也就是后加入的先获得控制权?/p>
Windows q不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸蝲QW(xu)indows 侉K攑օ占用的内存,q更新整个Hook链表。如果程序安装了钩子Q但是在未卸蝲钩子之前q束了Q那么系l会自动为它做卸载钩子的操作?/p>
钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函敎ͼ只能定义为普通的C函数。用以监视系l或某一特定cd的事Ӟq些事g可以是与某一特定U程兌的,也可以是pȝ中所有线E的事g?/p>
钩子子程必须按照以下的语法:
LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam
);
HookProc是应用程序定义的名字?/p>
nCode参数是Hook代码QHook子程使用q个参数来确定Q务。这个参数的g赖于HookcdQ每一UHook都有自己的Hook代码特征字符集?/p>
wParam和lParam参数的g赖于Hook代码Q但是它们的典型值是包含了关于发送或者接收消息的信息?/p>
2、钩子的安装与释放:
使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中?SetWindowsHookEx函数L在Hook铄开头安装Hook子程。当指定cd的Hook监视的事件发生时Q系l就调用与这个Hook兌?Hook铄开头的Hook子程。每一个Hook链中的Hook子程都决定是否把q个事g传递到下一个Hook子程。Hook子程传递事件到下一?Hook子程需要调用CallNextHookEx函数?/p>
HHOOK SetWindowsHookEx(
int idHook, // 钩子的类型,卛_处理的消息类?br>HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数?
// 或是一个由别的q程创徏的线E的标识Q?br> // lpfn必须指向DLL中的钩子子程?br> // 除此以外Qlpfn可以指向当前q程的一D钩子子E代码?br> // 钩子函数的入口地址Q当钩子钩到M消息后便调用q个函数?br>HINSTANCE hMod, // 应用E序实例的句柄。标识包含lpfn所指的子程?br>DLL?br> // 如果dwThreadId 标识当前q程创徏的一个线E,
// 而且子程代码位于当前q程QhMod必须为NULL?br> // 可以很简单的讑֮其ؓ本应用程序的实例句柄?br>DWORD dwThreadId // 与安装的钩子子程相关联的U程的标识符?br> // 如果?Q钩子子E与所有的U程兌Q即为全局钩子?br> );
函数成功则返回钩子子E的句柄Q失败返回NULL?/p>
以上所说的钩子子程与线E相兌是指在一钩子链表中发l该U程的消息同时发送给钩子子程Q且被钩子子E先处理?/p>
在钩子子E中调用得到控制权的钩子函数在完成对消息的处理后Q如果想要该消息l箋传递,那么它必调用另外一?SDK中的API函数CallNextHookEx来传递它Q以执行钩子链表所指的下一个钩子子E。这个函数成功时q回钩子链中下一个钩子过E的q回| q回值的cd依赖于钩子的cd。这个函数的原型如下Q?/p>
LRESULT CallNextHookEx
(
HHOOK hhk;
int nCode;
WPARAM wParam;
LPARAM lParam;
);
hhk为当前钩子的句柄Q由SetWindowsHookEx()函数q回?/p>
NCodeZl钩子过E的事g代码?/p>
wParam和lParam 分别是传l钩子子E的wParam|其具体含义与钩子cd有关?/p>
钩子函数也可以通过直接q回TRUE来丢弃该消息QƈL该消息的传递。否则的话,其他安装了钩子的应用E序不会接收到钩子的通知而且q有可能产生不正的l果?/p>
钩子在用完之后需要用UnHookWindowsHookEx()卸蝲Q否则会造成ȝ。释N子比较简单,UnHookWindowsHookEx()只有一个参数。函数原型如下:
UnHookWindowsHookEx
(
HHOOK hhk;
);
函数成功q回TRUEQ否则返回FALSE?/p>
3、一些运行机Ӟ
在Win16环境中,DLL的全局数据Ҏ(gu)个蝲入它的进E来说都是相同的Q而在Win32环境中,情况却发生了变化QDLL函数中的代码所创徏的Q何对象(包括变量Q都归调用它的线E或q程所有。当q程在蝲入DLLӞ操作pȝ自动把DLL地址映射到该q程的私有空_也就是进E的虚拟地址I间Q而且也复制该DLL的全局数据的一份拷贝到该进E空间。也是说每个进E所拥有的相同的DLL的全局数据Q它们的名称相同Q但其值却q不一定是相同的,而且是互不干涉的?/p>
因此Q在Win32环境下要惛_多个q程中共享数据,必进行必要的讄。在讉K同一个Dll的各q程 之间׃n存储器是通过存储器映文件技术实现的。也可以把这些需要共享的数据分离出来Q放|在一个独立的数据D里Qƈ把该D늚属性设|ؓ׃n。必ȝq些 变量赋初|否则~译器会把没有赋初始值的变量攑֜一个叫未被初始化的数据D中?/p>
#pragma data_seg预处理指令用于设|共享数据段。例如:
#pragma data_seg("SharedDataName")
HHOOK hHook=NULL;
#pragma data_seg()
?pragma data_seg("SharedDataName")?pragma data_seg()之间的所有变量将被访问该Dll的所有进E看到和׃n。再加上一条指?pragma comment(linker,"/section:.SharedDataName,rws"),那么q个数据节中的数据可以在所有DLL的实例之间共 享。所有对q些数据的操作都针对同一个实例的Q而不是在每个q程的地址I间中都有一份?/p>
当进E隐式或昑ּ调用一个动态库里的函数Ӟpȝ都要把这个动态库映射到这个进E的虚拟地址I间?以下U?地址I间")。这使得DLL成ؓq程的一部分Q以q个q程的n份执行,使用q个q程的堆栈?/p>
4、系l钩子与U程钩子Q?/p>
SetWindowsHookEx()函数的最后一个参数决定了此钩子是pȝ钩子q是U程钩子?/p>
U程勑֭用于监视指定U程的事件消息。线E勾子一般在当前U程或者当前线E派生的U程内?/p>
pȝ勑֭监视pȝ中的所有线E的事g消息。因为系l勾子会影响pȝ中所有的应用E序Q所以勾子函数必L在独立的动态链接库(DLL) 中。系l自动将包含"钩子回调函数"的DLL映射到受钩子函数影响的所有进E的地址I间中,卛_q个DLL注入了那些进E?/p>
几点说明Q?/p>
Q?Q如果对于同一事gQ如鼠标消息Q既安装了线E勾子又安装了系l勾子,那么pȝ会自动先调用U程勑֭Q然后调用系l勾子?
Q?Q对同一事g消息可安装多个勾子处理过E,q些勑֭处理q程形成了勾子链。当前勾子处理结束后应把勑֭信息传递给下一个勾子函数?
Q?Q勾子特别是pȝ勑֭会消耗消息处理时_降低pȝ性能。只有在必要的时候才安装勑֭Q在使用完毕后要及时卸蝲?/p>
--------------------------------------------------------------------------------
钩子cd
每一U类型的Hook可以使应用程序能够监视不同类型的pȝ消息处理机制。下面描q所有可以利用的Hookcd?/p>
1、WH_CALLWNDPROC和W(xu)H_CALLWNDPROCRET Hooks
WH_CALLWNDPROC和W(xu)H_CALLWNDPROCRET Hooks使你可以监视发送到H口q程的消息。系l在消息发送到接收H口q程之前调用WH_CALLWNDPROC Hook子程Qƈ且在H口q程处理完消息之后调用WH_CALLWNDPROCRET Hook子程?/p>
WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCTl构Q再传递到Hook子程?/p>
CWPRETSTRUCTl构包含了来自处理消息的H口q程的返回|同样也包括了与这个消息关联的消息参数?/p>
2、WH_CBT Hook
在以下事件之前,pȝ都会调用WH_CBT Hook子程Q这些事件包括:
1. Ȁz,建立Q销毁,最化Q最大化Q移动,改变寸{窗口事Ӟ
2. 完成pȝ指oQ?/p>
3. 来自pȝ消息队列中的Ud鼠标Q键盘事Ӟ
4. 讄输入焦点事gQ?/p>
5. 同步pȝ消息队列事g?/p>
Hook子程的返回值确定系l是否允许或者防止这些操作中的一个?/p>
3、WH_DEBUG Hook
在系l调用系l中与其他Hook兌的Hook子程之前Q系l会调用WH_DEBUG Hook子程。你可以使用q个Hook来决定是否允许系l调用与其他Hook兌的Hook子程?/p>
4、WH_FOREGROUNDIDLE Hook
当应用程序的前台U程处于I闲状态时Q可以用WH_FOREGROUNDIDLE Hook执行低优先的Q务。当应用E序的前台线E大概要变成I闲状态时Q系l就会调用WH_FOREGROUNDIDLE Hook子程?/p>
5、WH_GETMESSAGE Hook
应用E序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数q回的消息。你可以使用WH_GETMESSAGE Hookȝ视鼠标和键盘输入Q以及其他发送到消息队列中的消息?/p>
6、WH_JOURNALPLAYBACK Hook
WH_JOURNALPLAYBACK Hook使应用程序可以插入消息到pȝ消息队列。可以用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连l的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook已经安装Q正常的鼠标和键盘事件就是无效的?/p>
WH_JOURNALPLAYBACK Hook是全局HookQ它不能象线E特定Hook一样用?/p>
WH_JOURNALPLAYBACK Hookq回时|q个值告诉系l在处理来自回放Hook当前消息之前需要等待多长时_毫秒Q。这׃Hook可以控制实时事g的回放?/p>
WH_JOURNALPLAYBACK是system-wide local hooksQ它們不會被注射CQ何行E位址I間?/p>
7、WH_JOURNALRECORD Hook
WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的Q可以用这个Hook记录q箋的鼠标和键盘事gQ然后通过使用WH_JOURNALPLAYBACK Hook来回放?/p>
WH_JOURNALRECORD Hook是全局HookQ它不能象线E特定Hook一样用?/p>
WH_JOURNALRECORD是system-wide local hooksQ它們不會被注射CQ何行E位址I間?/p>
8、WH_KEYBOARD Hook
在应用程序中QW(xu)H_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息Q这些消息通过GetMessage or PeekMessage functionq回。可以用这个Hook来监视输入到消息队列中的键盘消息?/p>
9、WH_KEYBOARD_LL Hook
WH_KEYBOARD_LL Hook监视输入到线E消息队列中的键盘消息?/p>
10、WH_MOUSE Hook
WH_MOUSE Hook监视从GetMessage 或?PeekMessage 函数q回的鼠标消息。用这个Hook监视输入到消息队列中的鼠标消息?/p>
11、WH_MOUSE_LL Hook
WH_MOUSE_LL Hook监视输入到线E消息队列中的鼠标消息?/p>
12、WH_MSGFILTER ?WH_SYSMSGFILTER Hooks
WH_MSGFILTER ?WH_SYSMSGFILTER Hooks使我们可以监视菜单,滚动条,消息框,对话框消息ƈ且发现用户用ALT+TAB or ALT+ESC l合键切换窗口。WH_MSGFILTER Hook只能监视传递到菜单Q滚动条Q消息框的消息,以及传递到通过安装了Hook子程的应用程序徏立的对话框的消息。WH_SYSMSGFILTER Hook监视所有应用程序消息?/p>
WH_MSGFILTER ?WH_SYSMSGFILTER Hooks使我们可以在模式循环期间qo消息Q这{h(hun)于在L息@环中qo消息?/p>
通过调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。通过使用q个函数Q应用程序能够在模式循环期间使用相同的代码去qo消息Q如同在L息@环里一栗?/p>
13、WH_SHELL Hook
外壳应用E序可以使用WH_SHELL HookL攉要的通知。当外壳应用E序是激zȝq且当顶层窗口徏立或者销毁时Q系l调用WH_SHELL Hook子程?/p>
WH_SHELL 共有Q钟情況Q?/p>
1. 只要有个top-level、unowned H口被生、v作用、或是被摧毁Q?/p>
2. 当Taskbar需要重L个按钮;
3. 当系l需要显C关于Taskbar的一个程序的最化形式Q?/p>
4. 当目前的键盘布局状态改变;
5. 当用者按Ctrl+EscL行Task ManagerQ或相同U别的程序)?/p>
按照惯例Q外壛_用程序都不接收WH_SHELL消息。所以,在应用程序能够接收WH_SHELL消息之前Q应用程序必调用SystemParametersInfo function注册它自己?br>