第四章 进程

进程

1.什么是进程?

进程被定义为一个正在运行的程序的实例,它由两个部分组成:

1)操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。

2)地址空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。


Q:什么是DDL模块?

A:DLL 是一个包含可由多个程序同时使用的代码和数据的库。例如,在Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。

通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。


2.进程与线程的关系

1)单个进程至少包含一个线程,即系统自动为该进程创建的第一个线程,称为主线程,该线程负责执行包含在进程的地址空间中的代码。

2)每个线程都有它自己的一组CPU寄存器和它自己的堆栈,这些线程都“同时”执行进程地址空间中的代码。(操作系统通过循环方式为线程提供时间片,从而造成一种所有线程都是同时运行的假象)。

3)进程可以创建其他进程,线程也可以创建其他线程。

编写第一个Windows应用程序

1.Windows支持的应用程序类型

1)基于图形用户界面(GUI)的应用程序

有个图形前端程序,能创建窗口,拥有菜单,可以通过对话框与用户打交道,并可使用所有的标准“Windows”组件。Windows配备的所有应用程序附件几乎都是基于GUI的应该程序。

链接程序开关是/SUBSYSTEM:WINDOWS

2)基于控制台用户界面(CUI)的应用程序

CUI应用程序属于文本操作的应用程序,通常不能用于创建窗口或处理消息,并且它们不需要图形用户界面。命令外壳程序CMD.EXE(用于Windows 2000)和COMMAND.COM(用于Windows 98)都是典型的基于CUI的应用程序。

链接开关是/SUBSYSTEM:CONSOLE

(当用户运行一个应用程序时,操作系统的加载程序就会查看可执行图形程序的标题,并抓取该子系统的值。如果该值指明一个CUI应用程序,那么加载程序就会自动保证为该应用程序创建文本控制台窗口)

3)两种类型的应用程序界限模糊

可以创建用于显示对话框的CUI应用程序:命令外壳程序可能拥有一个特殊的命令,使它能够显示一个图形对话框,在这个对话框中,可以选定你要执行的命令,而不必记住该外壳程序支持的各个不同的命令。

也可以建立控制台窗口的GUI应用程序,在这个窗口中,我可以查看应用程序执行时的调试信息。

2.Windows应用程序使用的进入点函数

Windows应用程序必须拥有一个在应用程序启动运行时调用的进入点函数。但实际上操作系统调用的不是进入点函数,而是C/C++运行期启动函数(负责对C/C++运行期库进行初始化)。

·需要ANSI字符和字符串的GUI应用程序

·需要UNICODE字符和字符串的GUI应用程序

·需要ANSI字符和字符串的CUI应用程序

·需要UNICODE字符和字符串的CUI应用程序

3.链接程序与进入点函数

链接程序负责在它连接可执行文件时选择相应的C/C++运行期启动函数。


Q:什么是C/C++运行期启动函数?

A:可以在crtexe.c文件中找到4个启动函数【即WinMainCRTStartup、wWinMainCRTStartup、mainCRTStartup和wmainCRTStartup】的源代码。这些函数的用途简单总结如下:a)获取指向新进程的完整命令行的一个指针;获取指向新进程的环境变量的一个指针;b)初始化c/c++运行库的全局变量。如果包含了StdLib.h,我们的代码就可以访问这些变量;c)初始化c运行库内存分配函数(malloc和calloc)和其他底层I/O例程使用的堆(heap);d)调用所有全局和静态c++类对象的构造函数。


所有的C/C++运行期启动函数的作用基本上都是相同的。它们的差别在于,它们究竟是处理ANSI字符串还是UNICODE字符串,以及它们在对C运行期库进行初始化后它们调用哪个进入点函数。

如果设定了/SUBSYSTEM:WINDOWS链接程序开关,那么该链接程序期望找到一个WinMain或wWinMain函数。如果这两个函数都不存在,链接程序便返回一个“未转换的外部符号”的错误消息。否则,它可以分别选择WinMainCRTStartup函数或wWinMainCRTStartup函数。

同样,如果设定了/SUBSYSTEM:CONSOLE链接程序开关,那么该链接程序便期望找到main或wmain函数,并且可以分别选择mainCRTStartup或wmainCRTStartup函数。同样,如果main或wmain 都不存在,那么链接程序返回一条“未转换外部符号”的消息。

当删除/SUBSYSTEM链接程序开关后,链接程序自动确定应用程序应该链接到哪个子系统。当进行链接时,链接程序要查看代码中存在 4个函数(WinMain、wWinMain 、main或wmain)中的哪一个。然后确定可执行程序应该是哪一个子系统,并且确定可执行程序中应该嵌入哪个C/C++启动函数。

4.C运行期的exit函数

当进入点函数返回时,启动函数便调用 C运行期的exit函数,将返回值(nMainRetVal)传递给它。Exit函数负责下面的操作:

• 调用由_onexit函数的调用而注册的任何函数。

• 为所有全局的和静态的C + +类对象调用析构函数。

• 调用操作系统的ExitProcess函数,将nMainRetVal传递给它。这使得该操作系统能够撤消进程并设置它的exit代码

5.进程的实例句柄——加载到进程地址空间的每个可执行文件或DLL文件均被赋予一个独一无二的实例句柄。

1)LoadIcon函数

对于加载资源的函数调用来说,通常都需要实例句柄的值。若要从可执行文件的映象来加载图标资源,需要调用下面这个函数:

hinst实例句柄,指明哪个文件(可执行文件或DLL文件)包含想要加载的资源

pszIcon加载图标资源名字

2)GetModuleFileName函数

有些函数需要HMODULE类型参数,实际上HMODULE与HINSTANCE是完全相同的对象。

PS:之所以存在两个数据类型,原因是在16位Windows中,HMODULE和HINSTANCE用于标识不同的东西。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,498评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,668评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,857评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,305评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,308评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,747评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,078评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,080评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,649评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,644评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,760评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,352评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,076评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,490评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,651评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,353评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,828评论 2 367

推荐阅读更多精彩内容