深入浅出MFC笔记
一、 勿在浮砂筑高台
1、 并不是扩展名为.DLL(Dynamic link library)的才是动态链接库。事实上,.exe、
.DLL、.fon、.mod、.drv和.ocx都是所谓的动态链接函数库。
2、 Windows程序编译时需要包含Windows.h头文件,若需要使用诸如COMMDLG.DLL等动态库,需要包含Commdlg.h等头文件。链接时需要GDI32.lib、USER32.lib和KERNEL32.lib,可能还需要COMDLG32.lib等“import函数库”。程序运行时需要对应的GDI32.DLL、USER32.DLL、KERNEL32.DLL和COMMDLG.DLL等动态链接库。
3、 Makefile文件是利用makefile的语法写成的以.mak为后缀的文件。可以设定某个文件和某个文件对比,由其比较结果来决定要不要做某些你所指定的操作。而后利用NMAKE.EXE或MAKE.EXE处理之。RS、CL、LINK等编译链接命令可以写在其中。
4、 API函数GetMessage和PeekMessage,如下两个消息循环:
1) MSG msg;
While(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
2) While(TRUE)
{
If(PeekMessage(&msg,NULL,0,0,PM_REMOVE)
{
If(msg.message == WM_QUIT)
Break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Else
OnIdle();
}
使用GetMessage(),当操作系统执行该线程时,如果消息队列为空,则会过门不入。若使用PeekMessage(),线程会取回控制权,使程序可以运行一段时间。于是可以进入OnIdle()函数中。
5、 Console程序是在Windows环境下编写的,不牵扯任何窗口、对话框、控件的程序。不能与Dos程序混为一谈。主要有如下方面:
1) 编写方式:Console程序在Windows环境下编写,可以使用C Runtime函数和“不牵扯GUI”的Win32 API函数库;Dos程序在Dos环境下编写,只能调用C Runtime函数库。
2) 程序功能:由于Console程序可以调用部分的Windows API函数,所以可以使用Windows提供的各种高级功能。比如可以产生进程,产生工作者线程,取得虚拟内存信息和刺探操作系统的各种数据。
3) 可运行文件格式:Dos程序师所谓的MZ格式,Console程序和所有的Win32程序一样,是所谓的PE格式,可以再任何win32平台上运行。
6、 一个进程的诞生与死亡
1) Shell(资源管理器或文件管理器)调用CreateProcess激活App.exe。
2) 系统产生一个“进程内核对象”,计数值为1.
3) 系统为此进程建立一个4GB地址空间。
4) 加载器将必要的代码加载到上述地址空间中,包括APP.exe的程序、数据、以及所需的动态链接库。加载器如何知道要加载哪些DLLs呢?他们被记录在可执行文件(PE文件格式)的.idate section中。
5) 系统为此进程建立一个线程,称为主线程。线程才是CPU时间的分配对象。
6) 系统调用C Runtime函数库的Startup code。
7) Startup code调用APP程序的WinMain函数。
8) APP程序开始运行。
9) 使用者关闭APP主窗口,使WinMain中的消息循环结束,于是WinMain结束。
10) 回到Startup code。
11) 回到系统,系统调用ExitProcess结束线程。
7、 创建一个线程,最好以C Runtime函数_beginthreadex、_endthreadex代替Windos API函数CreateThread和ExitThread。C Runtime函数会为每个线程做一些额外的登记工作,可以保证多线程情况下的安全。MFC中库函数AfxBeginThread和AfxEndThread也可用于创建和结束线程。
二、 C++重要性质
1、 四种不同的对象生存方式:in stack,in heap,global,local static。
分别为在栈中、堆中、全局静态对象(初始化过程在WinMain函数调用之前,由Startup帮忙)、局部静态对象(只有一个实例产生,不在堆中,也不在栈中)。
2、 RTTI(Runtime type Information),运行时类型识别,通过Dynamic_cast和typeid操作符实现。
三、 MFC六大关键技术之仿真
包括MFC程序的初始化,RTTI(Runtime Type Information),Dynamic Create,Presistence(永久保存),Message Mapping(消息映射),Command Routing(命令传递)。