下文僅轉載了一部分:
MFC擴展DLL與MFC規則DLL的相同點在于在兩種DLL的內部都可以使用MFC類庫,其不同點在于MFC擴展DLL與應用程序的接口可以是MFC的。MFC擴展DLL的含義在于它是MFC的擴展,其主要功能是實現從現有MFC庫類中派生出可重用的類。MFC擴展DLL使用MFC 動態鏈接庫版本,因此只有用共享MFC 版本生成的MFC 可執行文件(應用程序或規則DLL)才能使用MFC擴展DLL。
從前文可知,MFC規則DLL被MFC向導自動添加了一個CWinApp的對象,而MFC擴展DLL則不包含該對象,它只是被自動添加了DllMain 函數。對于MFC擴展DLL,開發人員必須在DLL的DllMain函數中添加初始化和結束代碼。
從下表我們可以看出三種DLL對DllMain入口函數的不同處理方式:
DLL類型 |
入口函數 |
非 MFC DLL |
編程者提供DllMain函數 |
MFC規則 DLL |
CWinApp對象的InitInstance 和 ExitInstance |
MFC擴展 DLL |
MFC DLL向導生成DllMain 函數 |
對于MFC擴展DLL,系統會自動在工程中添加如下表所示的宏,這些宏為DLL和應用程序的編寫提供了方便。像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA這樣的宏,在DLL和應用程序中將具有不同的定義,這取決于_AFXEXT宏是否被定義。這使得在DLL和應用程序中,使用統一的一個宏就可以表示出輸出和輸入的不同意思。在DLL中,表示輸出(因為_AFXEXT被定義,通常是在編譯器的標識參數中指定/D_AFXEXT);在應用程序中,則表示輸入(_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 |
轉自:
http://peirenlei.javaeye.com/blog/305113