MFC的規則DLL與擴展DLL


一.MFC規則DLL

    MFC規則DLL可以 在該dll內部使用MFC,但是與應用程序的接口不能是MFC的能夠被所有支持dll的編程語言所寫的應用程序使用,當然也包括使用MFC創建的應用程序。在這種動態鏈接庫中包含一個從CWinApp中繼承而來的類,DllMain函數也被隱藏在其中了。
   規則DLL包含倆類—— 靜態鏈接到MFC上和動態連接到MFC上靜態鏈接到MFC上的規則DLL與MFC靜態鏈接,將MFC的dll代碼直接生成在該.dll中, 在調用該dll時,使用的是該dll的資源句柄 ; 動態鏈接到MFC上的規則DLL可以和使用它的應用程序同時動態鏈接到MFC的dll和MFC的擴展dll上,此時, MFC使用主應用程序的資源句柄加載資源模板,這樣,如果主應用程序和dll中有相同的資源ID時,就出現了問題,此時需要進行模塊轉換,才能正確的家在資源。
     這里通過1.使用 AFX_MANAGE_STATE(AfxGetStaticModuleState())作為接口的第一條語句進行模塊狀態轉換; AFX_MOUDLE_STATE * AFXAPI AfxGetStaticModuleState(),該函數返回當前模塊狀態,AFX_MANAGE_STATE(AFX_MOUDLE_STATE * pMoudleState),該宏用於將pMoudleState設置為當前模塊狀態,當宏的作用域結束后,也就是離開pMoudleState所指向棧上對象的作用域時,AFX_MOUDLE_STATE的析構函數完成模塊狀態的恢復;
    2. AfxGetResourceHandle()//獲取程序當前正在使用的模塊句柄,AfxSetResourceHandle()//設置程序需要使用的模塊句柄,在接口函數開始時進行模塊狀態轉換, HINSTANCE old_hInstance=AfxGetResourceHandle(); AfxSetResourceHandle(當前dll的句柄,可以使用theApp.m_hInstance);后面是函數的其余部分,結尾處AfxSetResourceHandle(old_hInstance);將模塊狀態再次轉換過來;該方法可以用在dll中,也可以用在應用程序調用該dll函數之前之后;
二.MFC的擴展DLL
    MFC的擴展DLL的內涵是MFC的擴展,用戶使用MFC的擴展DLL就像使用MFC本身的DLL一樣,除了可以在MFC的擴展DLL內部使用MFC外,MFC的擴展DLL與應用程序的接口也可以是MFC, 一般使用MFC的擴展DLL來增強MFC的功能,使用vc++向導生成的MFC的擴展DLL會自動生成DllMain()函數。由MFC擴展的DLL導出的函數,變量和其他很相似, 對於導出類,應該在聲明類的前面加上AFX_EXT_CLASS。
在 DLL 的頭文件中,將 AFX_EXT_CLASS 關鍵字添加到類的聲明中,如下所示:
class AFX_EXT_CLASS CMyClass : public Cdocument {// <body of class>};
當定義了預處理 _AFXDLL 和 _AFXEXT 時,該宏被 MFC 定義為__declspec(dllexport)。 但當定義了 _AFXDLL 而未定義 _AFXEXT 時,該宏被定義為__declspec(dllimport)。定義后,預處理器符號 _AFXDLL 指示共享 MFC 版本正在由目標可執行文件(DLL 或應用程序)使用。當 _AFXDLL 和 _AFXEXT 都定義了時,這指示目標可執行文件是擴展 DLL。
 
本文轉自http://yanguohong0925.blog.163.com/blog/static/928698420104129560808/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM