VS2015動態庫程式設計之MFC規則動態庫(下)

2021-09-30 14:29:42 字數 2411 閱讀 7082

解決上述問題的方法是模組切換,即將資源模組控制代碼設定為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 ...