进程
1 进程的含义:
1.1 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。
1.2 另一个是地址空间,它包含所有可执行模块或DL L 模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。
2 操作系统启动应用程序的步骤
2.1 调用C/c++运行时的启动函数
启动函数总共4种,WinMainCRTStartup,wWinMainCRTStartup,mainCRTStartup,wmainCRTStartup。
启动函数完成如下任务:
<1>检索指向新进程的完整命令行的指针
<2>检索指向新进程的环境变量的指针
<3>对C/ C + +运行期的全局变量进行初始化。如果包含了S t d L i b . h 文件,代码就能访问这些变量
<4>对C运行期内存单元分配函数(m a l l o c 和c a l l o c )和其他低层输入/输出例程使用的内存栈进行初始化。
<5>为所有全局和静态C+ +类对象调用构造函数。
<6>调用入口点函数
如:int nMainRetVal = wmain(__argc, __wargv, _wenviron);
<7>当进入点函数返回时,启动函数便调用C 运行期的ex i t 函数,将返回值(nMainRetVal )传递给它。
<8>调用由_onexit函数的调用而注册的任何函数
<9>为所有全局的和静态的C++类对象调用析构函数
<10>调用操作系统的ExitProcess函数,将nMainRetVal传递给它。这使得该操作系统能够撤消进程并设置它的e x i t 代码
3 进程的实例句柄
3.1 进程的当前实例句柄
加载到进程地址空间的每个exe或者dll文件都会被赋予一个独一无二的句柄。
获取加载的模块(exe,dll)的方法:
GetModuleFileName(HMOUDLEhModule,LPTSTR lpFileName,DWROD nSize);
当hModule的值为NULL 的时候,会返回当前调用模块的全部路径名字。
3.2 进程的前一个实例句柄
C++代码总是将NULL赋值给WinMain函数的