windows進入函式與啟動函式

2021-09-09 08:35:58 字數 2374 閱讀 5542

c/c++ 執行期啟動函式

作業系統實際上並不呼叫你編寫的進入點函式。它呼叫的是 c / c + +執行期啟動函式。該函 數負責對c / c + +執行期庫進行初始化,這樣,就可以呼叫malloc和free之類的函式。它還能夠確 保已經宣告的任何全域性物件和靜態c + +物件能夠在**執行以前正確地建立。下面說明源** 中可以實現哪個進入點以及何時使用該進入點

應用程式型別

進入點嵌入可執行檔案的啟動函式

需要ansi字元和字串的gui應用程式

winmain

winmaincrtstartup

需要unicode字元和字串的gui應用程式

wwinmain

wwinmaincrtstartup

需要ansi字元和字串的cui應用程式

main

maincrtstartup

需要unicode字元和字串的cui應用程式

wmain

wmaincrtstratup

int winapi winmain(

hinstance hin***e,

hinstance,

pstr pszcmdline,

int ncmdshow);

其中hin***e實際值是系統將可執行檔案的映象載入到程序的位址空間時 使用的基本位址空間。可執行檔案的映像載入到的基位址是由鏈結程式決定的,不同的鏈結程式可以使用不同的預設基位址,vc++鏈結程式使用預設基位址為0x00400000,因為這是在執行windows 98時可執行檔案的映象可以載入的最低位址,可以使用microsoft的鏈結程式中的 /base:address鏈結程式開關改變該位址

int winapi wwinmain(

hinstance hin***e,

hinstance,

pstr pszcmdline,

int ncmdshow);

int __cdecl main(

int argc,

char *ar**,

char *envp);

int __cdecl wmain(

int argc,

char *ar**,

char *envp);

鏈結程式負責在它連線可執行檔案時選擇相應的 c / c + +執行期啟動函式。如果設定了 /subsystem: windows鏈結程式開關,那麼該鏈結程式期望找到乙個winmain或wwinmain 函式。如果這兩個函式都不存在,鏈結程式便返回乙個「未轉換的外部符號」的錯誤訊息。否 則,它可以分別選擇winmaincrtstartup函式或wwinmaincrtstartup函式。 同樣,如果設定了/subsystem: console鏈結程式開關,那麼該鏈結程式便期望找到main或wmain函式,並且可以分別選擇maincrtstartup函式或wmaincrtstartup函式。同樣, 如果main或wmain都不存在,那麼鏈結程式返回一條「未轉換外部符號」的訊息。

但是,我們可以從應用程式中全部刪除/subsystem鏈結程 序開關。當這樣做的時候,鏈結程式能夠自動確定應用程式應該連線到哪個子系統。當進行鏈 接時,鏈結程式要檢視**中存在4個函式(winmain、wwinmain、main或wmain)中的哪一 個。然後確定可執行程式應該是哪乙個子系統,並且確定可執行程式中應該嵌入哪個 c / c + +啟 動函式。

getstartupinfo(&startupinfo);

int nmainretval = wwinmain(getmoudlehandle(null),null,pazcommandlineunicode,(startupinfo.dwflags & startf_useshowwindow) ? startupinfo.wshowwindow : sw_showdefault);

getstartupinfo(&startupinfo);

int nmainretval = winmain(getmoudlehandle(null),null,pazcommandlineansi,(startupinfo.dwflags & startf_useshowwindow) ? startupinfo.wshowwindow : sw_showdefault);

int nmainretval = wmain(__argc, __war**, __wenviron);
int nmainretval = main(__argc, __ar**, __environ)
當進入點函式返回時,啟動函式便呼叫c執行期的exit函式,將返回值(nmainretval)傳遞給它。exit該函式功能如下:

TextOutA函式與TextOutW函式

這仍然是在學習字元編碼的時候引出來的。原意是感覺字元編碼既然這麼普遍地存在,那麼作業系統又是如何做的呢?所以想到要除錯一下textouta函式,看看它輸出文字的時候是怎樣對付字元編碼問題的。最後的結果是 textouta實際上是封裝了乙個另外的函式呼叫。textouta的流程大概是這個樣子 bool...

sort函式用法與stable sort函式

標頭檔案 include algorithm using namespace std 語法 sort start,end,cmp 注意 第三個引數cmp公升序情況下可以不寫,降序情況需要多呼叫乙個函式 例如 對a 10 陣列公升序排列 include include using namespace ...

雙啟動Kali與Windows

在windows安裝的同時安裝kali非常有用。但是,您需要在設定過程中謹慎行事。首先,確保您已備份windows安裝上的所有重要資料。由於您將修改硬碟驅動器,因此您需要將此備份儲存在外部 上。完成備份後,我們建議您仔細閱讀kali linux硬碟安裝,這解釋了基本kali安裝的正常過程。在我們的示...