c++生成DLL文件之动态导出方式
2018-01-12 17:56
309 查看
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.csdn.net/lushuner/article/details/25048465
一、创建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.csdn.net/lushuner/article/details/25048465
相关文章推荐
- c++生成DLL文件之静态导出方式
- PB8调用使用C++与C#分别编写生成解压缩带有密码的zip压缩文件的动态链接库dll(部分内容转自互联网)
- 在vs中用C的编程方式生成.dll文件并且动态、静态调用dll中的函数
- 在vs中用C++编程的方式生成.dll文件和以动态、静态调用dll中函数
- C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用
- 动态链接时要生成DLL和lib时,要导出函数
- DLL中导出函数的两种方式(dllexport与.def文件)(
- dll的def文件与__declspec(dllexport)导出函数方式比较
- dll的def文件与__declspec(dllexport)导出函数方式比较
- DLL中导出函数的两种方式(dllexport与.def文件)
- 编译生成动态库文件(方式二)
- PHP 动态导出生成 excel,csv文件
- C#调用C++写的dll,包含结构体转换和C#动态调用dll(头文件转换为类)
- javaweb动态导出指定格式文件,并写入内容动态生成
- 编译生成动态库文件(方式二)
- DLL中导出函数的两种方式(dllexport与.def文件)
- C++ Dll 导出函数头文件
- C++:采用添加资源的方式将模型文件悄悄封入dll
- c++调用matlab生成的Dll动态连接库
- 【转载整理】eclipse 开发c/c++、Java使用JNI调用C程序、生成64位dll动态链接库