1、應用程式的進入點
應用程式類型 進入點 嵌入可執行檔的啟動函數
-------------------------------------------------------------------------------
需要ANSI字元和字串的GUI應用程式 WinMain WinMainCRTStartup
需要Unicode字元和字串的GUI應用程式 wWinMain wWinMainCRTStartup
需要ANSI字元和字串的CUI應用程式 main mainCRTStartup
需要Unicode字元和字串的CUI應用程式 wmain wmainCRTStartup
(VC++)如果不為連結器指定/SUBSYSTEM序開關的時候,連結程式能夠自動確定應用程式應該串連到哪個
子系統:
當進行連結時,連結程式要查看代碼中存在4個函數(WinMain、wWinMain、main或wmain)中的哪一個。
然後確定可執行程式應該是哪一個子系統,並且確定可執行程式中應該嵌入哪個C/C++啟動函數。
這樣提供了最大的靈活性。
2、程式能夠使用的C/C++運行期全域變數(包含stdlib.h)
變數名 類型 說明
-------------------------------------------------------------------------------------------
--
_osver unsignedint 作業系統的測試版本。例如,Windows2000Beta3是測
試版本2031。因此_osver的值是2031
_winmajor unsignedint 採用十六進位標記法的Windows主要版本。對於Windows
2000來說,它的值是5
_winminor unsignedint 採用十六進位標記法的Windows次要版本。對於Windows
2000來說,它的值是0
_winver unsignedint (_winmajor<<8)+_winminor在命令列上傳遞的參數號
__argc unsignedint
__argv char** 帶有指向ANSI/Unicode字串的指標的__argc大小的數組
__wargv wchar_t** 每個數組項均指向一個命令列參數
_environ char** 指向ANSI/Unicode字串的指標的數組。每個數組項指向
一個環境字串
_wenviron wchar_t**
_pgmptr char* 正在啟動並執行程式的ANSI/Unicode全路徑和名字
_wpgmptrwchar_t*
3、DLL的記憶體基地址
調用GetModuleHandle並傳遞NULL值,就會返回進程的地址空間中可執行檔的基地址。因此,
即使通過包含在DLL中的代碼來調用(NULL),返回的值也是可執行檔的基地址,而不是
DLL檔案的基地址。
[註:]可以通過DllMain函數的第一個參數,要獲得DLL檔案的基地址。
3、關於CreateProcess
CreateProcess函數的lpCommandLine參數類型為LPTSTR。
這意味著CreateProcess期望你將傳遞一個非常量字串的地址。從內部來講,CreateProcess實際上要修
改你傳遞
給它的命令列字串。不過,在CreateProcess返回之前,它將該字串恢複為它的原始形式。
這個問題很重要,因為如果命令列字串不包含在檔案映象的唯讀部分中,就會出現違規訪問的問題(盡
管某些情況下可能不會出現問題)。
比如下面的代碼:
CreateProcess(NULL, TEXT("NOTEPAD"),...);
因為VC++在預設情況下是把常量字串"NOTEPAD"放入唯讀記憶體的。
(參看VC的/Gf /GF編譯開關)