複製鏈接
請複製以下鏈接發送給好友

MFC

(微軟)

鎖定
微軟基礎類庫(英語:Microsoft Foundation Classes,簡稱MFC)是一個微軟公司提供的類庫(class libraries),以C++類的形式封裝了Windows API,並且包含一個(也是微軟產品的唯一一個)應用程序框架,以減少應用程序開發人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內建控件和組件的封裝類。
中文名
MFC
外文名
Microsoft Foundation Classes
性    質
微軟公司提供的類庫
領    域
計算機

MFC特性

Visual C++包含MFC應用程序嚮導,可用於兼容MFC的應用程序。在ATL程序中也可以手動添加MFC支持。在嚮導中有各種選項以定製生成的程序的功能,例如界面風格、語種、數據庫開發支持、打印支持、自動化支持、ActiveX支持、網絡支持、基於HTML的幫助文檔支持等等。
COM開發方面,相對於ATL來説,MFC的組件比較大,代碼不夠短小精悍,但是支持的功能也比較多,例如有對ActiveX Document的封裝類。
在界面開發方面,MFC提供對消息循環的封裝,使用消息映射來避免虛函數的開銷。MFC也提供常用Windows通用控件的封裝類。
MFC擴展DLL的接口使得MFC程序可以直接調用MFC擴展DLL中的MFC類。MFC也支持在標準DLL中被使用。 [1] 

MFC發展

MFC是在1992年隨微軟的Microsoft C/C++ 7.0編譯器發佈的,用於面向16位Windows的軟件開發。起初,MFC是作為一個應用程序框架開發的,所以定名為Application Framework eXtensions(AFX)。
隨着Visual BasicVisual Studio .NET的發佈,曾經一度被微軟重點推薦的MFC被Visual Basic .NETC#Windows Forms搶走了不少市場份額,但是MFC繼續在非託管軟件開發中佔據重要地位。在託管開發方面,MFC中也包括對Windows Forms和託管/非託管互操作的封裝。微軟在Windows VistaWindows 7發佈之後在MFC中增加了對新的Windows API支持。 [2] 

MFCMFC的優點

MFC的主要優點是可以用面向對象的方法來調用Windows API,以及能夠更加便捷地開發應用程序。MFC將很多應用程序開發中常用的功能自動化,並且提供了文檔框架視圖結構和活動文檔這樣的便於自定義的應用程序框架。同時,在Visual C++內部也內建了很多對MFC的例如類嚮導這樣的支持以減少軟件開發的時間,使用類嚮導可以快速生成Hello World程序。 [2] 

MFCMFC的缺點

雖然MFC的源代碼對用户是完全開放的,但是MFC的一些封裝過程過於複雜,以致於新用户很難迅速掌握MFC的應用程序框架,以及在調試中定位問題的位置。同時,很多MFC對象不是線程安全的,致使在跨線程訪問MFC對象時需要編寫額外的代碼。另外,MFC的很多類依賴於應用程序嚮導生成的代碼,使得在使用Visual C++中其他類型的應用程序嚮導生成的工程中添加MFC支持的難度大大增加。 [2] 

MFC第三方支持

很多商用類庫在MFC的基礎上進一步實現了皮膚、漸變風格、多頂層窗口程序、屬性列表等較受歡迎的功能;同時,在C++在線社區中,很大一部分開放的源代碼也是基於MFC的。 [1] 

MFC支持MFC的DLL開發

使用Visual C++可以開發3種DLL:
  • 不使用MFC的DLL;
  • 使用MFC的規則的DLL:輸出的函數不涉及MFC,因此可以被支持/不支持MFC的應用程序調用該DLL
    • 動態鏈接到MFC(Regular DLLs statically linked to MFC)。
    • 靜態鏈接到MFC(Regular DLLs dynamically linked to MFC)
  • 使用MFC的擴展DLL(Extension DLLs),只能動態鏈接到MFC:輸出的函數涉及MFC,也可以輸出基於MFC的派生類。
由於DLL與調用它的應用程序都可以有自己的MFC全局數據與句柄映射(handle mapping),如果句柄值相同,則默認使用應用程序的映射到的資源。為了不互相干擾,允許DLL內部使用自己的資源,必須在DLL函數的入口處把資源模塊句柄從默認的應用程序切換為該DLL。辦法是:
  1. 在該DLL的每個輸出的函數的最開始之處調用AFX_MANAGE_STATE(AfxGetStaticModuleState( ))。函數AfxGetStaticModuleState的功能是在運行棧上創建一個AFX_MODULE_STATE類的實例,對其進行設置,函數返回值為AFX_MODULE_STATE的指針。AFX_MODULE_STATE類利用其構造函數和析構函數進行模塊狀態現場存儲及恢復。
  2. 使用AfxGetResourceHandle();獲取當前資源模塊句柄。使用AfxSetResourceHandle(HINSTANCE xxx); 設置程序要使用的資源模塊句柄。 [1] 
參考資料
  • 1.    MSDN:Module States of a Regular DLL Dynamically Linked to MFC
  • 2.    Prosise J. Programming Windows with MFC[J]. 1999.