- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
写在前面:
最近在研究一个VC 界面库 DuiLib,在细读它的源码时遇到些问题,比如
它的界面是如何绘制上去的,底层操作是如何实现的,就是 CreateWindow 和
ShowWindow 又是如何实现的,也不得而知,因此我想有必要重新认识下Win32
应用程序的启动/运行原理才好。
如题所述,本文讲的的Windows 环境下exe可执行文件的运行原理,这里
面涉及的知识很多,需要读者对Windows 操作系统(如注册表、进程、线程、
PE Windows c++
内存管理、 文件格式等)、 编程(本文使用 语言)等有所了解。
本文试图以通俗易懂的语言描述,让更多的人看的懂,从运行原理上对程序的运
行有个好的了解。
文章安排方面,我这里是以大家都懂的main / WinMain 函数执行前,执行时,
执行后分为三个部分:exe程序的初始化;主函数的运行过程;程序收尾工作
PS:本人的技术也是有限的,文章中难免会有错误疏漏之处,还请各位高手批
评指正。转载请注明出处,谢谢
本文使用的例子444.exe程序下载地址:
1
下载地址 :
1/file/D4/53/tzydH05zcHTmkwTlAE44iue6lUk204.zip?key=n5f6
a61fc1a1fb190d2b250dc7cd74e2ce2082ccc1b4d4178euid=1035291token=l1az8k
lrmhi8bwxl49201cxedjdir=%2Fname=xunlei.zip
下载地址2:
http://115.com/file/clg0o6il#
一、exe程序的初始化
一、exe程序的初始化
一一、、eexxee程程序序的的初初始始化化
打开一个软件是如此简单,双击软件的图标就是了!但你是否想过,当你双
击那个图标时,系统都做了哪些工作?为什么双击图标软件就运行起来了?
没错,就是Shell(以Explorer.exe进程实现)。当你启动电脑进入桌面时,
系统创建Explorer.exe进程,而其它的进程,可以说都是Explorer.exe的子进
程,因为它们都是由Explorer.exe进程创建的。也就是说,当你双击图标时Shell
会侦测到这个动作,注册表中有相关的项保存着双击操作的信息,如exe文件关
联、启动exe的Shell是哪个。
注册表中保存的exe文件关联信息
打开一个exe时指定的参数信息
指定启动exe程序的Shell
我们看到,启动exe文件指定的Shell 就是Explorer.exe 啦。因此,我们应该
exe Explorer.exe
知道了,双击 文件图标时 进程的一个线程会侦测到这个操作,
它根据注册表中的信息取得文件名(根据%1这个参数),然后Explorer.exe 以这
个文件名调用CreateProcess 函数,这个函数做了很多工作。
CreateProcess 函数的定义是这样的:
BOOLWINAPICreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOLbInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
此函数的具体信息和用法在MSDN
文档评论(0)