操作系统对C/C++和VB,Delphi所编写的EXE文件的加载过程有什么不同么?
在Windows系统下,对于C/C++而言目前我知道的是:(1)explorer.exe调用了CreateProcess,系统创建一个“进程内核对象”。进程内核对象的初始...
在Windows系统下,对于C/C++而言目前我知道的是:
(1)explorer.exe调用了CreateProcess,系统创建一个“进程内核对象”。进程内核对象的初始使用计数为1。
(2)系统为该进程创建4GB(=2^32)。用于加载App.exe可执行文件和任何必要的dll文件的数据和代码。
(3)CreateProcess打开应用程序文件(.exe),它先扫描该文件的文件头,该文件头里含有文件能运行在那个环境之下,如果是win32环境,系统就直接加载文件的代码和数据并输入(import)该文件执行所需的dll函数。如果不是Win32环境比如时os/2的.exe则先加载相应的环境子系统,载由该环境加载该文件的代码和数据以及该文件执行所需的dll函数。
(4)进程加载代码和数据完毕后,就开始创建线程来执行进程空间内的代码。系统就要创建一个主线程。该线程与c/c++运行时库的启动代码一道开始运行,启动代码则调用进入点函数(main函数),并
且继续运行直到进入点函数返回并且c/c++运行时库的启动代码调用ExitProcess为止。
(5)c/c++运行时库的启动函数它是一个程序的真正调用的第一个函数,它是在程序链接时由链接程序选择相应的启动函数并加到程序的开始处。c/c++运行时库有四个版本的启动函数,分别对应不同类型的应用程序。c/c++运行时库的启动函数的功能如下:
以wWinMainCRTStartup为例。它
负责:
*检索指向新进程的完整命令行指针;
*检索指向新进程的环境变量的指针;
*对c/c++运行时的全局变量进行初始化;
*对c运行期的内存单元分配函数(比如malloc,calloc)和其他低层I/O例程使用的内存栈进行初始化。
*为C++的全局和静态类调用构造函数。
当这些初始化工作完成后,该启动函数就调用wWinMain函数进入应用程序的执行。当wWinMain函数执行完毕返回时,wWinMainCRTStartup启动函数就调用c运行期的exit()函数,将返回值(nMainRetVal)传递给它。之后exit()便开始收尾工作:
*调用由_onexit()函数调用和注册的任何函数。
*为C++的全局和静态类调用析构函数;
*调用操作系统的ExitProcess函数,将nMainRetVal传递给它,这使得操作系统能够撤销进程并设置它的exit 代码。
(6)至此启动函数的任务完成。
我的问题和标题一样,如果是VB, Delphi编译连接的exe文件呢?他们启动的时候是否也是这样加载的?也会用到C/C++运行时库? 展开
(1)explorer.exe调用了CreateProcess,系统创建一个“进程内核对象”。进程内核对象的初始使用计数为1。
(2)系统为该进程创建4GB(=2^32)。用于加载App.exe可执行文件和任何必要的dll文件的数据和代码。
(3)CreateProcess打开应用程序文件(.exe),它先扫描该文件的文件头,该文件头里含有文件能运行在那个环境之下,如果是win32环境,系统就直接加载文件的代码和数据并输入(import)该文件执行所需的dll函数。如果不是Win32环境比如时os/2的.exe则先加载相应的环境子系统,载由该环境加载该文件的代码和数据以及该文件执行所需的dll函数。
(4)进程加载代码和数据完毕后,就开始创建线程来执行进程空间内的代码。系统就要创建一个主线程。该线程与c/c++运行时库的启动代码一道开始运行,启动代码则调用进入点函数(main函数),并
且继续运行直到进入点函数返回并且c/c++运行时库的启动代码调用ExitProcess为止。
(5)c/c++运行时库的启动函数它是一个程序的真正调用的第一个函数,它是在程序链接时由链接程序选择相应的启动函数并加到程序的开始处。c/c++运行时库有四个版本的启动函数,分别对应不同类型的应用程序。c/c++运行时库的启动函数的功能如下:
以wWinMainCRTStartup为例。它
负责:
*检索指向新进程的完整命令行指针;
*检索指向新进程的环境变量的指针;
*对c/c++运行时的全局变量进行初始化;
*对c运行期的内存单元分配函数(比如malloc,calloc)和其他低层I/O例程使用的内存栈进行初始化。
*为C++的全局和静态类调用构造函数。
当这些初始化工作完成后,该启动函数就调用wWinMain函数进入应用程序的执行。当wWinMain函数执行完毕返回时,wWinMainCRTStartup启动函数就调用c运行期的exit()函数,将返回值(nMainRetVal)传递给它。之后exit()便开始收尾工作:
*调用由_onexit()函数调用和注册的任何函数。
*为C++的全局和静态类调用析构函数;
*调用操作系统的ExitProcess函数,将nMainRetVal传递给它,这使得操作系统能够撤销进程并设置它的exit 代码。
(6)至此启动函数的任务完成。
我的问题和标题一样,如果是VB, Delphi编译连接的exe文件呢?他们启动的时候是否也是这样加载的?也会用到C/C++运行时库? 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询