解決上述問題的方法是模組切換,即將資源模組控制代碼設定為dll模組的起始位址,之後顯示的對話方塊即為
dll模組中id為
5000
的對話方塊了。
可以通過兩種方法實現模組切換,一種是在dll中實現切換,另一種是在呼叫
dll的程式中實現切換。
在dll中,可以使用
afx_manage_state
巨集或者afxsetresourcehandle()函式實現模組切換。
(1)使用afx_manage_state巨集
在mfc_regular_static_dll_test的匯出函式
showdialog()
中加入如下**
afx_manage_state(afxgetstaticmodulestate());
其中,afx_manage_state巨集的作用是設定當前的有效模組狀態。afxgetstaticmodulestate()函式的作用是獲取
dll模組的狀態。
重新生成mfc_regular_static_dll_test.dll並將其拷貝到呼叫該
dll的
mfc程式源**所在的路徑下,執行
mfc程式的效果如圖8所示
圖8 彈出對話方塊為
dll對話方塊資源
(2)使用afxsetresourcehandle()函式
afxsetresourcehandle()函式的作用是設定程式目前要使用的資源模組控制代碼。在動態庫的匯出函式
showdialog()
中將afx_manage_state巨集注釋掉,之後新增如下**
hinstance hinstance = afxgetresourcehandle();
cdlldialog dlg;
dlg.domodal();
afxsetresourcehandle(hinstance);
其中,afxgetresourcehandle()的作用是獲取當前資源模組的控制代碼,該控制代碼即為呼叫dll的
mfc程式的控制代碼;之後通過afxsetresourcehandle()函式將當前資源模組的控制代碼設定為本模組即
dll模組的控制代碼,
是mfc
規則動態庫應用程式的物件,
m_hinstance()
是該應用程式的控制代碼;在顯示了
dll中的對話方塊資源之後,再次呼叫
afxsetresourcehandle()
函式將當前資源模組的控制代碼恢復為呼叫dll的
mfc程式的資源控制代碼。
將重新生成的mfc_regular_static_dll_test.dll拷貝到
呼叫dll的
mfc程式源**所在的資料夾中,執行該
mfc程式,得到的效果與「(
1)使用afx_manage_state巨集」中的效果相同,如圖8
所示。在呼叫dll的
mfc程式的按鍵訊息響應函式中呼叫afxsetresourcehandle()函式實現模組切換。
hinstance exe_hhandle = getmodulehandle(null);
hinstance dll_hhandle = getmodulehandle(_t("mfc_regular_share_dll_test.dll"));
afxsetresourcehandle(dll_hhandle);
pshowdialog();
afxsetresourcehandle(exe_hhandle);
其中,getmodulehandle()函式的作用是獲取模組的控制代碼,如果該函式的引數指定要獲取控制代碼的模組,如果是
null
,則表示獲取的是本模組的控制代碼。通過
getmodulehandle()
函式獲取到了mfc_regular_static_dll_test.dll的控制代碼之後,再通過afxsetresourcehandle()函式實現模組切換。當前資源模組的控制代碼切換到動態庫模組控制代碼後,呼叫動態庫的匯出函式
showdialog()
,顯示動態庫模組中的對話方塊資源,最後再將當前資源模組的控制代碼恢復成呼叫
dll的
mfc程式的控制代碼。
將mfc_regular_static_dll_test.dll的匯出函式showdialog()中關於環境切換的**注釋掉,只留下呼叫對話方塊資源的**
cdlldialog dlg;
dlg.domodal();
重新生成dll檔案後,將其拷貝到呼叫
dll的
mfc程式源**所在的資料夾中,執行
mfc程式,得到的效果與「(
1)使用afx_manage_state巨集」中的效果相同,如圖8
所示。
VS2015動態庫程式設計之匯出變數
在動態庫中定義的全域性變數,可以在呼叫該動態庫的程式中進行訪問和修改。在 vs2015 動態庫之入口函式 中建立的 dll程式的基礎上,新增匯出變數。在dllmain.cpp原始檔的起始位置處定義乙個全域性變數 unsigned int dllglobalvar 0 在dllmain 入口函式中,對...
vs2015編譯 pybind 動態庫
本人總結 pyd的檔案 引用 module的名字和 pybind定義的module名字一致,pybind11 module pyiotsdk,m pybind只需要引用標頭檔案即可。根據原文,加上自己的總結 也可以參考 建立visual sdudio 至少2015 win 32 console工程,...
VS2015靜態庫與動態庫的使用
靜態庫建立 略 往往我們使用第三方的比較常見,如果要自己團隊間建立使用也很簡單 標頭檔案的載入 庫檔案的載入 首先需要將 lib同樣拷貝到專案目錄下 方式一 使用 pragma comment lib,lib include stdafx.h include consollib.h include ...