第四章进程
一、基本知识
1、 进程的定义,一个正在运行的程序的一个实例。由两部分组成,内核对象(系统保存进程统计信息的地方,用来管理进程)和地址空间(进程的所有执行体、数据段、堆栈等)。
2、 Windows有2大类应用程序。CUI(控制台用户界面)和GUI(图形用户界面),划分界限模糊。其中,关联到了VS集成环境链接器的各种开关。
3、 启动函数在进行一系列初始化(获取新进程的完整命令行的指针、环境变量指针、初始化C/C++运行库的全局变量、C运行库内存分配函数malloc和calloc及其他低级I/O历程使用的堆、调用全局和静态C++类对象的构造函数)后进入入口函数。
4、 进程实例句柄,独一无二。HMODULE和HINSTANCE是一回事吧,16位Windows除外。相关的函数就有HMOUDULEGetModuleHandle(PCTSTR pszModule),参数为NULL则是主调进程的(在DLL中调用的话,既是调用DLL的进程)可执行文件的基地址(HINSTANCE)。
5、 进程的命令行,一个新进程在创建时,都会接收一个命令行。WinMain的pszCmdline相关(忽略了执行体文件的名称的)。GetCommandLine返回的是同一块命令行内存,一般用来只读。好习惯的话,应该创建个缓冲区来。
6、 进程的环境变量,每个进程都有这么个与之关联的环境块,是在进程地址空间内分配的一个内存块。可通过GetEnvironmentStrings函数来获取完整的环境块。格式就不多说了。释放环境变量应该用BOOL FreeEnvironmentStrings(PTSTR pszEnvironmentBlock)函数。(这样就可以不管它’\0’位置怎样了) CUI程序还有专用的访问方法,通过main入口函数所接收的TCHAR* env[]参数来实现。env是一个字符串指针数组,每个指针都指向一个不同的环境变量(定义采用常规的“名称=值”的格式),NULL指针表示数组尾。
7、 用户登录Windows时,系统会创建shell进程。通过检查注册表中的两个项来获得初始的环境字符串。第一个项包含应用于系统的所有环境变量的列表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment第二个项包含应用于当前登录用户的所有环境变量的列表:HKEY_CURRENT_USER\Environment。
8、 通过修改注册表修改环境变量后,用户需要注销并重新登录才能生效。或者给其它主窗口发送WM_SETTINGCHANGE消息。SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment"))。
9、 子进程会继