应用程序的启动过程 您所在的位置:网站首页 启动应用程序 应用程序的启动过程

应用程序的启动过程

#应用程序的启动过程| 来源: 网络整理| 查看: 265

应用程序都会有一个入口函数

,

它在程序运行时才被调用。

因此,创建控制应用程序时

,

此入口函数将会是

main

   int main(int argc,char* argv[]); 

操作系统实际上不是真调用

main

函数

,

而是去调用了

C/C++

运行期启动函数,

此函数会初始化

C/C++

运行期库。因此,在程序中可以调用

malloc

free

之类函数。

    

如果,我们在控制台上省去了

main

函数

,

那么连接器将返回一个

"unresolved external 

symbol"

错误。

    Win32

程序启动过程

,

实际上是线程去调用一个

CreateProcess

函数的时候

,

系统会创建一个

进程内核对象

, 

其使用计数被初始化为

1.

此进程内核对象不是进程本身,仅仅是一个系统用来管理这个进程的

小的数据结构。

系统然后为新的进程创建一个虚拟地址空间

,

加载应用程序运行时所需要的代码和数据。

    

系统接着会为新进程创建一个主线程

,

这个主线程通过执行

C/C++

运行期启动代码开始运

行,

C/C++ 

运行期启动代码又会调用

main

函数。如果系统能成功创建新的进程和进程的主线

,CreateProcess

函数会返回

TRUE, 

否则返回

FALSE

     

一般将创建进程称为父进程

,

被创建的进程称为子进程。

系统在创建新的进程时会为新进程

指定一个

STARTUPINFO 

类型的变量,这个结构保护了父进程传递给子进程的一些显示信息。对图形界面应用程序来说

,

这些信息将影响新进程中

主线程的主窗口显示

:

对控制台应用程序来说

,

如果有一个新的控制窗口被创建的话

,

这些信息将

影响这个控制台窗口。

STARTUPINFO

结构定义如下。

       typedef struct{ 

              DWORD    cb;                // 

本结构的长度,总是应该被设为

sizeof(STARTUPINFO) 

              LPSTR        lpReserved;   // 

保留

(Reserve)

字段

,

即程序不使用这个参数

              LPSTR        lpDesktop;    // 

指定桌面名称

              LPSTR        lpTitle;           // 

控制台应用程序使用

,

指定控制台窗口

标题

              DWORD    dwX;              //  

              DWORD    dwY;              // 

              DWORD    dwXSize;         

              DWORD    dwYSize; 

              DWORD    dwXCountChars;   // 

控制台程序使用

,

指定控制台窗口的行数

  

              DWORD    dwYCountChars; 

              DWORD    dwFillAttribute;      //

控制台程序使用

,

指定控制台窗口的背景

              DWORD    dwFlags;           // 

标志。它的值决定了

STARTUPINFO

结构中哪

些成员的值是有效的。

              WORD       wShowWindow;   // 

窗口的显示方式

              WORD       cbReserved2; 

              LPBYTE       lpReserved2; 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有