应用程序的启动过程 | 您所在的位置:网站首页 › 启动应用程序 › 应用程序的启动过程 |
应用程序都会有一个入口函数 , 它在程序运行时才被调用。
因此,创建控制应用程序时 , 此入口函数将会是 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 实验室设备网 版权所有 |