从今天开始,重新学习一些细节性质的东西
一.在VS开发环境中,应用程序的入口点:
_tWinMain WinMainCRTStartup
_tWinMain wWinMainCRTStartup
_tmain mainCRTStartup
_tmain wmainCRTStartup
相关的介绍 请参考<Windows核心编程> 这4个入口函数在crtexe.c文件中
这些启动函数主要是初始化一些全局变量
如果要使用这些全局变量,请包含stdlib.h
二.进程的实例句柄,其值大概是其载入内存的基址(GetModuleHandle)
三.进程的命令行
参考
GetCommandLine和CommandLineToArgW
四.进程的环境变量
GetEnviromentStrings
FreeEnviromentStrings
用户登录Windows时,系统会创建外壳Shell进程,并将一组环境变量与其关联,系统通过检查注册表中的2个注册表项来获得初始的环境字符串
第一个注册表项包含应用于系统的所有环境变量的列表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Enviroment
第二个注册表项包含应用于当前登录用户的所有环境变量列表
HKEY_CURRENT_USER\Enviroment
用户可以在环境变量中添加或删除这些环境变量
应用程序还可以使用各种注册表函数来修改这些注册表项,不过,为了使改动对所有的应用程序生效,用户必须注销并重新登录.有的应用程序(比如资源管理器,控制面板)可以在其主窗口接受到WM_SETTINGCHANGE消息时,用新的注册表项来更新他们的环境变量.例如,假如更新了注册表项,并希望应用程序立即更新他们的环境块,可以进行如下调用
SendMessage(HWND_BROADCAST,MW_SETTINGCHANGE,0,(LPARAM)TEXT("Enviroment"));
通常子进程会继承一组环境变量,这些环境变量和父进程的环境变量相同.不过,父进程可以控制哪些环境变量允许子进程继承,这里所说的继承,是指子进程获得父进程的环境块的一个副本,这个副本子进程可以随意修改而不会影响到父进程.
GetEnviromentVariable来判断一个环境变量是否存在于进程的环境变量块中,一般这个函数的安全的用法是调用2次,第一次调用cchValue中传入0,那么函数返回时会返回缓冲区需要的大小,
ExpandEnviromentStrings函数来检测可替换的环境变量字符串(比如%User%)其用法和上面的差不多(详细的介绍请参考Windows核心编程 进程的环境变量块)
最后可以使用SetEnviromentVariable函数添加一个变量,删除一个变量,或者修改一个变量
五进程的错误模式
SetErrorMode设置进程的错误模式
如果希望子进程不继承某些父进程的错误模式,请在CreateProcess中指明
六.进程的当前目录
GetCurrentDirectory
例如一个进程有如下2个环境变量
=C:=C:\Bin
=D:=D:\bin
当前程序在C\Bin目录下,而且我们的程序调用CreateFile来打开D:ReadMe.txt,那么系统就会查找环境变量=D:.由于=D:变量是存在的,所以系统将尝试从D:\bin目录下打开这个文件.如果=D:变量不存在,那么系统就会试着从D盘的根目录打开ReadMe.txt.
可以使用C语言运行库函数_chdir函数而不是SetCurrentDirectory函数来更改设置当前目录._chdir函数在内部调用SetCurrentDirectory.但_chdir还会调用SetEnviromentVariable来添加或修改环境变量,从而使不同的驱动器的当前目录得以保留
如果一个父进程创建了一个希望传给子进程的环境块,子进程的环境块就不会自动继承父进程的当前目录,相反,子进程的当前目录默认为每个驱动器的根目录.如果希望子进程继承父进程的当前目录,父进程就必须在生成子进程之前,创建这些驱动器号环境变量,并把它们添加到环境变量块中,父进程通过调用GetFullPathName来获取他的当前目录
七.系统版本
GetVersion
GetVersionEx-------OSVERSIONINFOEX
为了进一步简化编程,Windows Vista还提供了VerifyVersionInfo,它能比较主机系统的版本和应用程序要求的版本