深入浅出MFC——Win32程序基本概念(一)
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程序基本概念(一)的更多相关文章
- 《深入浅出MFC》下载
百度云及其他网盘下载地址:点我 编辑推荐 <深入浅出MFC>内含光盘一片,书中所有原始码与可执行文件尽在其中. 作者简介 侯俊杰,先生不知何许人也,闲静少言,不慕荣利.好读书,求甚解:每有 ...
- 第二章--Win32程序运行原理 (部分概念及代码讲解)
学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不 ...
- win32程序中简单应用mfc
今日写程序在win32中用CRect发现报错,突然想起来.要引入mfc库.想重新建立一个工程添加对mfc的支持.发现选项不能选.查资料后发现. 在win32程序中简单应用mfc库,只需要简单的引入&l ...
- 实现 Win32 程序的消息映射宏(类似 MFC )
对于消息映射宏,不用多说了,用过 MFC 的人都很清楚.但目前有不少程序由于各种原因并没有使用 MFC,所以本帖讨论一下如何在 Win32 程序中实现类似MFC的消息映射宏.其实 Windows 的头 ...
- 深入浅出MFC——MFC骨干程序(四)
1. 熟记MFC类层次结构: 2. AppWizard可以为我们制作出MFC程序骨干: 3. Document/View支撑你的应用程序:Document/View的价值在于,这些MFC类已经把一个应 ...
- [转]《深入浅出MFC》– MFC程序的生死因果
1.首先MFC程序需要哪些函数库? Windows C Runtime函数库 LIBC.LIB C Runtime函数库的静态链接版本 MSVCRT.LIB C Runtime函数 ...
- MFC Windows程序开发究竟是什么?
MFC Windows程序开发究竟是什么? MFC是一个Application Framework.他是一个完整的程序模型. 什么是MFC?MFC是微软公司出品一个Application Framew ...
- 深入浅出JMS(一)--JMS基本概念
from:http://blog.csdn.net/jiuqiyuliang/article/details/46701559 深入浅出JMS(一)--JMS基本概念 标签: jmsmessagin ...
- MFC应用程序框架入门(转)
1 MFC概述 顾名思意,MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32 SDK编程方式的.自20世纪90年代初问世以来,M ...
随机推荐
- PHP 友好的dump
/** * 浏览器友好的变量输出 * @param mixed $var 变量 * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串 * @par ...
- js中的url地址用function函数调用
url中输入调用函数,函数中调用ajax请求
- Java中HashMap实现原理
类声明: 概述: 线程不安全: <Key, Value>两者都可以为null: 不保证映射的顺序,特别是它不保证该顺序恒久不变: HashMap使用Iterator: HashMap中ha ...
- 【C#/WPF】图像变换的Undo撤销——用Stack命令栈
需求: 图层中有一张图片,可以对该图层进行平移.缩放.旋转操作,现在要求做Undo撤销功能,使得图层回复上一步操作时的状态. 关于图像的平移.缩放.旋转,可以参考在下的另一篇博客的整理: http:/ ...
- oozie中调度mapreduce
mapreduce可以直接对hdfs进行清洗和计算,这里介绍oozie中如何调度使用. 操作步骤如下: 1. 写一个mapper和reduce类,并且打包成jar包 2. 在workflow中引用ma ...
- centsos7修改主机名 [root@st152 ~]# cat /etc/hostname
CentOS7修改服务器主机名方法CentOS7下修改主机名第一种:hostname 主机名01.hostname 主机名称 <pre name="code" class=& ...
- linux大小写转换
[root@ob2 mytmp]# cat aa2.txt|sed 's#[a-z]#\u&#g'ETH0 LINK ENCAP:ETHERNET HWADDR 00:0C:29: ...
- ARDUINO PWM
转至:http://www.sl088.com/voyage/2012/10/11506.slboat#.E5.8F.91.E7.8E.B0 http://www.engblaze.com/micro ...
- Linux 精确获取指定目录对应的块的剩余空间
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/statfs ...
- C++隐式转换与显式转换
普通类型的转换顺序:隐式把char——>int和从short——>double.转换可能会导致数据的丢失. 自定义类型:有两种函数可以进行隐式转换,单参数构造函数 和 隐式类型转换符. ...