1.建立动态链接库DLL3
- DLL3.cpp的代码如下
#include <iostream>
using namespace std;
void Pro1(int a, int(*Fun1)(int b))
{
if (a > 100)
{
Fun1(a);
}
else
{
cout << "不调用其它函数" << endl;
}
}
int Fun3(int a)
{
cout << "这个数为:" << a << endl;
return 0;
}
int(*Fun4)(int a);
void Pro2(int a, void(*Pro)(int b,int(*Fun2)(int c)),int(*Fun)(int d))
{
if (a > 0)
{
Pro(a, Fun);
}
else
{
cout << "a不大于0" << endl;
}
}
- DLL3.def的代码如下
LIBRARY DLL3
EXPORTS
Pro1
Pro2
2.建立测试DLL的项目TestDll3
- 代码如下
/* *@为了测试在dll之外 回调函数的使用 */
#include <iostream>
using namespace std;
#pragma comment(lib,"DLL3.lib")
_declspec(dllimport) void Pro1(int a, int(*Fun1)(int b));
_declspec(dllimport) void Pro2(int a, void(*Pro)(int b, int(*Fun2)(int c)), int(*Fun)(int d));
int Fun5(int b)
{
cout << "这个值为:" << b << endl;
return 0;
}
int main()
{
//Pro1(200,Fun);
Pro2(1,Pro1,Fun5);
Pro2(101, Pro1, Fun5);
system("pause");
return 0;
}
- 实验结果
3.总结
由于项目需要,需要建立DLL,并且需要在动态链接库之外,调用回调函数进行写数据库的操作,冥思苦想了1天才得出这个上述程序。最大的亮点是
(1)导出的两个函数是有关系的,Pro1可以作为Pro2的参数使用
(2)Pro1函数的形参是回调函数(且在dll的外部,TestDll3中的Fun5就是)
(3)实现了void Pro2(int a, void(*Pro)(int b,int(*Fun2)(int c)),int(*Fun)(int d))这样的具有复杂形参的函数