Windows應用程式初始化過程

2021-09-08 08:42:26 字數 2104 閱讀 7707

windows 應用程式必須有乙個入口點函式,應用程式開始執行時,這個函式會被呼叫。c/c++開發人員可以使用以下兩種入口點函式:

int winapi _twinmain(

hinstance hinstance,

hinstance,

ptstr pszcmdline,

intncmdshow);

int_tmain(

intargc,

tchar *ar**,

tchar *envp);

具體的符號取決於我們是否要使用unicode字串。作業系統實際上不會呼叫我們寫的入口點函式,他會呼叫由c/c++執行庫實現並在鏈結時使用-entry:命令列選項來設定乙個c/c++執行時啟動函式。該函式將初始化c/c++執行庫,使我們能使用malloc和free之類的函式。它確保了在我們**開始執行前,我們宣告的任何全域性和靜態c++物件都被正確的構造。

所有的c/c++執行庫啟動函式所做的事情基本都是一樣的,區別在於他們要處理的是ansi字串,還是unicode字串。以及在初始化c執行庫之後,他們呼叫的是哪個入口點函式。visual c++自帶c執行庫的源**。可以在crtexe.c檔案中找到4個啟動函式的源**。這些啟動函式的用途簡單總結如下:

完成所有這些初始化工作後,c/c++啟動函式就會呼叫應用程式的入口點函式。如果我門寫了乙個_twinmain函式,而且定義了_unicode,其呼叫過程將如下所示:

getstartupinfo(&startupinfo);

int nmainretval=wwinmain((hinstance)&__imagebase,null,pszcommandlineunicode,

(startupinfo.dwflags & startf_useshowwindow) ? startupinfo.wshowwindow : sw_showdefault);

如果沒有定義_unicode,其呼叫過程將如下所示:

getstartupinfo(&startupinfo);

int nmainretval=winmain((hinstance)&__imagebase,null,pszcommandlineansi,

(startupinfo.dwflags & startf_useshowwindow) ? startupinfo.wshowwindow : sw_showdefault);

注意,_imagebase是乙個鏈結器定義的偽變數,表明可執行檔案被對映到應用程式記憶體的什麼位置。

如果我們寫了乙個_tmain函式,而且定義了_unicode,那麼其呼叫過程如下:

int nmainretval=wmain(argc,ar**,argp);

如果沒有定義_unicode,呼叫過程如下:

int nmainretval=main(argc,ar**,argp);

使用visual studio嚮導生成的應用程式時,cui應用程式的入口中沒有定義第三個引數(環境變數塊),如下所示:

int _tmain(int argc,tchar *ar**);

如果需要訪問程序的環境變數,只需將上面呼叫換成

int _tmain(int argc,tchar *ar**,tchar *env);

這個env引數指向乙個陣列,陣列中包含所有環境變數及其值,兩者用等號(=)分隔。

入口點函式返回後,啟動函式將呼叫c執行庫函式exit,向其傳遞返回值(nmainretval)。

exit函式執行以下任務:

呼叫_onexit函式呼叫所註冊的任何乙個函式。

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

在debug生成中,如果設定了_crtdbg_leak_check_df標誌,就通過呼叫_crtdumpmemoryleaks函式來生成記憶體洩露報告。

呼叫作業系統的exitprocess函式,向其傳入nmainretval。這會導致作業系統"殺死"我們的程序,並設定它的退出碼。

注意,為了安全起見,microsoft並不贊成使用所有這些變數,因為使用了這些變數的**可能會在c執行庫初始化這些變數之前開始執行。我們應該直接呼叫對應的windows api函式。

BLE應用程式初始化

應用程式初始化分為兩個階段 其中,peripheral osal呼叫 bleperipheral init 函式,這一初始化函式設定gap任務配置檔案引數 gap特性 gap繫結管理引數 gatt配置檔案引數,通過設定乙個作業系統虛擬層的sbp start devic evt事件來觸發第二階段初始化...

遭遇應用程式正常初始化失敗

案例一 2009.11月某日的案例 stereocamera專案 某個全域性物件初始化的時候,memset越界導致堆錯誤導致的 很奇怪的問題。周五臨下班時,發stereocamera.dll的版本。從vss上down下最新的 編譯,連線,執行,應用程式正常初始化失敗!faint!換了放到pc目錄下,...

ArcMap正在初始化應用程式狀態

問題描述 昨天還能正常開啟arcmap,只是會慢一些,今天開啟就會一直處於初始化階段 系統win10,arcgis版本10.2 問題介面 最終解決的方式 解除安裝arcgis軟體,重新安裝,大概需要1個小時 嘗試過的解決方法 這個路徑下未找到這個檔案 2 將default.gdb的父資料夾arcgi...