进程的细节
從今天開始,重新學(xué)習(xí)一些細(xì)節(jié)性質(zhì)的東西
?
一.在VS開發(fā)環(huán)境中,應(yīng)用程序的入口點(diǎn):
_tWinMain?????????????? WinMainCRTStartup
_tWinMain?????????????? wWinMainCRTStartup
_tmain???????????????????? mainCRTStartup
_tmain???????????????????? wmainCRTStartup
相關(guān)的介紹 請參考<Windows核心編程> 這4個入口函數(shù)在crtexe.c文件中
這些啟動函數(shù)主要是初始化一些全局變量
如果要使用這些全局變量,請包含stdlib.h
?
二.進(jìn)程的實(shí)例句柄,其值大概是其載入內(nèi)存的基址(GetModuleHandle)
?
三.進(jìn)程的命令行
參考
GetCommandLine和CommandLineToArgW
?
四.進(jìn)程的環(huán)境變量
GetEnviromentStrings
FreeEnviromentStrings
?
用戶登錄Windows時,系統(tǒng)會創(chuàng)建外殼Shell進(jìn)程,并將一組環(huán)境變量與其關(guān)聯(lián),系統(tǒng)通過檢查注冊表中的2個注冊表項(xiàng)來獲得初始的環(huán)境字符串
第一個注冊表項(xiàng)包含應(yīng)用于系統(tǒng)的所有環(huán)境變量的列表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Enviroment
第二個注冊表項(xiàng)包含應(yīng)用于當(dāng)前登錄用戶的所有環(huán)境變量列表
HKEY_CURRENT_USER\Enviroment
用戶可以在環(huán)境變量中添加或刪除這些環(huán)境變量
?
應(yīng)用程序還可以使用各種注冊表函數(shù)來修改這些注冊表項(xiàng),不過,為了使改動對所有的應(yīng)用程序生效,用戶必須注銷并重新登錄.有的應(yīng)用程序(比如資源管理器,控制面板)可以在其主窗口接受到WM_SETTINGCHANGE消息時,用新的注冊表項(xiàng)來更新他們的環(huán)境變量.例如,假如更新了注冊表項(xiàng),并希望應(yīng)用程序立即更新他們的環(huán)境塊,可以進(jìn)行如下調(diào)用
SendMessage(HWND_BROADCAST,MW_SETTINGCHANGE,0,(LPARAM)TEXT("Enviroment"));
?
通常子進(jìn)程會繼承一組環(huán)境變量,這些環(huán)境變量和父進(jìn)程的環(huán)境變量相同.不過,父進(jìn)程可以控制哪些環(huán)境變量允許子進(jìn)程繼承,這里所說的繼承,是指子進(jìn)程獲得父進(jìn)程的環(huán)境塊的一個副本,這個副本子進(jìn)程可以隨意修改而不會影響到父進(jìn)程.
?
GetEnviromentVariable來判斷一個環(huán)境變量是否存在于進(jìn)程的環(huán)境變量塊中,一般這個函數(shù)的安全的用法是調(diào)用2次,第一次調(diào)用cchValue中傳入0,那么函數(shù)返回時會返回緩沖區(qū)需要的大小,
ExpandEnviromentStrings函數(shù)來檢測可替換的環(huán)境變量字符串(比如%User%)其用法和上面的差不多(詳細(xì)的介紹請參考Windows核心編程? 進(jìn)程的環(huán)境變量塊)
?
最后可以使用SetEnviromentVariable函數(shù)添加一個變量,刪除一個變量,或者修改一個變量
?
五進(jìn)程的錯誤模式
SetErrorMode設(shè)置進(jìn)程的錯誤模式
如果希望子進(jìn)程不繼承某些父進(jìn)程的錯誤模式,請在CreateProcess中指明
?
六.進(jìn)程的當(dāng)前目錄
GetCurrentDirectory
例如一個進(jìn)程有如下2個環(huán)境變量
=C:=C:\Bin
=D:=D:\bin
當(dāng)前程序在C\Bin目錄下,而且我們的程序調(diào)用CreateFile來打開D:ReadMe.txt,那么系統(tǒng)就會查找環(huán)境變量=D:.由于=D:變量是存在的,所以系統(tǒng)將嘗試從D:\bin目錄下打開這個文件.如果=D:變量不存在,那么系統(tǒng)就會試著從D盤的根目錄打開ReadMe.txt.
可以使用C語言運(yùn)行庫函數(shù)_chdir函數(shù)而不是SetCurrentDirectory函數(shù)來更改設(shè)置當(dāng)前目錄._chdir函數(shù)在內(nèi)部調(diào)用SetCurrentDirectory.但_chdir還會調(diào)用SetEnviromentVariable來添加或修改環(huán)境變量,從而使不同的驅(qū)動器的當(dāng)前目錄得以保留
如果一個父進(jìn)程創(chuàng)建了一個希望傳給子進(jìn)程的環(huán)境塊,子進(jìn)程的環(huán)境塊就不會自動繼承父進(jìn)程的當(dāng)前目錄,相反,子進(jìn)程的當(dāng)前目錄默認(rèn)為每個驅(qū)動器的根目錄.如果希望子進(jìn)程繼承父進(jìn)程的當(dāng)前目錄,父進(jìn)程就必須在生成子進(jìn)程之前,創(chuàng)建這些驅(qū)動器號環(huán)境變量,并把它們添加到環(huán)境變量塊中,父進(jìn)程通過調(diào)用GetFullPathName來獲取他的當(dāng)前目錄
七.系統(tǒng)版本
GetVersion
GetVersionEx-------OSVERSIONINFOEX
為了進(jìn)一步簡化編程,Windows Vista還提供了VerifyVersionInfo,它能比較主機(jī)系統(tǒng)的版本和應(yīng)用程序要求的版本
總結(jié)
- 上一篇: 蝉蜕多少钱一斤啊?
- 下一篇: 地下城与勇士求一个红眼的契约加点