透過Visual Studio生成DLL
前言
之前因都需要使用CMD呼叫外部工具去讓PC對微控制器發送HID指令,這邊就想嘗試把這塊整合成DLL使用call DLL方式去達成,一來可以簡化操作也可以比較快速達到目的,今天彙整網路上各個資訊把如何使用Visual Studio生成DLL做完整
建立一個 DLL專案
選擇建置DLL專案,並且新增一個 .h 的檔案
官方文件中提供了兩種方式可以匯出dll中的函式:
- 關鍵字
__declspec(dllexport)
:操作簡單,但通用性較差。可見,vs建立dll專案時預設使用了該方式 - 模組定義檔案(.def):通用性(指給其他語言eg. Java、C#呼叫)好,但操作相對複雜
首先新建立標頭檔案“XXX.h”,它的作用是用來宣告需要匯出的函式介面。
在新增的標頭檔中,填入以下程式碼。
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
//匯出類
class MYDLL_API Rectangle
{
public:
double getarea(double w, double h);
void print();
};
//匯出函式
extern"C" MYDLL_API int __stdcall mysum(int a, int b);
再來要加入「C++ 檔(.cpp)」
然後我們需要在‘XXXXl.cpp’中實現在‘XXXXl.h’中被宣告的函式,程式碼如下:
#include "pch.h"
#include "CreateDll.h"
#include<iostream>
double Rectangle::getarea(double w, double h)
{
return w * h;
}
void Rectangle::print()
{
std::cout << "已被列印";
}
int __stdcall mysum(int a, int b)
{
return a + b;
}
- __declspec(dllexport)此修飾符告訴編譯器和連結器被它修飾的函式或變數需要從DLL匯出,以供其他應用程式使用;
與其相對的還有一句程式碼是__declspec(dllimport),此修飾符的作用是告訴編譯器和連結器被它修飾的函式或變數需要從DLL匯入
- extern “C”的作用是告訴編譯器將被它修飾的程式碼按C語言的方式進行編譯
這是由於C語言沒有過載,不會改變函式名。而C++中有過載,在編譯過程中會根據返回值和引數修改函式名。
- __stdcall定義匯出函式入口點呼叫約定為_stdcall
如何呼叫dll
- 隱式連結需要三個檔案:.h檔案、.lib檔案 和 .dll檔案。
- 對於.h檔案: 屬性頁->C/C++->附加包含目錄 新增路徑並引用。(或者直接引用絕對路徑)
- 對於.lib檔案(有兩種新增方法)
屬性頁->連結器->常規->附加庫目錄( 新增.lib檔案路徑); 屬性頁->連結器->輸入->附加依賴項 (新增.lib檔名)
直接用#pragma comment(lib,”MyDll.lib) (需要將該lib檔案放到與exe同目錄下)