一个CWinApp的特殊使用方式

来源:互联网 发布:cnc数控编程模拟软件 编辑:程序博客网 时间:2024/05/07 19:36

今天看了一段老外写的代码,发现老外把一个CFrameWnd派生类的指针直接强转成CWinApp的派生类,然后调用CWinApp派生类的接口去使用,感觉很奇怪,这两个类可以强转吗?第一个想法就是CWinApp的派生类重载了强制转换操作,查了一遍,甚至直接追溯到CCmdObject都没找到重载的强制转换操作。然后想是不是MFC内部将所有强转为CWinApp的地方全部替换成了类似AfxGetApp()的方式去调用,尝试在强转处修改CWinApp中的成员变量,发现修改无效,也就是说只是调用了方法,并没有真正得到全局的WinApp指针。

随后写了一些代码尝试,发现随意定义一个类(从不从MFC派生都没关系)都可以直接强转成CWinApp去调用接口。最后直接去看反汇编,以CWinApp的OnAppAbout()函数为例,发现所有强转调用该接口的地方,反汇编都编译成了CWinApp::OnAppAbout,也就是说直接用的这个函数的地址。


基本可以确认的就是,这种用法在本质上只是编译器做的处理,直接将对CWinApp接口的调用转换为函数地址的调用方式,我估计对于CWinApp来说,他所有的成员函数地址在整个应用程序内部都是公开的(类似于静态函数的方式)。至于无法修改成员变量的问题,是由于CWinApp的成员变量并不是静态的,因此即使调用了接口,但是对内部变量进行了修改是无效的修改。

留下此文做个记号~~~

原创粉丝点击