MFC入口點及初始化分析

2021-05-25 10:47:04 字數 1929 閱讀 4230

寫的很隨意,這是自己在學習及除錯過程的隨筆吧,希望能給大家帶來一些益處。

很多人對於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的內部時鐘,不是很準確,但是可以用。如果還是按照呼叫系統時鐘的方法,程式執行起來會很慢...