创建DLL详解(1)

我们知道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文件编译时函数名字为正常名字
谢谢大家的观看
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值