chapter 4.1 进程,编写第一个windows应用程序

-----------------进程-----------------------------------------
进程定义:
    一个内核对象,用来管理进程和统计信息
    一个地址空间,包括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]











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值