操作系统对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++运行时库?
展开
 我来答
Wahvey
2009-05-23 · 超过13用户采纳过TA的回答
知道答主
回答量:30
采纳率:0%
帮助的人:0
展开全部
不太一样

分数这么少就说简单点吧

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

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

C++程序的加载描述有误, 事实上explorer没有调用createprocess 而是用的shellexecute, 当然 最终在shell32.dll里面还是调用了createprocess
sanbenshiyuan
2009-05-27 · TA获得超过1786个赞
知道小有建树答主
回答量:1256
采纳率:0%
帮助的人:675万
展开全部
我猜测关键在于编译的时候选择生成什么环境下的可执行文件,同样WIN32环境下的可执行文件,其加载过程应该是一样的。OS哪里知道可执行文件是用DELPHI还是其它语言生成的,也似乎没有知道的必要。

猜的哈,我也想知道EXE到底是怎样被运行的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式