分类: Windows平台
2014-01-03 20:51:21
一般将进程定义成一个正在进行的程序的一个实例 ,由一个内核对象和一个地址空间组成
GUI指图形用户界面,链接器开关是/SUBSYSTEM:WINDOWS,链接程序会寻找WinMain或wWinMain函数,然后选择WinMainCRTStartup或wWinMainCRTStartup函数启动。
CUI指控制台用户界面,链接器开关是/SUBSYSTEM:WINDOWS,链接程序会寻找main或wmain函数,然后选择mainCRTStartup或wmainCRTStartup函数启动。
注:我们可以从自己项目中移除/SUBSYSTEM链接器开关,使链接器自动判断应该将应用程序是哪一个子系统。
使用stdlib.h 里的_osver _winmajor _winminor _winver 等全局变量可以获得系统信息,但是微软不赞成使用这些变量,推荐使用GetVersionEx来获得相关系统信息。
HMODULE和HINSTANCE完全是一回事。如果一个函数的文档指出需要一个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。