使用DLL的好处:可以使用多种语言编程 提高效率 节约空间
DLL的编写:
使用时要提供2个文件:引入库(存放导出函数和变量的符号名,编译连接时,为lib文件) dll(实际函数数据,运行时调用)
一 简单的使用
为了提示所有的接口,可利用.h文件,将声明放在头文件中作为接口和提示文件
全局函数
1.
int _declspec(dllexport) add(int a, int b)
{
return a + b;
}
2.使用宏 方便编写
dll1.h
#ifdef DLL_TEST_1
#else
#define DLL_TEST_1 _declspec(dllimport)
#endif
DLL_TEST_1 int add(int a, int b);
dllTest1.cpp
#define DLL_TEST_1 _declspec(dllexport)
#include "dll1.h"
int add(int a, int b)
{
return a + b;
}
以上2中使用dumpbin工具进行查看时,函数名被更改为:
使用:
方法一:隐式链接,lib放在链接文件下,dll放在运行文件下
dllUse1.cpp
#include <iostream>
#include "dll1.h"
using namespace std;
//extern int _declspec(dllimport) add(int a, int b);可以不加_declspec(dllimport),但加了效率会更高,编译器会知道是dll
#pragma comment(lib,"dllTest1.lib")
int main()
{
cout << "5+3=" << add(5,3) << endl;
system("pause");
}
类:
将整个类导出
class DLL_TEST_1 Base
{
public:
int subtract(int a, int b);
};
class Base
{
public:
DLL_TEST_1 int subtract(int a, int b);
int mul(int a, int b);
};
int Base::subtract(int a, int b)
{
return a - b;
}
int Base::mul(int a, int b)
{
return a*b;
}
类中只有subtract,没有mul函数
二 使用extern "C" 固定函数名(更改调用约定的情况下 函数名依然会变 不能用于导出类及其成员)
#define DLL_TEST_1 extern "C" _declspec(dllexport)
三 使用模块定义文件(def文件)
当更改函数调用约定时,即使使用了extern “C",函数名依然会改变,这时可以使用def文件:
extern "C" _declspec(dllexport) int _stdcall add(int a, int b)
{
return a + b;
}
.def
LIBRARY DLLL
EXPORTS
add
注意vs2013下,需要在链接器,输入选项的模块定义选项中添加def文件
typedef int (*Add)(int, int);
HINSTANCE h = LoadLibrary(L"DLLL.dll");//加载dll 无需lib文件
if (!h)
{
MessageBox(NULL, L"h=NULL", L"asd", MB_OK);
return 0;
}
Add add = (Add)GetProcAddress(h, "add");//获取地址
cout << "5+3=" << add(5,3) << endl;