MFC資源切換

2021-08-26 07:39:27 字數 1615 閱讀 3202

先看乙個例子:

1、建立乙個動態鏈結到mfc dll的規則dll,其內部包含乙個對話方塊資源。指定該對話方塊id如下:

#define idd_dll_dialog 2000

2、建立乙個基於對話方塊的mfc應用程式,它包含兩個對話方塊資源,idd_ui_dialog和idd_exe_dialog。並將後者的id指定如下:

#define idd_exe_dialog 2000

其中前者是這個應用程式的使用者介面,單擊上面的按鈕,將彈出乙個對話方塊。部分**如下:

// in dll void cdll::showdlg(void) // in exe void cexe::onbuttonclick()

3、單擊按鈕,彈出的不是期望的dll中的對話方塊idd_dll_dialog,而是應用程式中的對話方塊idd_exe_dialog。

解釋:

1、應用程式程序本身及其呼叫的每個dll模組都具有乙個全域性唯一的hinstance控制代碼,它們代表了exe或dll模組在程序虛擬空間中的起始位址。(程序本身的模組控制代碼一般為0x400000,而dll模組的預設控制代碼為0x10000000。如果程式同時載入了多個dll,則每個dll模組都會有不同的hinstance。應用程式在載入dll時對其進行了重定位)。

2、共享mfc dll(或mfc擴充套件dll)的規則dll涉及到hinstance控制代碼問題,hinstance控制代碼對於載入資源特別重要。exe和dll都有其自己的資源,而且這些資源的id可能重複,如果應用程式與規則dll共享mfc dll(或mfc擴充套件dll),那麼將總是預設使用exe的資源。

3、因此應用程式需要通過資源模組的切換來找到正確的資源。如果應用程式需要來自於dll的資源,就應將資源模組控制代碼指定為dll的模組控制代碼;如果需要exe檔案中包含的資源,就應將資源模組控制代碼指定為exe的模組控制代碼。

解決辦法:

1、在dll中改進:

方法1。

// in dll void cdll::showdlg(void)

注:afx_manage_state(afxgetstaticmodulestate());一定是作為介面函式的第一條語句。

其功能是在棧上(這意味著其作用域是區域性的)建立乙個afx_module_state類的例項,並將其指 針pmodulestate返回。

afx_module_state類利用其建構函式和析構函式進行儲存模組狀態現場及恢復現場的工作。

該巨集用於將pmodulestate設定為當前的有效模組狀態。當離開該巨集的作用域時(也就離開了pmodulestate所指棧上物件的作用域),先前的模組狀態將由類afx_module_state的析構函式恢復。(即自動恢復)

注:afxgetresourcehandle:獲取當前資源模組控制代碼;afxsetresourcehandle:設定程式目前要使用的資源模組控制代碼。

同方法1比較,方法2能夠靈活地設定程式的資源模組控制代碼,而方法1則只能在dll介面函式退出的時候才會恢復模組控制代碼。

2、在應用程式中改進:

// in exe void cexe::onbuttonclick()

注:使用狀態切換的情況:當dll匯出函式包含mfc資源、類或者需要建立視窗時。

MFC DLL資源動態切換

在mfc使用過程中,遇到dll資源與主exe資源衝突問題。出現這樣的bug,一時無從下手。報錯位置在核心 中dlgcore.cpp。bool afxapi afxcheckdialogtemplate lpctstr lpszresource,bool binvisiblechild return ...

MFC使用插入的資源

1.findresource 用來在乙個指定的模組中定位所指定的資源 2.hrsrc findresource 3.hmodule hmodule,包含所需資源的模組控制代碼,如果是程式本身,可以置為null 4.lpctstr lpname,可以是資源名稱或資源id 5.lpctstr lptyp...

MFC載入純資源DLL

不同語言的資源放到不同的dll中,在執行時載入特定語言的dll。一 製作純資源dll 新建win32工程,選擇動態鏈結庫。在工程選項裡,鏈結器 高階 無入口程式 是 noentry 然後在資源裡面新增想要的各種資源。最後新增dll入口程式 includeextern c bool winapi dl...