-
寫在前面
元件(Dynamic Link Library 或者 Dynamic-link Library,縮寫為 DLL),是微軟公司在微軟Windows作業系統中,實作共享函式庫概念的一種方式,這些庫函式的擴展名是 ”.dll"、".ocx"(包含ActiveX控制的庫)或者 ".drv"(舊式的系統驅動程式),本篇文章要介紹的是擴展名為".dll"的元件,
動態鏈接提供了一種方法,使行程可以呼叫不屬于其可執行代碼的函式,函式的可執行代碼位于一個 DLL檔案中,該DLL包含一個或多個已被編譯、鏈接并與使用它們的行程分開存盤的函式,DLL還有助于共享資料和資源,多個應用程式可同時訪問記憶體中單個 DLL 副本的內容,
使用元件可以更為容易地將更新應用于各個模塊,而不會影響該程式的其他部分,例如,您有一個大型網路游戲,如果把整個數百MB甚至數GB的游戲的代碼都放在一個應用程式里,日后的修改作業將會十分費時,而如果把不同功能的代碼分別放在數個元件中,您無需重新生成或安裝整個程式就可以應用更新,
-
dll的創建
1、打開"Visual Studio",新建專案-->Visual C++-->Windows桌面-->元件(DLL),這里我們取專案名為Dll1,

2、創建成功后,按照模板,應該會有下圖所示的檔案,

然后創建屬于自己的.cpp檔案和.h檔案,右鍵資源管理器里的"源檔案"和"頭檔案",選擇"新建項...",


3、在.cpp中寫下一個簡單的函式,
#include "pch.h" //必要的頭檔案
#include "myDll1.h" //自己的頭檔案
//一個簡單的函式
int myAdd(int a, int b)
{
return a + b;
}
4、在.h中寫下宣告,
#pragma once //規定只編譯一次
//宏定義,增加可讀性
#define DATAEXCHANGEDLL_API __declspec(dllexport)
//按C進行編譯,宣告.cpp中的函式
extern "C" DATAEXCHANGEDLL_API int myAdd(int a, int b);
5、選擇x64后,點擊選單欄中的"生成"-->"重新生成解決方案"

成功,
6、生成的.dll,.lib均在專案根目錄的x64/Debug檔案夾里

-
dll的使用
1、打開"Visual Studio",新建專案-->Visual C++-->控制臺應用,這里我們取專案名為Dll1_test,

2、將之前專案的三個檔案移植到新的專案檔案夾內,

然后在Visual Studio內進行添加,
右鍵資源管理器的"頭檔案",添加"現有項...",選擇"myDll1.h",
右鍵資源管理器的"資源檔案",添加"現有項...",選擇"Dll1.lib",效果如下圖

3、在要使用到元件的.cpp檔案中,參考頭檔案"myDll.h",就可以使用Dll1.dll里面的函式了,
#include <iostream>
#include "myDll1.h"
using namespace std;
int main()
{
int c = myAdd(1, 2);
cout << c << endl;
system("pause");
return 0;
}

成功,
-
實戰
1、創建dll專案同上,名字取為"A1_<學號>",同理添加自己的.cpp和.h,名字均為"A1_<學號>.<xxx>",在.cpp內寫函式,在.h中寫宣告,
.cpp:
#include "pch.h"
#include "A1_000000.h"
#include <iostream>
using namespace std;
/**
* 求rawIntData每個元素的和
* @rawIntData 資料陣列
* @rawIntData 資料長度
* @result 結果
* @return {回傳值型別} 回傳值說明
*/
int NewIntAdd(int rawIntData[], int dataNum, int &result)
{
result = 0;
for (size_t i = 0; i < dataNum; i++)
{
result += rawIntData[i];
}
return 0;
}
/**
* 求rawIntData每個元素的和
* @rawIntData 資料陣列
* @rawIntData 資料長度
* @result 結果
* @return {回傳值型別} 回傳值說明
*/
int NewFloatAdd(float rawFloatData[], int dataNum, float& result)
{
result = 0.0f;
for (size_t i = 0; i < dataNum; i++)
{
result += rawFloatData[i];
}
return 0;
}
/**
* 求rawIntData 求最大值
* @rawIntData 資料陣列
* @rawIntData 資料長度
* @result 結果
* @return {回傳值型別} 回傳值說明
*/
int NewFloatMAX(float rawFloatData[], int dataNum, float& result)
{
return 0;
}
.h:
#pragma once
#define DATAEXCHANGEDLL_API __declspec(dllexport)
// ***上面為固定的宏定義格式***
// ***下面加入自己的函式宣告***
extern "C"
{
DATAEXCHANGEDLL_API int NewIntAdd(int rawIntData[], int dataNum, int &result);
DATAEXCHANGEDLL_API int NewFloatAdd(float rawFloatData[], int dataNum, float& result);
DATAEXCHANGEDLL_API int NewFloatMAX(float rawFloatData[], int dataNum, float& result);
}
2、同樣的,選擇x64,點擊"重新生成解決方案",就可以生成相應的檔案,位置跟前面的一樣,
3、將三個檔案分別移植到"Assignment1"專案中,然后按步驟添加檔案進入資源管理器,

將原有的三個函式代碼刪掉或注釋,然后運行即可出結果,

成功,
p.s.在.cpp中,選中NewIntAdd這個函式,按F12跳轉或右鍵-->"轉到定義",可以看到來到了.h的宣告中,說明此時使用的就是自己的.dll中的函式,:>
-
總結
不難,但是需要思路清晰,大家加油!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/186443.html
標籤:其他
上一篇:2020淘寶雙十一快速刷金幣工具
