windows下exe程式的啟動過程

2021-06-28 23:56:32 字數 2515 閱讀 8835

執行乙個程式,必然就產生乙個程序(process)。最直接的程式執行方式就是在shell (如

win95 的檔案總管或windows 3.x 的檔案管理員)中以滑鼠雙擊某乙個可執行檔案圖示

createprocess

啟用的。

讓我們看看整個流程:

1. shell 呼叫

createprocess 啟用。

shell即命令直譯器,是作業系統引導時即載入的乙個系統程序,在windows任務管理器裡面可以看到乙個名為」explorer.exe」的程序,就是它了。

2. 系統產生乙個「

程序核心物件

」,計數值為1。

3. 系統為此程序建立乙個4gb 位址空間。

所需的動態聯結函式庫(dlls)。載入器如何知道要載入哪些dlls 呢?它

們被記錄在可執行檔案(pe 檔案格式)的

.idata section

中。5. 系統為此程序建立乙個執行執行緒,稱為

主執行執行緒

(primary thread)。執行執行緒才是

cpu 時間的分配物件。

6. 系統呼叫c runtime 函式庫的

startup code

。(c/c++ run-timestartupfunction。)

c/c++執行時庫有四個版本的啟動函式,他們分別對應不同型別的應用程式。比如,需要ansi字元和字串的gui應用程式的啟動函式是winmaincrtstartup,其對應的進入點函式是winmain,需要unicode字元和字串的gui應用程式的啟動函式是wwinmaincrtstartup,其對應

的進入點函式是wwinmain,而需要ansi字元和字串的cui應用程式(如控制台console程式)的應用程式的啟動函式是maincrtstartup,對應的入口點函式為main;需要unicode字元和字串的cui應用程式(如控制台console程式)的應用程式的啟動函式為wmaincrtstartup,對應的入口點函式為wmain;

啟動函式的功能可概括如下:

l         檢索指向新程序的完整命令列的指標

l         檢索指向新程序的環境變數的指標

l         對c/c++ run time's global variables進行初始化。如果包含了stdlib.h標頭檔案,你的**就能訪問這些變數。詳見下表:

l         對c執行期記憶體分配函式(mallco和calloc)以及low-level input/output routines使用的heap(堆)進行初始化

l         為所有的全域性和靜態c++類物件呼叫建構函式

當上述這些初始化操作完成後,c/c++ run-time startup function就呼叫應用程式的進入點函式。

>

winmain

函式。

如果編寫了乙個winmain函式,它將以如下的形式被呼叫

getstartupinfo( &startupinfo );

int nmainretval = winmain( getmodulehandle(null), null, pszcommandlineansi,

(startupinfo.dwflags & startf_useshowwindow)

? startupinfo.wshowwindow : sw_showdefault );

10. 回到startup code。

當進入點函式返回時,啟動函式便呼叫c執行期的exit函式,將返回值(nmainretval)傳遞給它。

exit函式負責如下操作:

l呼叫由_onexit函式的呼叫而註冊的任何函式

l         為所有全域性的和靜態的c++類物件呼叫析構函式

l呼叫作業系統的exitprocess函式,將nmainretval傳遞給它。這使得作業系統能夠撤銷此程序並設定它的exit code(該**儲存在該程序對應的核心物件中)。

11. 回到系統,系統呼叫exitprocess 結束程序。

執行庫在呼叫使用者程式的main或winmain函式之前,進行了一些初始化工作。初始化完成後,接著才呼叫了我們自己編寫的main或winmain函式。這樣, c/c++執行時庫和應用程式就正常地工作起來了。

當使用者程式的main或winmain函式執行結束後,返回值被當做引數傳入exit函式中,有exit完成程式執行的收尾工作,包括析構c++全域性和靜態類,呼叫作業系統的exitprocess函式,告知程序退出等。

windows下QT打包exe程式

本來打算自己做一遍 然後一步步的寫下來的,但是bug不斷,好傢伙,直接變成了和你們一樣開始在csdn上遊蕩開始找答案了,終於,皇天不負有心人,終於找到了 說的好像是自己想出來解決辦法一樣,tui,男人,大概有3種針對不同的情況的解決辦法,總結 1 出現0xc000007b 應用程式無法正常啟動 其根...

windows下python程式開機自啟動

開機自啟動有三種方案 1 把你的python程式隨便放到c盤的乙個目錄下,然後把它的快捷方式放到windows開機自啟動的資料夾 資料夾的位置在開始選單裡有 2 python打包成exe,放到啟動資料夾 3 start.c打包成exe,讓start.c呼叫你的python程式 start.c inc...

windows 下 MongoDB 的安裝與啟動

我的安裝目錄是d mongodb,下面的引數設定以這個為準,你們改為自已對應的即可 我的電腦 右鍵 屬性 高階系統設定 環境變數 使用者變數或系統變數中找到 path 雙擊 在變數值的最後加上 d mongodb bin 別漏了分號,分號用於分隔上乙個變數這兩個資料夾可以建立在任意位置,不一定要在安...