博客已迁移至:http://kulv.sinaapp.com/,这里不再使用
金山卫士开源代码----消息机制浅析 (上)
代码地址:http://download.youkuaiyun.com/source/3301518
今天简化了金山的开源代码,用来学习一下,先谢谢金山的开源精神了,呵呵···直接弄最简单的,窗口见下图,关键代码如下,全部的代码放附件里吧。分析中关于累的继承机制等没有详细的说明了,在函数申明中我会用SON: public BASE ::Func() 的方式指出的.今天主要学习一下其消息机制和路由。因为没有学过ATL,所以理解错了希望大家指教一下哦···
先谢谢了,呵呵···
/////////////////////////////////////////////////////////////////////////////////
/*我们来看如下消息机制的宏替换,容易看出,其酷像MFC的宏!开始我还看错了呢,呵呵*/
/*如上宏声明替换后实际上就是在类里面添加了下面这样的消息分配机制也就是根据控件的ID来一个个比较,然后调用相应控件的处理函数,这个函数就是我们在宏申明的时候指定的。
*/
/*这个消息分配方法清除了,那驱动在哪呢?对,从源头开始找吧。下面的函数一般在Winmain里面调用,是主要的函数,其他都是些初始化什么的*/
/*这···无限循环取得消息,这已经到操作系统API层了,那么具体的DispatchMessage是发给哪个函数去分发了呢??对,某大作说过,Create,RegisterWindow,那一定有一个消息驱动函数,我们得告诉操作系统的,而且是个回调函数,by the way ,为什么要做成回调函数?直接在dispathMessage 里我们调不就行了吗?···恩,侯捷说过,操作系统想有点控制权。
下面继续*/
/*先说下哦,因为我没看过ATL,WTL,所以不知道哪些部分是属于库的,暂且就这样走到根吧···
经过消息跟踪,发现每次DispatchMessage的时候,下一个被调用的用户自定义函数是:
c:/Program Files/Microsoft Visual Studio 9.0/VC/atlmfc/include/atlwin.h中的3072行:
LRESULT CALLBACK CWindowImplBaseT< TBase, TWinTraits >::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)*/
/*实际上StartWindowProc调用的是WindowProc
c:/Program Files/Microsoft Visual Studio 9.0/VC/atlmfc/include/atlwin.h中的3072行:
LRESULT CALLBACK CWindowImplBaseT< TBase, TWinTraits >::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
WindowProc,对,这个函数名我们非常熟悉了!!
对,由此可知,StartWindowProc一定是我们要找的回调函数,CALLBACK不就告诉我们了嘛,呵呵,其申明也确实是静态的:
static LRESULT CALLBACK StartWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
下面贴一下代码看看:
*/
/*读者看到这也基本明白了这消息映射的路由。不过总感觉有点别扭,为什么消息处理函数是StartWindowProc??? 谁告诉windows的?操作系统怎么知道的??那咱们继续吧:没记错的话我们之前说DoModal的时候有如下一句
HWND hWnd = Create(hWndParent, rect);
//····这里省略··字 被我故意省略了很多字···
下面补上吧,看代码
*/
见下文http://blog.youkuaiyun.com/hw_henry2008/archive/2011/05/22/6438183.aspx