转载:https://blog.csdn.net/w_x_myself/article/details/82252646

1.dll的特点

代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点比较多,总结起来有4点。 
   暴露了源代码;

多份拷贝,造成存储浪费;

容易与程序员的“普通”代码发生命名冲突;

更新功能模块比较困难,不利于问题的模块化实现; 
实际上,以上4点概括起来就是“暴露的源代码”造成“代码严重耦合”。为了弥补这些不足,就提出了“二进制级别”的代码复用。使用二进制级别的代码复用一定程度上隐藏了源代码,对于缓解代码耦合现象起到了一定的作用。这样的复用被称为“黑盒复用”。

说明:实现“黑盒复用”的途径不只dll一种,静态链接库甚至更高级的COM组件都是。

2.VS创建新一个空的解决方案(一个解决方案下可以有很多project)

2.创建dll

文件------>新建------>项目------>Win32控制台应用程序------>

选择dll -- 勾选导出符号 -- 不勾选预编译头文件

删除stdafx.h 、stdafx.cpp、targetver.h、dllmain.cpp,把MyDll.h修改成dllexport.dll。修改MyDll.cpp中#include "stdafx.h" #include "MyDll.h"改为 "dllexport.h"

如果生产dll和使用dll的工程在一个解决方案中,我们可以指定dll输出目录

$(SolutionDir)  ---  解决方案目录

$(Platform)       ---- 平台目录(x86/x64)

$(Configuration) --- 编译模式(Debug/Release)

因为dll库是函数的实现,lib里面是函数的声明,我们也指定他的输出路径

这是我们编译工程:

这时在解决方案目录下生成bin和lib目录

3.创建useDll工程

使用dll

导入头文件  指定导入

在运行之前我们要指定UseDll工程的exe的输出目录

运行结果:

通过配置工程属性来使用dll库

工程—属性—配置属性—链接器—常规—附加库目录:加上lib文件存放目录。 
然后添加工程引用的lib文件名:工程—属性—配置属性—链接器—输入—附加依赖项:加上lib文件名。

显式调用dll:获取dll库的路径,无需配置环境,无法进行隐式链接

调用:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <Shlwapi.h>// 使用PathRemoveFileSpec函数
using namespace std;
#pragma comment(lib, "shlwapi.lib") //这个库也要有,不然会报链接错误 typedef int(*MyAdd)(int a,int b);
typedef int(*MySub)(int i,int j); int main()
{
TCHAR ModulePath[MAX_PATH] = { };
GetModuleFileName(NULL,ModulePath,MAX_PATH);
::PathRemoveFileSpec(ModulePath);//C:\\TestDemo\\Debug wstring dllpath = ModulePath;
dllpath += L"\\FunDll.dll"; HMODULE hModule = LoadLibrary(dllpath.c_str()); if (hModule)
{
MyAdd func = (MyAdd)GetProcAddress(hModule, "Add");//显式调用dll中的Add cout << func(, ) << endl; MySub funs = (MySub)GetProcAddress(hModule,"Sub');//显式调用dll中的Sub cout << funs(,) <<endl;
} cout << fnMyDll() << endl;//调用dll中的函数 FreeLibrary(hModule);
return ;
}

demo

VS2015 创建C++动态库及使用的更多相关文章

  1. vs2015开发so动态库linux

    #include <stdio.h> #include <dlfcn.h> typedef int(*fn_max)(int a, int b); int main() { p ...

  2. 在VS2015中用C++编写可被其它语言调用的动态库DLL

    转自:http://blog.csdn.net/songyi160/article/details/50754705 VS2015用C++创建动态库DLL步骤如下: (1)启动VS2015>文件 ...

  3. 在Linux中创建静态库.a和动态库.so

    转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...

  4. Xcode 创建静态库和动态库

    1.linux中静态库和动态库区别: 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库:这类库的名字一般是libxxx.a:利用静态函数库编译成的文件 ...

  5. 在Linux中创建静态库和动态库

    我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...

  6. 在Linux中创建静态库和动态库 (转)

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态 库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...

  7. 【转】VS2013动态库文件的创建及其使用详解

    一.VS2013动态库文件的创建 1.新建项目,win32,win32项目,输入项目名称,例如MakeDll. 2.”确定“——”下一步“,选择”DLL“选项,再点”完成“: 3.菜单栏选择”项目“— ...

  8. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

  9. 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用

    原文出处: 吴秦的博客    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学 ...

随机推荐

  1. 小程序开发 解析内容中unicode转中文编码显示问题

    如果对你有帮助的话麻烦点个[推荐]~最好还可以follow一下我的GitHub~感谢观看! 小程序后台返回数据的时候,html内容是经过unicode编码的不能直接显示,里边全是类似&#xxx ...

  2. 记录一次Oracle创建DBLink踩到小坑

    1.查询当前是否具有创建DBlink的权限: select * from user_sys_privs where privilege like upper('%DATABASE LINK%'); 如 ...

  3. jQuery遍历之find()

    /**案例说明: *首先理清楚find()函数同children()函数之间的区别 * 1. find()会遍历给定节点下的所有的元素节点. * 2. children()之后遍历给定节点下的单一层级 ...

  4. HDFS 配额教程

    本文原始地址:https://sitoi.cn/posts/12544.html 名称配额(Name Quota) 名称配额是在对应的目录下所有文件和目录名称的数量上的限制. 当超过这个配额的时候,文 ...

  5. linux命令实现在当前文件夹下面模糊搜索文件

    在当前文件中查找包含的字符串 find . -name "*.txt" | xargs grep 'abc' ,例如:查找txt文件中包含字符串a的字符串

  6. Jenkins中如何实现debug配置

    java -jar -Xmx512m -Dfile.encoding=UTF-8 -server -XX:-OmitStackTraceInFastThrow -server -agentlib:jd ...

  7. [TJOI2018]最长上升子序列

    Link 动态维护LIS? 观察题目:在第 i 轮操作时,将数字 i 插入 插入的数字是当前最大的 如果答案与上次不同,新的LIS必以 i 结尾 以 i 结尾的LIS无法再伸长(因为比 i 小的都插入 ...

  8. JAVA接口与类的区别

    抽象类:一个类中有抽象方法,这个类就变成了抽象类.抽象类中class的前面必须有abstract修饰符.抽象类中可以有普通方法,也可以有抽象方法,而抽象方法的个数可以是0个,也可以是多个.子类继承父类 ...

  9. 超文本标记语言(Hyper Text Markup Language):构建网页的语言

    超文本标记语言(Hyper Text Markup Language):构建网页的语言

  10. 第4组 Alpha冲刺(1/4)

    队名:斗地组 组长博客:地址 作业博客:Alpha冲刺(1/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.安排好各个组员的任务 2.收集各个组员的进度 3.写页面 4.写博客 展示Gi ...