-----------------进程-----------------------------------------
进程定义:
一个内核对象,用来管理进程和统计信息
一个地址空间,包括exe和dll的代码和数据,以及动态内存分配
进程的主线程:自动创建的第一个线程
---------------编写第一个windows应用程序----------------------
两种应用程序
GUI:
链接器开关 /SUBSYSTEM:CONSOLE
入口点函数:
_tWinMain(WinMain) ---ANSI
_tWinMain(wWinMain) ---Unicode
可执行文件中的启动函数
WinMainCRTStartup ---ANSI
wWinMainCRTStartup ---Unicode
CUI:
链接器开关 /SUBSYSTEM:WINDOWS
入口点函数:
_tmain(Main) ---ANSI
_tmain(Wmain) ---Unicode
可执行文件中的启动函数
mainCRTStartup ---ANSI
wmainCRTStartup ---Unicode
* 移除 /SUBSYSTEM 从而让编译器自动判断程序类型。
应用程序的启动
1.获取指针指向新进程的命令行
2.获取指针指向新进程的环境壁垒
3.初始化C/C++运行库的全局变量(包含 StdLib.h后即可访问)
4.初始化C运行库内存分配函数及堆
5.调用全局和静态C++类对象的构造函数
应用程序的C/C++运行库的全局变量 [p69]
操作系统版本号,及主次版本号
命令行参数的个数
命令行参数
环境变量的指针
程序名称和完整路径
* 请换用winapi函数访问!
1.进程实例句柄
由WinMain函数的第一个参数 hInstanceExe传入
* HMODULE即hInstanceExe
GHMODULE getModuleHandle(PCTSTR pszModule)使用:
1.输入名称返回对应exe/dll基地址(句柄)
2.输入NULL返回主调进程的 exe基地址
3.使用getModuleHandleEx传入当前函数地址、宏和HMODULE获得 dll基地址
*注意:只检查主调进程的地址空间
2.进程前一个实例的句柄
不要引用WinMain的第二个参数
使用UNREFERENCED_PARAMETER宏
3.进程的命令行
不要修改pszCmdLine内容
使用GetCommandLine获得
使用CommandLineToArgvW分解argv( ShellAPI.h, Shell32.dll)
使用HeapFree释放命令行占用的内存
4.进程的环境变量
注意跳过第一个=::=::字符串,及=开头的字符串
提取环境变量
1.使用GetEnvironmentStrings获得完整的环境块
2.使用GetEnvironmentVariable获得一个环境变量的值 [p78](!需要调用两次!)
3.使用ExpandEnvironmentString获得一个环境变量的扩展字符串(替换了%xxx%的环境变量)
4.CUI专用:使用env数组指针参数(没有了无效字符串)
*提取环境变量示例:[p75]
设置修改删除环境变量
SetEnvironmentVariable
使用FreeEnvironmentString释放内存
*环境变量的空格是有意义的
*即时更新注册表(环境变量在注册表中):
1.重启电脑;
2.调用SendMessage方法传递WM_SETTINGCHANGE消息
*子进程可以继承父进程的环境变量副本
5.进程的关联性
处理器关联性:可以强迫线程在CPU的一个子集中运行,子进程继承关联性
6.进程的错误模式
进程调用SetErrorMode告诉系统如何处理错误
1.系统不显示严重错误处理程序,并将错误返回主调进程
2.调试程序:系统不显示常规保护错误,由调试程序自行处理
3.系统查找文件失败时,不显示消息框
4.系统自动修复内存对齐错误(对x86/x64)无效
*子进程会自动继承父进程的错误处理模式
7.进程当前所在的驱动器和目录
获得:GetCurrentDirectory
设置:SetCurrentDirectory
*使用 WinDef.h的MAX_PATH构建缓冲区
*对进程中的所有线程都造成影响
8.进程的当前目录
打开文件的默认目录
*在环境变量中保存了多个驱动器的当前目录,用=开头
*子进程,父进程?GetFullPathName
9.系统版本
使用GetVersionEx获得OSVERSIONINFOEX结构获得版本,suits,type等信息
[p84]
进程定义:
一个内核对象,用来管理进程和统计信息
一个地址空间,包括exe和dll的代码和数据,以及动态内存分配
进程的主线程:自动创建的第一个线程
---------------编写第一个windows应用程序----------------------
两种应用程序
GUI:
链接器开关 /SUBSYSTEM:CONSOLE
入口点函数:
_tWinMain(WinMain) ---ANSI
_tWinMain(wWinMain) ---Unicode
可执行文件中的启动函数
WinMainCRTStartup ---ANSI
wWinMainCRTStartup ---Unicode
CUI:
链接器开关 /SUBSYSTEM:WINDOWS
入口点函数:
_tmain(Main) ---ANSI
_tmain(Wmain) ---Unicode
可执行文件中的启动函数
mainCRTStartup ---ANSI
wmainCRTStartup ---Unicode
* 移除 /SUBSYSTEM 从而让编译器自动判断程序类型。
应用程序的启动
1.获取指针指向新进程的命令行
2.获取指针指向新进程的环境壁垒
3.初始化C/C++运行库的全局变量(包含 StdLib.h后即可访问)
4.初始化C运行库内存分配函数及堆
5.调用全局和静态C++类对象的构造函数
应用程序的C/C++运行库的全局变量 [p69]
操作系统版本号,及主次版本号
命令行参数的个数
命令行参数
环境变量的指针
程序名称和完整路径
* 请换用winapi函数访问!
1.进程实例句柄
由WinMain函数的第一个参数 hInstanceExe传入
* HMODULE即hInstanceExe
GHMODULE getModuleHandle(PCTSTR pszModule)使用:
1.输入名称返回对应exe/dll基地址(句柄)
2.输入NULL返回主调进程的 exe基地址
3.使用getModuleHandleEx传入当前函数地址、宏和HMODULE获得 dll基地址
*注意:只检查主调进程的地址空间
2.进程前一个实例的句柄
不要引用WinMain的第二个参数
使用UNREFERENCED_PARAMETER宏
3.进程的命令行
不要修改pszCmdLine内容
使用GetCommandLine获得
使用CommandLineToArgvW分解argv( ShellAPI.h, Shell32.dll)
使用HeapFree释放命令行占用的内存
4.进程的环境变量
注意跳过第一个=::=::字符串,及=开头的字符串
提取环境变量
1.使用GetEnvironmentStrings获得完整的环境块
2.使用GetEnvironmentVariable获得一个环境变量的值 [p78](!需要调用两次!)
3.使用ExpandEnvironmentString获得一个环境变量的扩展字符串(替换了%xxx%的环境变量)
4.CUI专用:使用env数组指针参数(没有了无效字符串)
*提取环境变量示例:[p75]
设置修改删除环境变量
SetEnvironmentVariable
使用FreeEnvironmentString释放内存
*环境变量的空格是有意义的
*即时更新注册表(环境变量在注册表中):
1.重启电脑;
2.调用SendMessage方法传递WM_SETTINGCHANGE消息
*子进程可以继承父进程的环境变量副本
5.进程的关联性
处理器关联性:可以强迫线程在CPU的一个子集中运行,子进程继承关联性
6.进程的错误模式
进程调用SetErrorMode告诉系统如何处理错误
1.系统不显示严重错误处理程序,并将错误返回主调进程
2.调试程序:系统不显示常规保护错误,由调试程序自行处理
3.系统查找文件失败时,不显示消息框
4.系统自动修复内存对齐错误(对x86/x64)无效
*子进程会自动继承父进程的错误处理模式
7.进程当前所在的驱动器和目录
获得:GetCurrentDirectory
设置:SetCurrentDirectory
*使用 WinDef.h的MAX_PATH构建缓冲区
*对进程中的所有线程都造成影响
8.进程的当前目录
打开文件的默认目录
*在环境变量中保存了多个驱动器的当前目录,用=开头
*子进程,父进程?GetFullPathName
9.系统版本
使用GetVersionEx获得OSVERSIONINFOEX结构获得版本,suits,type等信息
[p84]