我们知道dll有很多好处
1.可以把用过的函数或者类封装起来,供别人调用,而且还不公开源码
2.可以在不重新编译的情况下,更新程序
3.DLL可以实现程序模块化,一个团队,每个人可以完成不同的部分,完成后可以直接拼接
那么怎么创建DLL工程呢
选择win32项目
选择DLL类型
这是DLL的入口函数,如果你不想在DLL被加载时做处理,这个地方可不管
重点在于对应于工程名的cpp文件
假设我的工程名为DLLGenerator
那么生成一个DLLGenerator.cpp
在这里你可以写一些需要导出的函数
记住需要在函数前加上_declspec(dllexport),这样说大家有可能不明白
我就写了两个函数,并编译成了DLL,但是DLL里真能看到这两个函数吗?
我们用DLL函数查看器查看一下
为什么什么都没有呢,其实是因为函数没有导出
现在我们在所有的函数前都加上_declspec(dllexport)
,那么结果会是什么样子呢
为什么函数名感觉不对呢,其实这是因为c++有重载机制,所以函数名会结合参数类型进行一定的变化,这样的dll我们在c里调用是无法调用的,因为找不到add和sub函数
那有什么办法呢,有,用extern “C”,如图
我们再看看结果如何
,这样一来我们就可以编译出供C调用的DLL了
但是这样子用起来还是挺麻烦的,因为在使用DLL的时候需要导入,还需要对函数做个声明才能使用
所以比较好的写法是写个头文件DLLGenerator.h
#ifndef _DLLGENERATOR_H
#define _DLLGENERATOR_H
#ifdef DLLPROJ
#define AMB _declspec(dllexport)
#else
#define AMB _declspec(dllimport)
#endif
extern "C"
{
AMB int add(int a, int b);
AMB int sub(int a, int b);
}
#endif
附上cpp文件的写法
#include "stdafx.h"
#define DLLPROJ
#include "DLLGenerator.h"
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
通过在DLL工程里定义一个宏DLLPROJ来区分是在DLL创建工程还是DLL使用工程中
#ifdef DLLPROJ
#define AMB _declspec(dllexport)//如果是在DLL创建工程中则定义AMB为导出函数
#else
#define AMB _declspec(dllimport)//否则定义AMB为导入函数(其实这地方不写也可以,即#define AMB)
#endif
头文件中的extern "C"使DLL文件编译时函数名字为正常名字
谢谢大家的观看