操作系统对C/C++和VB,Delphi所编写的EXE文件的加载过程有什么不同么?

来源:百度知道 编辑:UC知道 时间:2024/07/05 00:19:50
在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)传递给它。之后e

不太一样

分数这么少就说简单点吧

vb是解释型语言, 即使编译为pcode仍然要解释器, 应该是 explorer加载pe文件后加载msvbm60.dll之后执行解释

delphi的加载过程基本同C++程序 不过用到的是系统库不是c++库

C++程序的加载描述有误, 事实上explorer没有调用createprocess 而是用的shellexecute, 当然 最终在shell32.dll里面还是调用了createprocess

我猜测关键在于编译的时候选择生成什么环境下的可执行文件,同样WIN32环境下的可执行文件,其加载过程应该是一样的。OS哪里知道可执行文件是用DELPHI还是其它语言生成的,也似乎没有知道的必要。

猜的哈,我也想知道EXE到底是怎样被运行的。