深入浅出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 ...
随机推荐
- [转][SQL] SSIS 简单应用 数据库汇入导出设定& SQL Agent定期排程
前言 本篇不是要說高深的SSIS 技巧,而是用實例的方式,說明如何應用 Visual Studio 的「Business Intelligence Projects」來建立「Integration S ...
- 编程精粹--编写高质量C语言代码(1):假想编译程序
编译程序只能查找出程序的语法错误,而对于"数组越界訪问","对空指针解引用"等错误.编译程序是束手无策的.同一时候我们知道測试人员所使用的黑箱測试方法所能做的不 ...
- 【C#/WPF】ListView的MVVM例子,及禁止拖动ListView的头部Header
一个ListView的MVVM简单例子: <ListView ItemsSource="{Binding GoodsList}" Margin="0,10,0,10 ...
- 非分离线程未使用join函数例子:
//非分离线程未使用join函数例子: #include<stdlib.h> #include<pthread.h> #include<stdio.h> #incl ...
- SpringMVC 拦截器实现
SpringMvc实现拦截器方式一: <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**&q ...
- Golang 类型转换整理
1.整形到字符串: var i int = 1 var s string s = strconv.Itoa(i) 或者 s = FormatInt(int64(i), 10) 2.字符串到整形 var ...
- DataGridView:根据条件改变单元格的颜色
根据条件改变DataGridView行的颜色可以使用RowPrePaint事件. 示例程序界面如下: 示例程序代码如下: using System; using System.Collections. ...
- js学习笔记11----表单操作
1.复选框选中 var aInput = document.getElementsByTagname('input'); aInput[0].checked=true;
- Asynchronous Methods for Deep Reinforcement Learning(A3C)
Mnih, Volodymyr, et al. "Asynchronous methods for deep reinforcement learning." Internatio ...
- Python 之 向上取整、向下取整以及四舍五入函数
import math f = 11.2 print math.ceil(f) #向上取整 print math.floor(f) #向下取整 print round(f) #四舍五入 #这三个函数的 ...