c++生成DLL文件之动态导出方式

c++生成DLL文件之def导出方式

一、创建DLL

1.生成DLL文件,导出函数,一般有两种方法,一种是在函数声明前面加上__declspec(dllexport),另一种是用def文件来动态导出函数。这篇写一个用def导出函数的小demo。

2.创建makedll文件。

(1).makedll.h

 #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

#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)

二、使用DLL

1.新建项目usedll,来调用导出的函数。

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

3.main.cpp

#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;
}
运行搞定。


三。项目实际使用(个人)


首先项目实际应用中,函数之间的嵌套是非常多的,此时规划好DLL接口是十分重要的,一下具体说明:

a.h 定义了函数chang_Mat()
a.cpp实现了函数chang_Mat()

b.h 定义了函数my_Mat()
b.cpp实现了函数my_Mat() , 但是函数my_Mat()调用了chang_Mat();

此时,将my_mat() 封装成DLL的一个接口,可以直接按 上述方式 修改 b.h 和 b.cpp 文件!

若想将chang_Mat()和my_Mat()都封装成接口,
最好的方式是:在b.h和b.cpp中重新定义一个函数my_chang_Mat(),将chang_Mat()封装起来,函数my_chang_Mat()预留成DLL的接口;
这样DLL的预留的接口为:my_mat()、my_chang_Mat();

这样做的好处是:

1.原来写的 .h 与 .cpp 文件不用修改;
2.针对函数嵌套问题,可以顺利预留出接口;

总结:

前半段参考:http://blog.youkuaiyun.com/lushuner/article/details/25048465

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值