寻找windows程序的启动过程,就是从点击程序图标开始起,程序是怎样运行的?
2007-06-07 09:58
423 查看
到处搜索!!!!
Windows应用程序的启动过程
操作系统实际上并不调用你编写的进入点函数。它调用的是C/C++ run-time startup function。该函数负责对C/C++ run-time library进行初始化,这样,就可以调用malloc和free之类的函数。它还能够确保已经声明任何全局对象和静态对象能够在代码执行以前正确的创建。
所有的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运行期内存分配函数(mallco和calloc)以及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(该代码保存在该进程对应的内核对象中)。
C++中的global object都配置在程序的data segment中,如果没有明确的初
始化,将以0为内存中的初值。这个过程是在编译期实现的。
如果global object配有constructor的话,那么这个constructor要到程序的
startup阶段才会执行。这个过程叫静态初始化。
C++对于在何时初始化global object没有明确规定,但是保证在main函数执行
之前完成初始化,在main结束之前完成清除。一般的编译器都是在main的开始处插
入所谓的startup阶段进行初始化,在结束时插入exit阶段来进行清除操作。
Windows应用程序的启动过程
操作系统实际上并不调用你编写的进入点函数。它调用的是C/C++ run-time startup function。该函数负责对C/C++ run-time library进行初始化,这样,就可以调用malloc和free之类的函数。它还能够确保已经声明任何全局对象和静态对象能够在代码执行以前正确的创建。
所有的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运行期内存分配函数(mallco和calloc)以及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(该代码保存在该进程对应的内核对象中)。
C++中的global object都配置在程序的data segment中,如果没有明确的初
始化,将以0为内存中的初值。这个过程是在编译期实现的。
如果global object配有constructor的话,那么这个constructor要到程序的
startup阶段才会执行。这个过程叫静态初始化。
C++对于在何时初始化global object没有明确规定,但是保证在main函数执行
之前完成初始化,在main结束之前完成清除。一般的编译器都是在main的开始处插
入所谓的startup阶段进行初始化,在结束时插入exit阶段来进行清除操作。
相关文章推荐
- iOS程序启动内部过程(从点击图标到显示界面)
- 分析点击android桌面app图标启动应用程序的过程
- 怎样防止App在后台运行,点击应用桌面图标重新启动?
- 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法
- Android 点击通知栏图标 返回已经运行的程序,而不开启一个新的Activity
- Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)
- 怎样防止App在后台运行,点击应用桌面图标重新启动?
- 怎样在android系统启动时自动运行自己的程序
- 怎样防止App在后台运行,点击应用桌面图标重新启动
- Android从启动到程序运行整个过程的整理
- 怎样在android系统启动时自动运行自己的程序
- Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)
- 窗口最小化后,可在另一程序中点击程序图标,让程序显示出来,唯一程序运行
- 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法
- 一个APP从启动到主页面显示经历了哪些过程?(App启动流程,从点击桌面开始)
- 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法
- android点击了桌面图标后,启动过程
- 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法
- Windows中.exe程序的启动过程和C/C++运行时库
- Oracle form开发时点击菜单“程序”-》“运行表单”,出现“FRM-10142:HTTP监听程序没有在******的端口8889上运行。请启动该监听程序或检查您的运行时首选项。”