Windows应用程序的启动过程


Windows应用程序的启动过程

操作系统实际上并不调用你编写的进入点函数。它调用的是C/C++ run-time startup function。该函数负责对C/C++ run-time library进行初始化,这样,就可以调用mallocfree之类的函数。它还能够确保已经声明任何全局对象和静态对象能够在代码执行以前正确的创建。

所有的C/C++ run-time startup function的作用是相同的,其差别在于:是处理ANSI字符串还是Unicode字符串,以及他们在对C run-time library进行初始化后,它们调用那个进入点函数。VC++配有C run-time library的源代码。可以在CRt0.c文件中找到这4个启动函数的代码。

启动函数的功能可概括如下:

l 检索指向新进程的完整命令行的指针

l 检索指向新进程的环境变量的指针

l C/C++ run time's global variables进行初始化。如果包含了stdlib.h头文件,你的代码就能访问这些变量。详见下表:

l C运行期内存分配函数(mallcocalloc)以及low-level input/output routines使用的heap(堆)进行初始化

l 为所有的全局和静态C++类对象调用构造函数

当上述这些初始化操作完成后,C/C++ run-time startup function调用应用程序的进入点函数。

如果编写了一个WinMain函数,它将以如下的形式被调用

GetStartupInfo( &StartupInfo );

int nMainRetVal = WinMain( GetModuleHandle(NULL), NULL, pszCommandLineAnsi,

(StartupInfo.dwFlags & STARTF_USESHOWWINDOW)

? StartupInfo.wShowWindow : SW_SHOWDEFAULT );

当进入点函数返回时,启动函数便调用C运行期的exit寒暑,将返回值(nMainRetVal)传递给它。

Exit函数负责如下操作:

l 调用_onexit函数的调用而注册的任何函数

l 为所有全局的和静态的C++类对象调用析构函数

l 调用操作系统的ExitProcess函数,将nMainRetVal传递给它。这使得操作系统能够撤销此进程并设置它的exit code(该代码保存在该进程对应的内核对象中)。

优质内容筛选与推荐>>
1、合成/聚合复用原则,桥接模式
2、z-index属性
3、大数变形版斐波那契
4、免Root停用“Android键盘(AOSP)”
5、如何在一台机器上运行2个Tomcat


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号