动态链接库(4)回调函数在动态链接库之外的情况如何处理

时间:2022-03-01 15:52:02

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;
}
  • 实验结果
    动态链接库(4)回调函数在动态链接库之外的情况如何处理

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))这样的具有复杂形参的函数