深入浅出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 ...
随机推荐
- 百度编辑器UEditor不能插入音频视频的解决方法
引用:https://my.oschina.net/u/379795/blog/787985 xssFilter导致插入视频异常,编辑器在切换源码的过程中过滤掉img的_url属性(用来存储视频url ...
- 【Visual Studio】VS常用调试技巧——笔记
CSDN的文档: https://msdn.microsoft.com/en-us/library/aa295838(v=vs.60).aspx 情景一:[监视]变量时,当运行离开当前函数后,怎么看到 ...
- CKFinder 自定义文件路径扩展ConfigurationPathBuilder
CKFinder 自定义文件路径扩展ConfigurationPathBuilder 打开config.xml当中可以看到如下配置 <basePathBuilderImpl>com.ckf ...
- 【SpringMVC笔记】第五课 改进Handler处理器和视图解析器
第四课 已经对注解的映射器和适配器进行了改进. 接下来需要对Handler处理器和视图解析器进行改进. <!-- 配置handler处理器 --> <bean class=" ...
- CMake 使用方法
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的 ...
- ansible register when: result | succeeded when: item.rc != 0
ansible register 这个功能非常有用.当我们需要判断对执行了某个操作或者某个命令后,如何做相应的响应处理(执行其他 ansible 语句),则一般会用到register . 举个例子: ...
- MongoDB · 引擎特性 · MongoDB索引原理
MongoDB · 引擎特性 · MongoDB索引原理数据库内核月报原文链接 http://mysql.taobao.org/monthly/2018/09/06/ 为什么需要索引?当你抱怨Mong ...
- spring boot 自学笔记(四) Redis集成—Jedis
上一篇笔记Reddis集成,操作Redis使用的是RedisTemplate,但实际中还是有一大部分人习惯使用JedisPool和Jedis来操作Redis, 下面使用Jedis集成示例. 修改Red ...
- 修改jvm内存大小
- 231个javascript特效分享
1.文本框焦点问题onBlur:当失去输入焦点后产生该事件onFocus:当输入获得焦点后,产生该文件Onchange:当文字值改变时,产生该事件Onselect:当文字加亮后,产生该文件 <i ...