#生成dll
前提
- vs2017
過程
- 新建一個項目->windows桌面->windows桌面嚮導(網上很多文章都是從控制檯應用程序開始,之前的版本可以2017做了相應的更改)
- 在工程中添加類 在.h中寫如下
#pragma once
#define MYLIBAPI extern "C" __declspec( dllexport )
extern "C" __declspec(dllexport) int panny(int i, int(*call_back)(int a, int b));
__declspec(dllexport) int sum(int a, int b);
-
extern "C“以C的格式 導出,不加也是可以運行的,define只是一種編程風格
-
在對應的.cpp中實現 ,一般你寫在.h中的方法 會提示你在.cpp中實現確定一下就會生成對應的方法框架
-
這種方式生成的dll可能會造成函數名的更改,如果不怕麻煩可以查一下更改後的函數名然後使用對應的名子一樣可以。
-
還可以通過def文件來更改文件名和函數順序。切記一定要在鏈接器->輸入->模版定義文件中添加對應的文件
-
添加資源文件->添加對應的版本資源文件
調用
- 動態調用
int a = 5, b = 3;
HINSTANCE hInst = LoadLibraryA("DllTest.dll");
typedef int(*pFun)(int, int);//定義一個函數指針類型pAdd
pFun add = (pFun)GetProcAddress(hInst, "sum");
cout << a << " + " << b << " = " << add(a, b) << endl;
cin >> a;
return 0;
- 靜態調用
- 在鏈接器->常規->附加器目錄添加lib文件的文件夾
- 在鏈接器->輸入->輸出文件添加對應的文件名
//extern int sum(int, int); //告訴編譯器,add函數是在該源文件外部定義的函數
_declspec(dllimport) int sum(int, int);//告訴編譯器,sub函數是從動態庫導入的函數
//這兩種方式都可以正常的調用,但是下面的相對來說加載的更快一些
int main()
{
int a = 5, b = 3;
cout << a << " + " << b << " = " << sum(a, b) << endl;
cin >> a;
return 0;
}