在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++运行时库?
解决方案 »
- 请问存储过程中如何提取查询的结果,谢谢
- 如何编程监视某个文件/目录,当其发生变化的时候,报告其变化的状态?
- 多线程断点http下载的几个问题
- ※※※对话框没有弹出,为什么???※※※
- 一个exe程序,能否判断它是以何种方式启动?
- vc Socket发送http报文给客户端
- 下面的程序代码为什么不能只显示对上一步的处理结果呢?
- RemoveFileEx,在win98下是怎么实现的?
- 怎样得到0一个ie的IWebBrowser2实例!
- 为什么没人回答我呢,难道是问题太菜了么????????????????????
- 查询mib表时为什么有的表每列要加上对象的oid,例如[1.3.6.1.2.1.4.20.1.1.127.0.0.1] ,而有的不加[1.3.6.1.2.1.4.1.0]
- 急问:关于XP IE侧边栏的问题(浏览器栏)
那个说明的是VC程序中内部调用序列 跟操作系统加载PE文件的过程不是一层面上的冬冬
操作系统应当不会区分文件用什么写的 而只用同一种方式加载符合格式标准的PE文件
可以参考下pe文件格式的资料
不管是什么编译器,最终编译出来的都是系统能直接识别的. 你试一下反汇编用delphi,或vc生成的小程序就一切明白了