chapter 4.1 进程,编写第一个windows应用程序
2013-02-28 23:25
204 查看
-----------------进程-----------------------------------------
进程定义:
一个内核对象,用来管理进程和统计信息
一个地址空间,包括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]
相关文章推荐
- Windows核心编程 进程--编写第一个windows应用程序
- 运用JavaScript构建你的第一个Metro式应用程序(on Windows 8)(一)
- 第一个windows应用程序
- C#编写windows桌面应用程序将控件放入数组以便在循环中使用
- 第一个Windows窗口应用程序
- 消息队列(1):windows10+eclipse+cygwin编写第一个消息队列程序
- Windows桌面应用程序(1-2-2nd) 模块1.您的第一个Windows程序
- 运用JavaScript构建你的第一个Metro式应用程序(onWindows 8)(二) (转)
- C#编写Windows桌面应用程序弹出对话框取得文件名
- 第一个 Hibernate应用程序(手动编写)
- 第一篇 Windows环境下通过Eclipse创建的第一个安卓应用程序(图文详细步骤)
- 利用Visual C#编写Windows应用程序的一般过程
- Windows 应用程序的入口函数编写
- 运用JavaScript构建你的第一个Metro式应用程序(onWindows 8)(三) (转)
- 在Windows下编写并运行第一个ASP.NET 5 Preview Web API程序
- 《CoffeeScript应用开发》学习:第二章 编写第一个CoffeeScript应用程序
- Windows下安装和构建我们第一个React Native应用程序(我是用的win10)
- 使用struts2技术编写的第一个应用程序
- C#编写Windows桌面应用程序在窗体上滚动字幕
- 编写C#程序-Windows Application应用程序