下文僅轉(zhuǎn)載了一部分:
MFC擴(kuò)展DLL與MFC規(guī)則DLL的相同點(diǎn)在于在兩種DLL的內(nèi)部都可以使用MFC類庫,其不同點(diǎn)在于MFC擴(kuò)展DLL與應(yīng)用程序的接口可以是MFC的。MFC擴(kuò)展DLL的含義在于它是MFC的擴(kuò)展,其主要功能是實現(xiàn)從現(xiàn)有MFC庫類中派生出可重用的類。MFC擴(kuò)展DLL使用MFC 動態(tài)鏈接庫版本,因此只有用共享MFC 版本生成的MFC 可執(zhí)行文件(應(yīng)用程序或規(guī)則DLL)才能使用MFC擴(kuò)展DLL。
從前文可知,MFC規(guī)則DLL被MFC向?qū)ё詣犹砑恿艘粋€CWinApp的對象,而MFC擴(kuò)展DLL則不包含該對象,它只是被自動添加了DllMain 函數(shù)。對于MFC擴(kuò)展DLL,開發(fā)人員必須在DLL的DllMain函數(shù)中添加初始化和結(jié)束代碼。
從下表我們可以看出三種DLL對DllMain入口函數(shù)的不同處理方式:
DLL類型 |
入口函數(shù) |
非 MFC DLL |
編程者提供DllMain函數(shù) |
MFC規(guī)則 DLL |
CWinApp對象的InitInstance 和 ExitInstance |
MFC擴(kuò)展 DLL |
MFC DLL向?qū)蒁llMain 函數(shù) |
對于MFC擴(kuò)展DLL,系統(tǒng)會自動在工程中添加如下表所示的宏,這些宏為DLL和應(yīng)用程序的編寫提供了方便。像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA這樣的宏,在DLL和應(yīng)用程序中將具有不同的定義,這取決于_AFXEXT宏是否被定義。這使得在DLL和應(yīng)用程序中,使用統(tǒng)一的一個宏就可以表示出輸出和輸入的不同意思。在DLL中,表示輸出(因為_AFXEXT被定義,通常是在編譯器的標(biāo)識參數(shù)中指定/D_AFXEXT);在應(yīng)用程序中,則表示輸入(_AFXEXT沒有定義)。
宏 |
定義 |
AFX_CLASS_IMPORT |
__declspec(dllexport) |
AFX_API_IMPORT |
__declspec(dllexport) |
AFX_DATA_IMPORT |
__declspec(dllexport) |
AFX_CLASS_EXPORT |
__declspec(dllexport) |
AFX_API_EXPORT |
__declspec(dllexport) |
AFX_DATA_EXPORT |
__declspec(dllexport) |
AFX_EXT_CLASS |
#ifdef _AFXEXT AFX_CLASS_EXPORT #else AFX_CLASS_IMPORT |
AFX_EXT_API |
#ifdef _AFXEXT AFX_API_EXPORT #else AFX_API_IMPORT |
AFX_EXT_DATA |
#ifdef _AFXEXT AFX_DATA_EXPORT #else AFX_DATA_IMPORT |
轉(zhuǎn)自:
http://peirenlei.javaeye.com/blog/305113