一、建立DLL
1.生成DLL檔案,導出函數,一般有兩種方法,一種是在函數聲明前面加上__declspec(dllexport),另一種是用def檔案來動态導出函數。這篇寫一個用def導出函數的小demo。
2.建立makedll檔案。
(1).makedll.h
[cpp] view plain copy
- #define MATHFUNCSDLL_EXPORTS
- #ifdef MATHFUNCSDLL_EXPORTS
- #define MATHFUNCSDLL_API __declspec(dllexport)
- #else
- #define MATHFUNCSDLL_API __declspec(dllimport)
- #endif
- extern "C"
- {
- MATHFUNCSDLL_API int multiply(int a, int b);
- MATHFUNCSDLL_API int add(int c, int d);
- }
makedll.cpp
[cpp] view plain copy
- #include<makedll.h>
- extern "C"
- {
- MATHFUNCSDLL_API int multiply(int a, int b)
- {
- return a*b;
- }
- MATHFUNCSDLL_API int add(int c, int d)
- {
- return c + d;
- }
- }
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
- #include<iostream>
- #include<Windows.h>
- using namespace std;
- typedef int(*ADD)(int a,int b);
- typedef int(*MULTIPLY)(int a, int b);
- int main()
- {
- HMODULE hm = ::LoadLibrary(TEXT("makedll.dll"));
- //如果Dll加載失敗,釋放它占用的資源
- if (hm == NULL)
- {
- cout << "hm is null" << endl;
- ::FreeLibrary(hm);
- return 0;
- }
- ADD add;
- MULTIPLY multiply;
- //取得目标Dll中導出函數的位址(提醒:函數名就是函數的入口位址)
- add = (ADD)::GetProcAddress(hm, "add");
- if (add == NULL)
- {
- cout << "add is null" << endl;
- ::FreeLibrary(hm);
- }
- multiply = (MULTIPLY)::GetProcAddress(hm, "multiply");
- cout << add(1,3) << endl;
- cout << multiply(2, 4) << endl;
- ::FreeLibrary(hm);
- return 0;
- }
運作搞定。