0
点赞
收藏
分享

微信扫一扫

为什么莫名其妙的就被调用了


情不知所起,一往而深。生者可以死,死可以生。生而不可与死,死而不可复生者,皆非情之至也。



        武侠剧上看到许多武侠人士经过多年修炼最终达到人剑合一的境界,而现在我复用一下:我也走在“人剑合一”路上。最后达到情不知所起一往而深的深度,呵呵,想多了


        昨天晚上又开始翻回旧黄历看了看别人怎么剖析MFC封装windowsAPI编程的文章。随后调试发现 又是阵痛。恍惚半年、一年我经历了不下4次这样的阵痛,也许我就是那种好几次都走了同样带坑的路的人(呵呵 我都不知道我是自夸还是自嘲),是什么坑呢?先看看图(自制的 感觉着看吧)

为什么莫名其妙的就被调用了_封装


// 我得说明一下MyBaseWndProc是CBaseWnd类的一个回调成员函数
LRESULT CALLBACK CBaseWnd::MyBaseWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if(hWnd!=NULL)
{
CBaseWnd* pWnd=CBaseWnd::FromHandle(hWnd);
if(pWnd!=NULL)
return pWnd->WindowProc(message, wParam, lParam);
}
return 0;
}


我想说什么呢?

        首先是这样的,windows开发中WinMain函数中会有一个数据结构WNDCLASSEX,而WNDCLASSEX的对象的一个成员lpfnWndProc必须得到一个回调函数,这个回调函数是什么样子的呢,let me have a look


LRESULT CALLBACK xxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return ::DefWindowProc(hWnd, message, wParam, lParam);
}


也就是说正常的情况下,windows接收到键盘、系统的消息就应该是传到xxWndProc中的,但是如果CBaseWnd中使用了SetWindowLong来修改调用回调函数的方向,那应用程序的回调函数就是MyBaseWndProc了,此时xxWndProc属于old窗口回调函数。

那么问题来了?

        不管是窗口回调函数(加个窗口修饰只是更明确此回调函数的意义,本质上还是回调函数)是xxWndProc还是MyBaseWndProc,从“源代码”中是根本找不到是哪个进程、哪个模块、哪个过程调用过他们。

        首先,得明确一下源代码指的是MFC提供的部分代码,windows本身也是一款软件,那么他的核心模块就是win32kernel模块,在此基础上为了提供消息驱动机制,在win32kernel模块的外围有封装了一层,这一层由user32.exe、gdi32.exe、ntdll.exe封装起来应该就是传说中的Ring2层,如果能看到这层代码的话,就应该能看到是哪个函数调用了当前应用程序的这个回调函数。我目测Ring2层为了封装windows的这个消息机制一定是花了好长时间来研究、设计函数调用走向,其目的就只有一个为Ring3级别提供接口,使开发人员不用自己设计消息驱动机制,同时二一个目的也是统一windows平台下的消息驱动接口。

        反观MFC中的部分代码设计,我猜想Ring2层也会有许多的设计思路甚至是代码风格都与MFC的相同。唯一不同的就是实实际际的实现(而不是逻辑)是猜不到的。

        其实对于开发大项目是,都会遇到这个尴尬的问题,整个项目设计成3层架构,最底层肯定是用windowsAPI接口开发,开发完成之后一系列的接口函数和环境给第2级架构和接口使用,到了第2级架构上使用第一级架构提供的接口在加上自己的逻辑,最后在完成之后提供一系列的接口函数和环境给第3级架构使用。

为什么莫名其妙的就被调用了_封装_02

        对于一个开发人员来讲,如何使用API绝对是一个最关键的中心点,不管你是使用windows提供的底层API、还是使用上面说到的项目的1级接口、2级接口,最起码你得知道某某API是干嘛用的,使用时有什么注意事项吧.虽然开发没多久、但也是知道要完成一个模块或者一个层级架构的设计得需要多少个API。

        所以最尴尬的问题是,当你将windowsAPI运用娴熟的情况下,如果此时你在上面项目的第3级架构上开发,即便你windowsAPI很是娴熟,但你仍是感到很吃力,为什么呢?又是一大堆2级架构提供的api,你能不用么,你用是不是得先熟悉啊?


        呵呵,扯到哪去了,总结一下。


        就是说windows设计就好比这三层架构,MFC就属于第3层,因为他是以第2层架构为基础的,所以在阅读第3级架构中的程序又是感到困惑这并不奇怪。关键是你现在怎么想象这个问题,怎么理解这个问题了。

既然某些地方理解不了,但是开发事确实是提供了很多便利,且在实际开发绝对不会因此导致自己设计的程序出现问题,。。。。。在好好想想。。。。这难道不是。。。。设计框架的初衷么。。。。。

        也许,其实就在写完上两段的时候我还不理解为什么要这么设计,但此时此刻我却恍然大悟。。。。如果要我设计一个3层架构,我又能怎么想呢?

举报

相关推荐

0 条评论