在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.   

    我个人理解
    那个说明的是VC程序中内部调用序列 跟操作系统加载PE文件的过程不是一层面上的冬冬
    操作系统应当不会区分文件用什么写的 而只用同一种方式加载符合格式标准的PE文件
    可以参考下pe文件格式的资料
      

  2.   

    第一,要看是否是.net,如果是VB.net那么生成的根本就不是原生Win32代码,而只中间代码,当然会与原生的C++程序不同。第二,VB和delphi(非.net)遵循pe文件结构,都是原生的Win32代码,加载exe文件头、偏移量的部分都是一样的,但是VB和delphi不会调用C++运行库
      

  3.   

    对操作系统来说,它分不清程序是用什么语言写的,所以操作系统所做的工作是一样的,当然VB或是DEPHI程序不可能会调用C运行库里的函数,不过VB或是DEPHI的编译器会提供自己相应的函数来代替。
      

  4.   

    当然不会调用c++运行库啦.
    不管是什么编译器,最终编译出来的都是系统能直接识别的. 你试一下反汇编用delphi,或vc生成的小程序就一切明白了