您的位置:首页 > 其它

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: