MFC 基础(VC环境,Windows基本概念)

本文介绍了MFC的基础知识,包括VC命令行环境变量配置,未声明类型导致的编译错误,全局对象析构,预编译头文件的使用,拷贝构造函数的调用场景,Windows应用程序的本质,消息循环机制,MFC控制台应用的特点,进程的生命周期,以及CreateProcess和CreateThread函数的参数解析。同时,文章强调了理解技术本质的重要性。

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 会首先执行这个链表上东西.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值