《Windows核心编程》读书笔记——进程篇

来源:互联网 发布:js设置单选框选中的值 编辑:程序博客网 时间:2024/06/05 18:17

第4章 进程:

1. 一般将进程定义成一个正在运行的程序的一个实例,它由以下两部分构成。

      一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。

      一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据。

2. 每个进程至少要有一个线程来执行进程地址空间包含的代码。如果没有线程要执行进程地址空间包含的代码,进程就失去了继续存在的理由,系统会自动销毁进程及其地址空间。

3. 在VS开发过程中通过链接器开关/SUBSYSTEM:CONSOLE或/SUBSYSTEM:WINDOWS设置是加载应用台程序还是窗口。

4. windows应用程序的入口点函数有四种(是否加载应用台程序,是否使用Unicode,两个2维选项组成四种组合)。分别是:

      _tWinMain(WinMain),嵌入可执行文件的启动函数是 WinMainCRTStartup

      _tWinMain(wWinMain),嵌入可执行文件的启动函数是 wWinMainCRTStartup

      _tmain(Main),嵌入可执行文件的启动函数是 mainCRTStartup

      _tmain(Wmain),嵌入可执行文件的启动函数是 wmainCRTStartup

链接时根据上面链接器开关选择应的入口函数来做链接。

5. 上述启动函数的源码在crtexe.c文件中,主要的用途总结如下:

      获取指向新进程的完整命令行的一个指针。

      获取指向新进程的环境变量的一个指针。

      初始化C/C++运行库的合璧变量。如果包含了StdLib.h,我们的代码就可以访问这些变量。

      初始化C运行库内存分配函数(malloc,alloc)和其他底层I/O例程使用的堆(heap)。

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

     

      完成以上的初始化工作以后就调用应用程序的入口点函数。

6. 提到内存泄露的检测方法,已经转载文章在本博客中。

7. 进程实例句柄的获取和使用:GetModuleHandle, GetModuleHandlerEx,GetModuleFileName

8. 进程命令行的获取:GetCommandLine,CommandLineToArgvW

9. 进程环境变量:GetEnvironmentStrings,FreeEnvironmentStrings,GetEnvironmentVariable,SetEnvironmentVariable

10. 进程相关路径的函数:GetCurrentDirectory, GetFullPathName

11. 创建进程函数CreateProcess,本章最重要的函数。它的运行机理:

      a. 系统创建一个进程内核对象;

      b. 系统为进程创建一个虚拟地址空间,加载可执行文件的代码及数据到这个虚拟地址空间;

      c. 系统为新进程的主线程创建一个线程内核对象;

      d. 主线程执行C/C++运行时的启动例程,执行应用程序入口;

      e. 如果创建新进程和主线程成功,返回TRUE。

      参数及说明请参考:http://social.msdn.microsoft.com/search/en-us/windows/desktop?query=CreateProcess&Refinement=181

      参数的使用是本章的关键。

12. 终止进程函数 ExitProcess,是不安全的函数,不要在程序中调用。其过程可以使用构造函数和析构函数打印是否调用来证明。

13. 终止进程函数 TerminateProcess,是安全函数,可以使用。

14. 子进程在创建时拥有父进程的ID,但如果父进程终止了,此ID就没意义了,所以如果没有同步信号表明父进程没有结束,不要使用这个ID来做事情。

15. 管理员以标准用户权限运行时:这些内容是windows vista及win7的新增内容,也是相对独立而重要的,另开一篇总结。

      书上得来终觉浅,缘知此事要躬行。

原创粉丝点击