寫的很隨意,這是自己在學習及除錯過程的隨筆吧,希望能給大家帶來一些益處。
很多人對於mfc的入口點及初始化很迷茫,從而導致學習mfc的畏懼心理(當初和我一起學習的3~4個人基本都放棄了),但願這篇文章給你以啟示。
很多人在大學的時候,都被教會程式的入口點是main()函式。但是在main()函式之前有什麼操作呢?
這個問題涉及到了程式的載入流程。程式的載入流程大致如下:
載入pe檔案的.idata段---->載入pe檔案的.data段---->載入**.text段---->然後執行程式。
.idata是pe檔案的引入段。pe檔案對外部符號的呼叫在這裡做中轉。
.date是pe檔案資料段(存放全域性的變數)。
.test是pe檔案的**段。
而對於c++程式來說,如果定義了全域性的物件,則要呼叫該物件類的建構函式。
該物件為全域性物件,那麼該物件將在.data中定義,因此按照載入流程,會在進入入口點之前先呼叫該物件類的建構函式。
下面來分析下mfc的入口點。
我使用vc6.0新建了乙個單文件的工程:my
按照上邊的分析,會呼叫該物件的建構函式:
// initialize cwinthread state
afx_module_state* pmodulestate = _afx_cmdtarget_getstate();
afx_module_thread_state* pthreadstate = pmodulestate->m_thread;
assert(afxgetthread() == null);
pthreadstate->m_pcurrentwinthread = this;
assert(afxgetthread() == this);
m_hthread = ::getcurrentthread();
m_nthreadid = ::getcurrentthreadid();
// in non-running state until winmain
.........
}只看其中重要的一部分吧。
那麼_afx_cmdtarget_getstate()是怎麼回事呢?有以下內容可知
#define _afx_cmdtarget_getstate() (afxgetmodulestate())
那麼afxgetmodulestate()呢?以下是其定義
_afxthreadstate 是乙個全域性的變數,由來如下:
在 afxstat_.h 中 extern_thread_local(_afx_thread_state, _afxthreadstate)
#define thread_local(class_name, ident_name) /
afx_datadef cthreadlocalident_name; //這裡便是 _afxthreadstate 被定義的地方。
#define extern_thread_local(class_name, ident_name) /
extern afx_data thread_local(class_name, ident_name)
在afxtls_.h中定義
template
class cthreadlocal : public cthreadlocalobject
為了加深你的理解,你可以繼續往下追 cthreadlocal 和 cthreadlocalobject 的定義,也比較的簡單了,就是new了乙個物件。
到了這裡就要思考乙個問題了:那麼我們自己定義的物件和程式的入口點有什麼關係呢?
這兩條語句就是我們應用程式和mfc的入口點 afxwinmain(hinstance, hprevinstance, lpcmdline, ncmdshow) 的關鍵所在了。
看到這裡應該明白了吧。
本人也是剛參加工作,在各方面還有很多欠缺,希望沒有給你帶來誤導就好。
OAF VO初始化分析
目錄 第一部分 插入新行前的初始化 1 僅插入型vo的初始化 2 插入查詢vo的初始化 第二部分 執行查詢前的初始化 1 避免無條件查詢 2 避免多餘的查詢 正文第一部分 插入新行前的初始化 在處理插入初始化之前,我們必須確定一件事情,就是當前我們要處理的這個vo,它是只用作插入操作呢,還是即用作插...
OAF VO初始化分析
目錄 第一部分 插入新行前的初始化 1 僅插入型vo的初始化 2 插入查詢vo的初始化 第二部分 執行查詢前的初始化 1 避免無條件查詢 2 避免多餘的查詢 正文 第一部分 插入新行前的初始化 在處理插入初始化之前,我們必須確定一件事情,就是當前我們要處理的這個vo,它是只用作插入操作呢,還是即用作...
stm32時鐘初始化分析
之前在系統應用中都是直接用的void systeminit void 函式進行系統時鐘的初始化,從來沒有考慮怎樣進行時鐘初始化的細節,但是突然硬體時鐘無法起振了,所以才考慮利用系統內部,stm32內部提供了乙個8m的內部時鐘,不是很準確,但是可以用。如果還是按照呼叫系統時鐘的方法,程式執行起來會很慢...