下文僅轉(zhuǎn)載了一部分:
MFC擴展DLL與MFC規(guī)則DLL的相同點在于在兩種DLL的內(nèi)部都可以使用MFC類庫,其不同點在于MFC擴展DLL與應(yīng)用程序的接口可以是MFC的。MFC擴展DLL的含義在于它是MFC的擴展,其主要功能是實現(xiàn)從現(xiàn)有MFC庫類中派生出可重用的類。MFC擴展DLL使用MFC 動態(tài)鏈接庫版本,因此只有用共享MFC 版本生成的MFC 可執(zhí)行文件(應(yīng)用程序或規(guī)則DLL)才能使用MFC擴展DLL。
從下表我們可以看出三種DLL對DllMain入口函數(shù)的不同處理方式:
對于MFC擴展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被定義,通常是在編譯器的標識參數(shù)中指定/D_AFXEXT);在應(yīng)用程序中,則表示輸入(_AFXEXT沒有定義)。
轉(zhuǎn)自:http://peirenlei.javaeye.com/blog/305113
MFC擴展DLL與MFC規(guī)則DLL的相同點在于在兩種DLL的內(nèi)部都可以使用MFC類庫,其不同點在于MFC擴展DLL與應(yīng)用程序的接口可以是MFC的。MFC擴展DLL的含義在于它是MFC的擴展,其主要功能是實現(xiàn)從現(xiàn)有MFC庫類中派生出可重用的類。MFC擴展DLL使用MFC 動態(tài)鏈接庫版本,因此只有用共享MFC 版本生成的MFC 可執(zhí)行文件(應(yīng)用程序或規(guī)則DLL)才能使用MFC擴展DLL。
從前文可知,MFC規(guī)則DLL被MFC向?qū)ё詣犹砑恿艘粋€CWinApp的對象,而MFC擴展DLL則不包含該對象,它只是被自動添加了DllMain 函數(shù)。對于MFC擴展DLL,開發(fā)人員必須在DLL的DllMain函數(shù)中添加初始化和結(jié)束代碼。
從下表我們可以看出三種DLL對DllMain入口函數(shù)的不同處理方式:
DLL類型 | 入口函數(shù) |
非 MFC DLL | 編程者提供DllMain函數(shù) |
MFC規(guī)則 DLL | CWinApp對象的InitInstance 和 ExitInstance |
MFC擴展 DLL | MFC DLL向?qū)蒁llMain 函數(shù) |
對于MFC擴展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被定義,通常是在編譯器的標識參數(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