從今天開始,重新學習一些細節性質的東西
?
一.在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,它能比較主機系統的版本和應用程序要求的版本