1. 命令行下vc:
自古以来,一直到现在,C/C++ 编译器都需要这三个环境变数: PATH,INCLUDE,LIB
对于vc
set PATH=
%path;E:/Program Files/Microsoft Visual Studio/Common/MSDev98/BIN;
E:/Program Files/Microsoft Visual Studio/VC98/Bin
set INCLUDE=
E:/Program Files/Microsoft Visual Studio/VC98/INCLUDE
set LIB=
E:/Program Files/Microsoft Visual Studio/VC98/LIB
// 可用 set 查看设置是否正确
2. VC 中在一个文件中,使用一个未经定义或声明的类型, 则会出现如下错误:
fatal error C1004: unexpected end of file found
// 这通常,是没有包含相应的 _xx.h 文件,编译器无法为其分配内存
3. VC 下全局对象的析构问题
在VC下,对析构函数用cout 输出时以查看全局对象是否被析构时,会误以为析构函数没有被调用(看不到析构函数中的输出),但可用 printf() 查看其输出.
~T(){
cout << " destructor is called ,showed by cout. " << endl; // 无输出.
printf( " destructor is called ,showed by printf. "); //有输出.
}
4. 关于预编译.
首先,一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。
原因是理所当然的,我们仅仅是要它能够编译而已,也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。
5.对技术的讨论.
技术的本质并不是指技术的最底层,而是指技术的来龙去脉:(1) 为什麽发展出这项技术,(2) 它为了解决什麽问题,(3) 从问题的发生而後解决方案的诞生而後如何演化成现今的模式 [ 引自 深入浅出MFC ]。
6. 拷贝构造函数调用的三个地方:
(1)类型转换: (A)b (2)传值调用. (3)返回值.
//注意:截切问题; 拷贝后,临时对象vtable 不变; 直接赋值,被赋值者vtable 不变.
7. Windows应用程序
本质:基于消息,事件驱动
windows程序 = 程序代码 + UI资源(.ico,.bmp,.cur ... .rs)
消息来源:系统队列(硬件), 程序队列 // 对应用程序透明
注册窗口,产生窗口( 在windows 3.x时代,窗口类只需注册一次,所有进程同在一个地址空间中.)
可由WinMain的参数 hPrevInstance的值判断是否是第一个...
故: InitAplication, InitInstance ---->在MFC中,它成为CWinApp的虚成员函数.
TranslateMessage(& msg);
TranslateMessage会将消息传给窗口函数处理.没有指函数却可传过去...因为消息有一属性对应窗口,而窗口对应的窗口类又对应有窗口函数.
对话框的运行:激活与结束 DialogBox 与 EndDialog
8. Windows 消息循环:
1.初始化中调用CreateWindow, 之后会发送消息WM_CREATE ..
2.GetMessage从消息队列中抓取消息. 若为 WM_QUIT, 则返回0
3.DispatchMessage 通过 User 模块把消息发送到窗口函数.
4.2.3不断进行
5.当有WM_CLOSE时(按下X号),通常 DefWindowPro 调用DestroyWindow把窗口清除,并且发送WM_DESTROY
6.程序对WM_DESTROY 的标准反应是调用PostQuitMessage,并且此函数只发送WM_QUIT
可以通过拦截WM_DESTROY(点X,发送WM_CLOSE),则 窗口已被清除(调用了DestroyWindow),但是程序依然在内存.
9. MFC Console
1.程序进入点仍为main
2.需载入所使用类的头文件 afx.h
3.可使用与gui无关的MFC类
4.编译链接时指明 /mt, 表使用多线程
10. 一个进程的诞生与死亡
1.shell 调用 CreateProcess 激活 AppName.exe
2.系统产生一个"进程核心对象", 计数值为 1.
3.系统为此进程建立一个 4GB 地址空间.
4.加载器将必要的代码加载到上述地址空间中,包括 AppName.exe 程序, 数据, 以及必要的动态链接库.
5.系统建立主线程.
6.系统调用 C runtime 函数库的 Startup code.
7.Startup code 调用 AppName 的 WinMain.
8.WinMain 开始运行.
9.使用者关闭 App 主窗口, 消息循环结束.
10. 回到 Startup code.
11. 回到系统, 系统调用 ExitProcess, 结束.
11. 在创建一个程序时, 其文件名的搜索次序为:
1. 调用者的可执行文件所在目录.
2. 调用者的当前工作目录.
3. Windows 目录.
4. Windows System 目录.
5. Path 所设的目录.
12.
CreateProcess:
参数为:
1可执行文件名
2命令行参数
3、4安全属性,5这些属性是否要继承
6常数的组合
7环境变量
8设定工作目录
9指定startupinfo-->设定窗口标题,位置
10指向PROCESS_INFORMATION :
CreateThread
1.配置"线程对象"
2.设定计数值为1
3.设定 context
4.保留线程的堆栈
5.设定 ss,ip
13. 四种对象:
栈,堆.
全局static(函数外)-->依靠 startup代码帮忙.
局部static(函数内)-->在固定内存上.
当编译器Compile时,发现一个 static 对象,则会把这个对象加到一个链表中.在进入 main之前,startup 会首先执行这个链表上东西.
本文介绍了MFC的基础知识,包括VC命令行环境变量配置,未声明类型导致的编译错误,全局对象析构,预编译头文件的使用,拷贝构造函数的调用场景,Windows应用程序的本质,消息循环机制,MFC控制台应用的特点,进程的生命周期,以及CreateProcess和CreateThread函数的参数解析。同时,文章强调了理解技术本质的重要性。

4972

被折叠的 条评论
为什么被折叠?



