转载: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. Python学习日记(三十八) Mysql数据库篇 六

    Mysql视图 假设执行100条SQL语句时,里面都存在一条相同的语句,那我们可以把这条语句单独拿出来变成一个'临时表',也就是视图可以用来查询. 创建视图: CREATE VIEW passtvie ...

  2. Top命令数据分析

    一.top命令详解 当前时间 20:27:12 当前系统运行时间 3:18秒 1个用户 系统负载平均长度为 0.00,0.00,0.00(分别为1分钟.5分钟.15分钟前到现在的平均值) 第二行为进程 ...

  3. tomcat日志分割

    1.下载(最新版本)并解压,cd进入安装目录 #  wget http://cronolog.org/download/cronolog-1.6.2.tar.gz # tar zxvf cronolo ...

  4. geany写C语言,printf打印中文时显示乱码

    原因 geany设置了编码格式为utf8 运行时显示出的cmd窗口编码格式为GBK 解决方法 要么修改geany编码,要么修改cmd窗口编码. 修改geany编辑器为GBK编码格式 编辑=>首选 ...

  5. Educational Codeforces Round 67 D. Subarray Sorting

    Educational Codeforces Round 67 D. Subarray Sorting 传送门 题意: 给出两个数组\(a,b\),现在可以对\(a\)数组进行任意次排序,问最后能否得 ...

  6. python测试开发django-66.图片403forbidden

    前言 用 django 开发 web 页面,在 HTML 页面上添加图片时,发现本地图片可以正常显示,但是添加一个互联网的图片,却不能正常显示. 本地 static 图片 先在本地 static 放一 ...

  7. 20180523模拟赛T1——前缀?

    (a.cpp/c/pas) Time Limit:1 Sec Memory Limit:128 MB 简化版题意 jyt毒瘤,写了超长的题面,要看完整题面的翻到最后-- 老太太认为一个长度为 N 的仅 ...

  8. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  9. Entity 类中加了@Id 注解后仍然出现org.hibernate.AnnotationException: No identifier specified for entity 错误

    查看网上的资料,应该是报错的实体类com.example.domain.p.User中没有添加加主键的注解@Id,这个是必须的.但是我的实体类中明明已经添加了@Id,为什么还会报这个错误呢? 后来检查 ...

  10. js spread object

    What’s is the benefit / drawback of these two alternatives? Using object spread options = {...option ...