標籤:style class blog http ext color
一.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/