Windows核心编程——第4章 进程(上)

一般将进程定义成一个正在进行的程序的一个实例 ,由一个内核对象和一个地址空间组成

GUI vs CUI

GUI指图形用户界面,链接器开关是/SUBSYSTEM:WINDOWS,链接程序会寻找WinMainwWinMain函数,然后选择WinMainCRTStartupwWinMainCRTStartup函数启动。

CUI指控制台用户界面,链接器开关是/SUBSYSTEM:WINDOWS,链接程序会寻找mainwmain函数,然后选择mainCRTStartupwmainCRTStartup函数启动。

注:我们可以从自己项目中移除/SUBSYSTEM链接器开关,使链接器自动判断应该将应用程序是哪一个子系统。

使用stdlib.h 里的_osver _winmajor _winminor _winver 等全局变量可以获得系统信息,但是微软不赞成使用这些变量,推荐使用GetVersionEx来获得相关系统信息。

HMODULEHINSTANCE完全是一回事。如果一个函数的文档指出需要一个HMODULE参数,我们可以传入一个HINSTANCE,反之亦然。

进程的命令行

PTSTR GetCommandLine()

该函数获得一个指向进程完整命令行的指针,返回一个缓冲区指针,由于它返回的总是同一个缓冲区的地址,修改后就没法知道原来的命令行是什么了,所以想对命令行修改,最好的做法是将命令行缓冲区复制到应用程序的一个本地缓冲区,再对本地缓冲区进行修改。

也可以将命令行解析成一组单独的标记,可以用下面的函数

PWSTR* CommandLineToArgvW(

PWSTR pszCmdLine,

int* pNumArgs);

pszCmdLine指向一个命令行字符串,且只有Unicode版本所以通常为GetCommandLineW函数的返回值,另外CommandLineToArgvW在内部分配内存,许多应用程序不会释放这块内存,让操作系统来释放,这是可以接受的。

int nNumArgs;

PWSTR *ppArgv = CommandLineToArgvw(GetCommandLine(),&nNumArgs);

进程的环境变量

获取进程的环境变量有两种方法

第一种方式是调用GetEnvironmentStrings函数来获取完整的环境块指针,该指针可以用来标识一个传给CreateProcess函数的环境块地址,用FreeEnvironmentStrings来释放它。

注:最好不要用这个函数来获取或者设置环境变量,而用GetEnvironmentVariable和 SetEnvironmentVariable来实现,另外可以使用ExpandEnvironmentStrings来扩展环境变量字符串,比如%USER%\Doucuments,而USER环境变量值为C:\User,那么扩展后的环境变量将变成C:\User\Doucuments

第二种方式是CUI程序专用的,通过getenv()

用户登录Windows时,系统会创建外壳进程,并将一组环境字符串与其关联。系统会通过检查注册表中的两个注册表项来获得初始的环境字符串

第一个注册表项包含应用于系统的所有环境变量的列表:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

第二个注册表项包含应用于当前登录用户的所有环境变量的列表

HKEY_CURRENT_USER\Environment

通过注册表更改应用程序环境变量后可以使主窗口接收WM_SETTINGCHANGE消息,用新的注册表项来更新它们的环境块,可以使用如下调用:

SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)TEXT(“Environment”));

通常子进程会继承一组环境变量,子进程和父进程并不共享同一个环境块,因此子进程可以修改自己的环境变量而不会影响到父进程的环境块。

进程错误模式

默认情况下,子进程会继承父进程的错误模式标志,子进程并不知道自己继承父进程的什么标志,因此父进程可以阻止子进程继承其错误模式,方法是在调用CreateProcess时指定CREATE_DEFAULT_ERROR_MODE标志。

进程当前驱动器和目录

进程内的线程可以调用以下两个函数来获取和设置其所在的进程的当前驱动器和目录:

DWORD GetCurrentDirectory(DWORD cchCurDir,PTSTR pszCurDir);

BOOL SetCurrentDirectory(PCTSTR pszCurDir);

C运行库函数 _chdir来设置环境变量

获取系统版本

使用GetVersionEx函数取得一个OSVERSIONINFOEX结构。另外Vista之后的操作系统还提供了VerifyVersionInfo来进行判断系统信息,具体用法详见MSDN


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值