資源描述:
《應(yīng)用程序的啟動(dòng)過(guò)程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、應(yīng)用程序都會(huì)有一個(gè)入口函數(shù),它在程序運(yùn)行時(shí)才被調(diào)用。因此,創(chuàng)建控制應(yīng)用程序時(shí),此入口函數(shù)將會(huì)是main。??intmain(intargc,char*argv[]);操作系統(tǒng)實(shí)際上不是真調(diào)用main函數(shù),而是去調(diào)用了C/C++運(yùn)行期啟動(dòng)函數(shù),此函數(shù)會(huì)初始化C/C++運(yùn)行期庫(kù)。因此,在程序中可以調(diào)用malloc和free之類(lèi)函數(shù)。???如果,我們?cè)诳刂婆_(tái)上省去了main函數(shù),那么連接器將返回一個(gè)"unresolvedexternalsymbol"錯(cuò)誤。???Win32程序啟動(dòng)過(guò)程,實(shí)際上是線程去調(diào)用一個(gè)CreateProcess函數(shù)
2、的時(shí)候,系統(tǒng)會(huì)創(chuàng)建一個(gè)進(jìn)程內(nèi)核對(duì)象,其使用計(jì)數(shù)被初始化為1.此進(jìn)程內(nèi)核對(duì)象不是進(jìn)程本身,僅僅是一個(gè)系統(tǒng)用來(lái)管理這個(gè)進(jìn)程的小的數(shù)據(jù)結(jié)構(gòu)。系統(tǒng)然后為新的進(jìn)程創(chuàng)建一個(gè)虛擬地址空間,加載應(yīng)用程序運(yùn)行時(shí)所需要的代碼和數(shù)據(jù)。???系統(tǒng)接著會(huì)為新進(jìn)程創(chuàng)建一個(gè)主線程,這個(gè)主線程通過(guò)執(zhí)行C/C++運(yùn)行期啟動(dòng)代碼開(kāi)始運(yùn)行,C/C++運(yùn)行期啟動(dòng)代碼又會(huì)調(diào)用main函數(shù)。如果系統(tǒng)能成功創(chuàng)建新的進(jìn)程和進(jìn)程的主線程,CreateProcess函數(shù)會(huì)返回TRUE,否則返回FALSE。????一般將創(chuàng)建進(jìn)程稱為父進(jìn)程,被創(chuàng)建的進(jìn)程稱為子進(jìn)程。系統(tǒng)在創(chuàng)建新的進(jìn)程時(shí)
3、會(huì)為新進(jìn)程指定一個(gè)STARTUPINFO類(lèi)型的變量,這個(gè)結(jié)構(gòu)保護(hù)了父進(jìn)程傳遞給子進(jìn)程的一些顯示信息。對(duì)圖形界面應(yīng)用程序來(lái)說(shuō),這些信息將影響新進(jìn)程中主線程的主窗口顯示:對(duì)控制臺(tái)應(yīng)用程序來(lái)說(shuō),如果有一個(gè)新的控制窗口被創(chuàng)建的話,這些信息將影響這個(gè)控制臺(tái)窗口。STARTUPINFO結(jié)構(gòu)定義如下。??????typedefstruct{?????????????DWORD???cb;???????????????//本結(jié)構(gòu)的長(zhǎng)度,總是應(yīng)該被設(shè)為sizeof(STARTUPINFO)?????????????LPSTR???????lpRes
4、erved;??//保留(Reserve)字段,即程序不使用這個(gè)參數(shù)?????????????LPSTR???????lpDesktop;???//指定桌面名稱?????????????LPSTR???????lpTitle;??????????//控制臺(tái)應(yīng)用程序使用,指定控制臺(tái)窗口標(biāo)題?????????????DWORD???dwX;?????????????//?????????????DWORD???dwY;?????????????//?????????????DWORD???dwXSize;???????????????
5、?????DWORD???dwYSize;?????????????DWORD???dwXCountChars;??//控制臺(tái)程序使用,指定控制臺(tái)窗口的行數(shù)?????????????DWORD???dwYCountChars;?????????????DWORD???dwFillAttribute;?????//控制臺(tái)程序使用,指定控制臺(tái)窗口的背景色?????????????DWORD???dwFlags;??????????//標(biāo)志。它的值決定了STARTUPINFO結(jié)構(gòu)中哪些成員的值是有效的。?????????????WORD
6、??????wShowWindow;??//窗口的顯示方式?????????????WORD??????cbReserved2;?????????????LPBYTE??????lpReserved2;?????????????HANDLE????hStdInput;??????//控制臺(tái)程序使用,幾個(gè)標(biāo)準(zhǔn)句柄?????????????HANDLE????hStdOutput;?????????????HANDLE????hStdError;???????}STARTUPINFO,*LPSTARTUPINFO;?????????一
7、個(gè)進(jìn)程可以調(diào)用GetStartupInfo函數(shù)來(lái)取得父進(jìn)程創(chuàng)建自己時(shí)使用的STARTUPINFO結(jié)構(gòu)。??事實(shí)上,Windows系統(tǒng)就是通過(guò)調(diào)用這個(gè)函數(shù)來(lái)取得當(dāng)前進(jìn)程的創(chuàng)建信息,以便對(duì)新進(jìn)程中主窗口的屬性設(shè)置默認(rèn)值。??函數(shù)定義如下。??VOIDGetStrtupInfo(LPSTARTUPINFOlpStartupInfo);???//取得當(dāng)前進(jìn)程被創(chuàng)建時(shí)指定的STARTUPINFO結(jié)構(gòu)。???定義一個(gè)STARTUPINFO結(jié)構(gòu)的對(duì)象以后,總要在使用此對(duì)象之前將對(duì)象的cb成員初始化為STARTUPINFO結(jié)構(gòu)大小。???如下所示
8、:???STARTUPINFOsi=[sizeof(si)];?????//將cb成員初始化為sizeof(si),其他成員初始化為0???::GetStrartupInfo(&si);????初始化cb成員這一步是必須的。因?yàn)殡S著WIndows版