1. 程式人生 > >exe呼叫dll中的對話方塊防資源衝突解決之道

exe呼叫dll中的對話方塊防資源衝突解決之道

在編寫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()函式
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檔案呼叫函式的定義開始位置,加入上面程式碼中的加黑程式碼塊。中間位置 斜體、紅色程式碼為你所需要的程式碼