天天看點

C++生成DLL

一、建立DLL

1.生成DLL檔案,導出函數,一般有兩種方法,一種是在函數聲明前面加上__declspec(dllexport),另一種是用def檔案來動态導出函數。這篇寫一個用def導出函數的小demo。

2.建立makedll檔案。

(1).makedll.h

[cpp]  view plain  copy

  1. #define MATHFUNCSDLL_EXPORTS  
  2. #ifdef MATHFUNCSDLL_EXPORTS  
  3. #define MATHFUNCSDLL_API __declspec(dllexport)   
  4. #else  
  5. #define MATHFUNCSDLL_API __declspec(dllimport)   
  6. #endif  
  7. extern "C"   
  8. {  
  9.     MATHFUNCSDLL_API int multiply(int a, int b);  
  10.     MATHFUNCSDLL_API int add(int c, int d);  
  11. }  

makedll.cpp

[cpp]  view plain  copy

  1. #include<makedll.h>  
  2. extern "C"  
  3. {  
  4.     MATHFUNCSDLL_API int multiply(int a, int b)  
  5.     {  
  6.         return a*b;  
  7.     }  
  8.     MATHFUNCSDLL_API int add(int c, int d)  
  9.     {  
  10.         return c + d;  
  11.     }  
  12. }  

3.然後在菜單欄選擇“項目”——“添加新項”——vc++節點中的代碼——子產品定義檔案(.def),輸入def檔案名,我輸入的makedll.def确定。

makedll.def檔案内容如下:

LIBRARY makedll

EXPORTS

multiply

add

LIBRARY 後面是要生成的DLL檔案名,EXPORTS下面是要導出的函數的名字(隻有名字)

4.生成解決方案。

二、使用DLL

1.建立項目usedll,來調用導出的函數。

2.将項目makedll生成的makedll.dll拷入usedll項目中,

3.main.cpp

[cpp]  view plain  copy

  1. #include<iostream>  
  2. #include<Windows.h>  
  3. using namespace std;  
  4. typedef int(*ADD)(int a,int b);  
  5. typedef int(*MULTIPLY)(int a, int b);  
  6. int main()  
  7. {  
  8.     HMODULE hm = ::LoadLibrary(TEXT("makedll.dll"));  
  9.     //如果Dll加載失敗,釋放它占用的資源  
  10.     if (hm == NULL)  
  11.     {  
  12.         cout << "hm is null" << endl;  
  13.         ::FreeLibrary(hm);  
  14.         return 0;  
  15.     }  
  16.     ADD add;  
  17.     MULTIPLY multiply;  
  18.     //取得目标Dll中導出函數的位址(提醒:函數名就是函數的入口位址)   
  19.     add = (ADD)::GetProcAddress(hm, "add");  
  20.     if (add == NULL)  
  21.     {  
  22.         cout << "add is null" << endl;  
  23.         ::FreeLibrary(hm);  
  24.     }  
  25.     multiply = (MULTIPLY)::GetProcAddress(hm, "multiply");  
  26.     cout << add(1,3) << endl;  
  27.     cout << multiply(2, 4) << endl;  
  28.     ::FreeLibrary(hm);  
  29.     return 0;  
  30. }  

運作搞定。

繼續閱讀