C++编写DLL并使用C++调用

C++编写dll我们之前讲过,这篇文章主要讲解如何在C++环境下调用DLL,并说明C++的回调函数的使用。
C++编写dll,新建console-DLL项目。

#include <iostream>
using namespace std;
extern "C" __declspec(dllexport) int  Add(int a, int b,int (*Callback)(int a,int b))  //这是返回一个字符串的方法,和下面的可以作为对比。即返回字符串可以将字符串的指针作为参数或者作为函数返回值这两种方式
{
    Callback(a,b);
    cout<<a<<" "<<b<<endl;
    return a+b;
}
extern "C" __declspec(dllexport) int  AddTwo(int a, int b)  //这是返回一个字符串的方法,和下面的可以作为对比。即返回字符串可以将字符串的指针作为参数或者作为函数返回值这两种方式
{
    cout<<a<<" "<<b<<endl;

    return a+b;
}

注意:DLL文件的编写不支持函数的重载
生成的文件有一个dll文件和一个lib文件。关于这两个文件的区别和联系。
我们主要使用DLL动态链接库的方式,生成的文件也有lib文件和dll文件,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。即在运行的时候需要dll文件的支持。
1)使用 #pragma comment方式
这种方式需要lib文件的支持,使应用程序通过编译。然后在运行的时候只需将dll文件放在exe文件目录下。
这种方式使用比较简单

#pragma comment(lib,"TestMyCallback.lib") 
extern "C" _declspec(dllimport) int AddTwo(int a,int b);

在main函数中直接调用AddTwo函数 。其中函数名和参数必须和dll定义中的一致,否则在编译阶段就报错。
2)使用 LoadLibrary方式
这种方式使用windows api。因为 lib文件只有函数的入口信息,我们在没有lib文件时,仍可以直接使用dll文件。

    typedef int(*pAdd)(int,int);
    HMODULE hMod = ::LoadLibrary("TestMyCallback.dll");
    if (hMod!=NULL)
    {

        pAdd addFunction = (pAdd)::GetProcAddress(hMod,"AddTwo");//函数名称要对应
        if (addFunction!=NULL)
        {
            cout<<addFunction(2,3)<<endl;
        }
    }

回调函数:
上面的dll定义中第一个函数的参数有 一个函数指针,然后在函数的实现中也调用了该函数指针,但是到目前为止,我们还不知道该函数具体的实现部分,这就是回调的意思。函数的实现是在客户端调用的时候一并需要实现的。
下面是main函数部分,我们使用 LoadLibrary和GetProcAddress函数。

//回调函数的声明
int function(int a,int b)
{
cout<<"this is callback function"<<endl;
return a+b;//这里可以写自己想写的处理部分
}

//main函数体内
typedef int(*Add)(int,int,int (*Callback)(int a,int b));
    Add pAdd = (Add)GetProcAddress(hMod, "Add");
        if (pAdd==NULL)
        {
            return 0;
        }
    int (*p)(int a,int b);
    p = function;
    cout<<"----"<<pAdd(2,3,p)<<endl;

你可能感兴趣的:(C++编写DLL并使用C++调用)