1. Windows程序分为“程序代码”和“UI资源”,下图所示:

2. Windows支持动态链接(应用程序所调用的Windows API函数是在“执行时期”才链接上的)。Windows程序调用的函数可分为如下两部分:

  (1)C Runtimes:LIBC.LIB(C Runtime 函数库的静态链接版本)、MSVCRT.LIB(C Runtime函数库动态链接版本(MSVCRT40.DLL)的Import 函数库。如果链接这一函数库,你的程序执行时必须有MSVCRT40.DLL在场。

  (2)Windows API:由操作系统本身(主要是Windows三大模块GDI32.DLL、USER32.DLL、KERNEL32.DLL)提供。虽说动态链接是在执行时期才发生”链接“事实,但在链接时期,链接器仍需先为调用者准备一些适当的信息,才能够在执行时期顺利”跳“到DLL中执行。如果该API所属的函数库尚未加载,系统也才因此知道要先行加载该函数库。这些适当的信息放在所谓的”import 函数库”中。32为的Windows 的三大模块所对应的import函数库分别为GDI32.DLL、USER32.DLL、KERNEL32.DLL。

3. 所有 Windows程序都必须载入 WINDOWS.H(三大模块所提供的API函数)。

4. Windows程序的进行系依靠外部发生的事件来驱动(消息循环,通过消息映射表(Message Map)实现),也即,以消息为基础的事件驱动系统。接受并处理消息的主角就是窗口。每一个窗口都有一个所谓的“窗口函数”负责处理消息(由于窗口函数是被Windows系统所调用,也就所谓的“Callback函数”,意思是指“在你的程序中,被Windows系统调用”的函数。故而一般是全局函数或static成员函数)。

5. 窗口的生命周期:

6. 消息队列和空闲时间:当“系统中没有任何消息等待处理”,也即空闲时间。程序采用GetMessage(如果没有消息,则过门不入,操作系统执行其他的线程),PeekMessage(如果没有消息,仍取回控制权,是程序得以执行一段时间)。

7. 说到Windows程序,一定得有WinMain、消息循环、窗口函数。与之对应的则是console程序("DOS-like"程序,而且仍然可以调用部分的、不牵扯到图形使用者(GUI)的Win32 API)。DOS程序则为过去在DOS环境下开发的程序。DOS程序时所谓的MZ格式(MZ ,Mark Zbikowski,它是DOS系统的一位主要建构者)。console程序的格式和所有的Win32程序一样,是所谓的PE(Portable Executable)格式,意思是它可以被拿到任何Win32平台上执行。

8. Visual C++ 共有六个C Runtimes函数库:

  (/ML)Single-Threaded(static) - libc.lib

  (/MT)Multithreaded(static) - libcmt.lib

  (/MD)Multithreaded DLL - msvcrt.lib

  (/MLd)Debug Single-Threaded(static) - libcd.lib

  (/MTd)Debug Multithreaded(static) - libcmtd.lib

  (/MDd)Debug Multithreaded DLL - msvcrtd.lib

9. 可以说核心对象是系统的一种资源。系统给予核心对象一个计数值作为管理只用。核心对象包括下列数种:

注:process对象——程序代码的执行时线程的工作(执行事实发生在线程身上),“process对象”只是一个数据结构,系统用它来管理进程。

10. 进程的诞生与死亡:

注:只要把子进程以CloseHandle(WINDOWS.H)关闭,就达到“割断脐带”的目的。

11. Windows程序除了调用Win32 API 外,通常也很难避免调用任何一个C Runtime函数。为了保证多线程情况下的安全,C Runtime函数库必须为每一个线程做一些登记工作。没有这些记录,C Runtime 函数库就不知道要为每一个线程配置一块新的内存,作为线程的区域变量用。因此,CreateThread有一个名为_beginthreadex的外包函数,负责额外的登记工作(其不是个标准的ANSI C Runtime函数)。(详见 《Win32多绪程序设计》)

--------------------------------------------------------------------------------------------------------------

C++基础:

12. MFC有两个十分重要的虚函数:与document有关的Serialize函数和与View有关的OnDraw函数。

13. 考虑下面代码:

class Base
{
public:
void func()
{
serialize();
}
virtual void serialize(){cout << "Base serialize ~" << endl;}
};
class Derived : public Base
{
public:
virtual void serialize() {cout << "Derived serialize ~" << endl;}
}; void main()
{
Derived od;
Derived *pod = new Derived; od.func(); // test1: Derived serialize ~
((Base*)(&od))->func(); //test2: Derived serialize ~
pod->func(); //test3: Derived serialize ~ ((Base)(od)).func(); //test4: Base serialize ~ }

注:test1-3,通过子类对象,或者父类指针(强制类型转换),或者子类指针,由于子类重写了父类的虚函数,故而均调用子类的serialize。test4中,由于((Base)(od)).func()是传值而非传址操作,编译器以所谓的拷贝构造函数,把Base对象内容复制了一份,使得od的vtable内容与Base对象的vtable相同。
14. 不要把static成员变量的初始化操作安排在类的构造函数中,应为构造函数可能一再被调用,而变量的初值却只应该设定一次。设定static成员变量初值时,不受任何存取权限的束缚(public、protected、private)。但存取static变量则需要将其设为public。可以通过类名,也可以通过对象来存取static成员变量。

15. C++ 的new运算子和C的malloc函数都是用于配置内存,但前者比之后者的优点是,new 不但配置对象所需的内存空间,同时会引发构造函数的执行。

16. 四种不同的对象生存方式(in stack、in heap、global、local static):

17. RTTI(Runtime Type Information,运行时类型识别),MFC的RTTI能力牵扯到一组非常神秘的宏(DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC)和一个非常神秘的类(CRuntimeClass)。

18. MFC支持动态创建,靠的是一组宏(DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE)和一组类(CRuntimeClass)。

19. Templates的编译与链接:

深入浅出MFC——Win32程序基本概念(一)的更多相关文章

  1. 《深入浅出MFC》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <深入浅出MFC>内含光盘一片,书中所有原始码与可执行文件尽在其中. 作者简介 侯俊杰,先生不知何许人也,闲静少言,不慕荣利.好读书,求甚解:每有 ...

  2. 第二章--Win32程序运行原理 (部分概念及代码讲解)

    学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不 ...

  3. win32程序中简单应用mfc

    今日写程序在win32中用CRect发现报错,突然想起来.要引入mfc库.想重新建立一个工程添加对mfc的支持.发现选项不能选.查资料后发现. 在win32程序中简单应用mfc库,只需要简单的引入&l ...

  4. 实现 Win32 程序的消息映射宏(类似 MFC )

    对于消息映射宏,不用多说了,用过 MFC 的人都很清楚.但目前有不少程序由于各种原因并没有使用 MFC,所以本帖讨论一下如何在 Win32 程序中实现类似MFC的消息映射宏.其实 Windows 的头 ...

  5. 深入浅出MFC——MFC骨干程序(四)

    1. 熟记MFC类层次结构: 2. AppWizard可以为我们制作出MFC程序骨干: 3. Document/View支撑你的应用程序:Document/View的价值在于,这些MFC类已经把一个应 ...

  6. [转]《深入浅出MFC》– MFC程序的生死因果

    1.首先MFC程序需要哪些函数库? Windows C Runtime函数库 LIBC.LIB       C Runtime函数库的静态链接版本 MSVCRT.LIB     C Runtime函数 ...

  7. MFC Windows程序开发究竟是什么?

    MFC Windows程序开发究竟是什么? MFC是一个Application Framework.他是一个完整的程序模型. 什么是MFC?MFC是微软公司出品一个Application Framew ...

  8. 深入浅出JMS(一)--JMS基本概念

     from:http://blog.csdn.net/jiuqiyuliang/article/details/46701559 深入浅出JMS(一)--JMS基本概念 标签: jmsmessagin ...

  9. MFC应用程序框架入门(转)

    1 MFC概述 顾名思意,MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32 SDK编程方式的.自20世纪90年代初问世以来,M ...

随机推荐

  1. C#中的委托应该定义在哪里

    专业回答 千锋教育 中国移动互联网研发培训领导品牌 2016-01-08 14:28 需求情况而定,一般定义在与类定义平级部分,且用public修饰,便于外部的调用. 若定义于类的内部,则必须通过调用 ...

  2. 基于HTML5 Canvas粒子效果文字动画特效

    之前我们分享过很多超酷的文字特效,其中也有利用HTML5和CSS3的.今天我们要来分享一款基于HTML5 Canvas的文字特效,输入框中输入想要展示的文字,回车后即可在canvas上绘制出粒子效果的 ...

  3. Wpf border 容易弄混的两个属性

    代码如下: <Border Margin=" > <Button Content="dafkafjk"></Button> </ ...

  4. 【翻译自mos中文文章】重建控制文件的方法

    重建控制文件的方法 參考原文: How to Recreate a Controlfile (Doc ID 735106.1) 适用于: Oracle Database - Enterprise Ed ...

  5. 【C#/WPF】如何查看System.Windows.Interactivity.dll中EventTrigger的EventNames属性有哪些

    WPF项目中,从Nuget搜索并下载System.Windows.Interactivity.dll,安装到项目中,并在XAML界面引入. <UserControl xmlns:i=" ...

  6. 【Unity/Kinect】Kinect实现UI控件的点击

    用体感来实现UI控件的点击,如点击按钮. 做法:用一个图片表示左手手掌,图片位置追踪左手手掌移动,当手掌位于UI控件的矩形内时,握拳表示点击该控件. using UnityEngine; using ...

  7. 【C#】事件(Event)和代理/委托(Delegate)

    代理(Delegate)的例子 delegate void MyDelegate(string str,int index); // 声明代理 class Test { public static v ...

  8. 【C】——指针与const限定符

    const限定符和指针结合起来常见的情况有以下几种. const int *a; int const *a; 这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所 ...

  9. lvm 新建一个vg 逻辑卷 配置启动

    fdisk /dev/sdb 格式 t  8e w vgcreate datavg /dev/sdb1lvcreate -L 999G -n lvdata datavgmkfs.xfs /dev/da ...

  10. 七、CentOS 6.5 下 Nginx的反向代理和负载均衡的实现

    CentOS 6.5 下 Nginx的反向代理和负载均衡的实现 * 修复上面文章的问题: 复制出一个tomcat2之后,修改service.xml文件时,要修改三个端口: 1. <!-- 800 ...