动态链接库(DLL)开发基础
本周我的博客涉及到動態鏈接庫的基礎開發。我在剛開始學習動態鏈接庫的開發、在網上找DLL開發基礎知識教程時發現網上的資料還是太雜,對初學者不太友好,于是我就著手寫了這篇博客,本篇博客知識有DLL簡介、DLL的兩種制作方式、隱式調用顯式調用兩種調用方式以及最后的代碼實例,編譯器是VS2019。純小白教學,希望能對剛入門的你有所幫助。最后,如果感覺文章還可以的話請一鍵三連哦。
DLL簡介
動態鏈接庫英文為DLL,是Dynamic Link Library的縮寫。DLL是一個包含可由多個程序,同時使用的代碼和數據的庫。動態鏈接就是把調用的函數所在文件模塊(DLL)和調用函數在文件中的位置等信息鏈接進目標程序,程序運行的時候再從DLL中尋找相應函數代碼,因此在發布和運行時需要相應DLL文件的支持。
優點:當程序使用 DLL 時,具有以下的優點: 使用較少的資源,當多個程序使用同一個函數庫時,DLL
可以減少在磁盤和物理內存中加載的代碼的重復量。這不僅可以大大影響在前臺運行的程序,而且可以大大影響其他在 Windows
操作系統上運行的程序。 推廣模塊式體系結構DLL
有助于促進模塊式程序的開發。這可以幫助您開發要求提供多個語言版本的大型程序或要求具有模塊式體系結構的程序。模塊式程序的一個示例是具有多個可以在運行時動態加載的模塊的計帳程序。
簡化部署和安裝當 DLL 中的函數需要更新或修復時,部署和安裝 DLL 不要求重新建立程序與該 DLL 的鏈接。此外,如果多個程序使用同一個
DLL,那么多個程序都將從該更新或修復中獲益。
DLL的兩種制作方法
使用_declspec方式創建動態庫
1.打開vs2019,新建一個動態鏈接庫,輸入項目名稱,點擊創建。
2. 在頭文件創建dll.h頭文件,在源文件創建dll.cpp文件
3. 在dll.h和dll.cpp中各加入下列代碼
dll.h
dll.cpp
注意最開始加入頭文件#include “pch.h”,否則會報錯
如圖所示:
4. 右擊項目DLL01,點擊重新生成,當出現下面截圖代表DLL生成成功。
5.打開相應目錄,可發現生成的文件。
使用模塊定義文件.def創建動態庫
該方法相比于第一種方法簡便很多。
1、2步同上
3. 創建dll.h文件,內容如下:
創建dll.cpp文件,文件內容同上dll.cpp.
截圖如下:
4.創建.def文件
右擊源文件-》添加-》新建項-》代碼-》模板定義文件,點擊添加
在模板定義文件中加入以下代碼:
其中Dll02、convert_array分別是項目名和函數名,可更改。有幾個函數后面@幾,按順序加。如:
LIBRARY Dll EXPORTS convert_array @1 add @2 sub @3DLL的兩種調用方式
隱式調用
1.首先創建一個控制臺應用。右擊解決方案-》添加-》新建項目-》控制臺應用,創建一個名為Isinvokedll的控制臺應用。如下圖所示:
2.在生成的Isinvokedll.cpp文件里聲明頭文件 #include “dll.h”,這時include會標紅,因為這兩個項目沒在一個文件夾內,編譯器不知道dll.h文件的位置,這時需要我們手動配置文件依賴。
右擊Isinvokedll文件 -》屬性 -》C/C++ -》附加包含目錄。
點擊三個點,就會出現文件的路徑,選擇文件夾,確認,應用,確認。
3.然后include就不標紅了。
此時再往頭文件里加入
這是告訴編譯器與該dll相對應的.lib文件所在的路徑和文件名。在生成dll文件時,鏈接器會自動為其生成一個對應的.lib文件,該文件包含了dll導出函數的符號名和序號(并沒有實際的代碼)。在應用程序中,.lib文件將作為dll的替代文件參與編譯,編譯完成后,.lib文件就不需要了。
添加完后還需要配置該lib文件的附加庫目錄。與配置的dll.h文件類似。
右擊項目—》屬性—》鏈接器—》常規—》附加庫目錄,添加Dll01.lib的文件路徑。
一般相對路徑在項目文件的debug目錄下,如下圖所示:
4. 添加下列代碼到Isinvokedll文件夾中
顯式調用
顯示調用不需要配置各種文件路徑和附加庫,大概分為5步,
實例如下所示:
#include <iostream> #include <Windows.h>//第一步,創建一個別名,它引用的函數類型需要和dll中的導出函數一致。 typedef int (*LPDO_ARRAY)(int* pArr, int nlen); int main() {HINSTANCE hDll;//定義一個實例句柄,引用動態庫;LPDO_ARRAY lpDo_array;//定義一個函數指針,用來指向導出函數//第二步,加載DemoDll.dll動態庫文件hDll = LoadLibrary(L"Dll02.dll");if (hDll != NULL){//第三步,獲取dll中函數的地址lpDo_array = (LPDO_ARRAY)GetProcAddress(hDll, "convert_array");if (lpDo_array != NULL){//第四步,調用函數int nArr[] = { 1,2,4,6 };int nlen = sizeof(nArr) / sizeof(int);int nRet;//通過函數指針lpDo_array調用函數nRet = lpDo_array(nArr, nlen);std::cout << "返回值:" << nRet << std::endl;std::cout << "數組新值: ";for (int i = 0; i < nlen; ++i){std::cout << nArr[i] << ",";}}//第五步,釋放動態庫句柄FreeLibrary(hDll);}}運行截圖:
over!
總結
以上是生活随笔為你收集整理的动态链接库(DLL)开发基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 社区网络转化_python
- 下一篇: kkt条件的matlab仿真,请教关于S