VS2015_動態鏈接庫學習


非MFC動態鏈接庫

創建一個名為ex1的Win32項目
創建一個DLL項目,保留預編譯的頭文件
 

 默認文件

創建完成項目之后,包含幾個默認的文件
 
stdafx.h文件用於包含標准系統包含的頭文件
 對應於stdafx.cpp文件,主要包含stdafx.h的頭文件
 targetver.h主要用於定義dll可以使用的最高的Windows版本
 dllmain.cpp用於定義dll的程序入口點
 dllmain函數是加載dll時候的入口函數
 
創建ex1.h文件,定義導出的變量和導出的函數
  可以快速創建文件,在dllmain.cpp中定義add和sub的函數
 
   可以修改dllmain.cpp文件,定義程序入口函數處,設置Num=100
 
 編譯函數,得到dll文件

 使用Dependency查看DLL的情況

如果沒有找到可以獨立下載: http://www.dependencywalker.com/ 
發現我們定義好的函數和變量
這里的Function定義都有明確的含義,C++默認使用__cdecl調用的約定 

DLLMain函數
Windows在加載DLL的時候,需要一個入口函數,即DLLMain函數。如果沒有為DLL編寫一個DLLMain函數,則系統會自動引入一個不做任何處理的默認DLLMain函數
函數內部根據dll被加載的原因進行不同的操作
名稱 作用 備注
DLL_PROCESS_ATTACH 進程被調用,DLL被連接到當前進程並被初始化
DLL_THREAD_ATTACH 當前進程創建一個新線程,DLL在新線程內被調用
DLL_PROCESS_DETACH 調用DLL的進程被終止,DLL被卸載
DLL_THREAD_DETACH 調用DLL的線程被終止,DLL被卸載
 

 DLL庫的調試

由於dll文件不能單獨調試,所以需要創建一個調試dll工程的project,這里創建一個Win32的控制台應用程序
創建完成后,將這個項目設置為啟動項

應用過程使用隱式鏈接方式調用ex1.dll文件

DLL生成的時候,會配套生成一個LIB文件,這個文件中定義了DLL的變量和函數
DLL加載的過程中,Windows將按照如下的順序來定位DLL
- 包含EXE文件的目錄
- 進程的當前工作目錄
- Windows系統目錄
- Windows目錄
- 列在PATH環境變量中的一系列目錄
將LIB庫文件添加到項目中,一共有3中方法
1.通過屬性配置附加依賴項
 加載完成后,聲明一下來自外部的函數,即可在后文去應用這些函數了
 
 2.通過程序代碼中添加LIB文件導入
先刪除程序配置中的附加依賴項,然后嘗試編譯,發現無法通過編譯
在語句中添加LIB導入內容
這里需要注意的是,附加目錄庫需要指定
   3.通過文件的方式直接添加LIB文件
 

應用工程以顯示連接方式調用ex1.dll文件

顯示調用需要使用代碼的方式鏈接dll,使用顯式鏈接方式可以在應用程序執行過程中隨時加載DLL,也可以隨時卸載DLL,這是隱式無法做到的。
好處:可以在啟動程序時,不必將所有的應用DLL一起加載到DLL內存中,只有在使用某個DLL的時候才會載入,這樣可以減少應用程序初始化加載的時間,可以降低內存的使用

這里暫時不做過多深入,等后續需要的使用繼續學習


 使用非MFC DLL 導出類

如果建立的DLL不需要使用MFC,為了節約磁盤和內存空間,可以建立非MFC動態庫
創建一個ex2的非MFC動態鏈接庫
新建一個頭文件ex2.h,在這個頭文件中定義一個類
 使用Dependency可以查看類的導出內容,比較復雜,所以不適合使用def的方式進行
 為了測試我們的DLL,新建一個Console工程進行測試
如果要調用lib文件,可以使用Solution的相對路徑來完成項目庫的導入操作
 


 

 
 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM