非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的函數

使用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被卸載 |
應用過程使用隱式鏈接方式調用ex1.dll文件
DLL生成的時候,會配套生成一個LIB文件,這個文件中定義了DLL的變量和函數
DLL加載的過程中,Windows將按照如下的順序來定位DLL
- 包含EXE文件的目錄
- 進程的當前工作目錄
- Windows系統目錄
- Windows目錄
- 列在PATH環境變量中的一系列目錄
將LIB庫文件添加到項目中,一共有3中方法
1.通過屬性配置附加依賴項

加載完成后,聲明一下來自外部的函數,即可在后文去應用這些函數了
先刪除程序配置中的附加依賴項,然后嘗試編譯,發現無法通過編譯
在語句中添加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的相對路徑來完成項目庫的導入操作
