exe呼叫dll中的對話方塊防資源衝突解決之道
阿新 • • 發佈:2019-01-24
在編寫MFC應用程式時,有時我們希望將對話方塊封裝在dll動態庫中。但當exe呼叫dll中對話方塊時:
程式首先檢測exe中的資源如果存在對應的對話方塊ID,那麼dll中的對話方塊將採用exe中的資源進行建立生成對話方塊,這樣就違背了我們的意願。
1)下面情況可以正確呼叫dll工程中對話方塊:
在exe工程資源中對話方塊ID為
#define IDD_EXE_DIALOG 5000
在dll工程中對話方塊ID為
#define IDD_DLL_DIALOG 5001
2)下面情況可以錯誤呼叫了EXE工程中對話方塊:
在exe工程資源中對話方塊ID為
#define IDD_EXE_DIALOG 5000
在dll工程中對話方塊ID為
#define IDD_DLL_DIALOG 5000
對話方塊ID都是Visual Studio自動生成的,人工修改ID,到達資源不衝突,對於小工程來說還能忍受。但對於幾千個對話方塊,甚至上萬的對話方塊資源來說也是一件麻煩的事。MFC提供了下面兩個函式,於是我們只要在建立對話方塊之前對切換資源控制代碼即可。
// 獲取當前資源模組控制代碼
HINSTANCE AFXAPI AfxGetResourceHandle();
// 設定當前資源模組控制代碼
void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);
於是在dll工程中對需要匯出的對話方塊過載DoModal()函式
在dll檔案呼叫函式的定義開始位置,加入上面程式碼中的加黑程式碼塊。中間位置 斜體、紅色程式碼為你所需要的程式碼
INT_PTR CDllDialog::DoModal() { <strong>// 獲取老控制代碼 HINSTANCE old_hInstance = AfxGetResourceHandle(); // 獲取動態庫例項 HINSTANCE dll_hInstance = GetModuleHandle(_T("DialogDll.dll")); // 設定資源模組控制代碼為動態庫資源控制代碼 AfxSetResourceHandle(dll_hInstance); </strong> <em><span style="color:#ff0000;">// 呼叫CDialog::DoModal()函式 INT_PTR ptr = CDialog::DoModal(); </span></em> <strong> // 還原資源控制代碼 AfxSetResourceHandle(old_hInstance); </strong> return ptr; }
在dll檔案呼叫函式的定義開始位置,加入上面程式碼中的加黑程式碼塊。中間位置 斜體、紅色程式碼為你所需要的程式碼