转载: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绘图 转

    Python有很多可视化工具,本篇只介绍Matplotlib. Matplotlib是一种2D的绘图库,它可以支持硬拷贝和跨系统的交互,它可以在Python脚本.IPython的交互环境下.Web应用 ...

  2. mysql 5.7.25中ibtmp1文件过大

    问题描述 生产环境linux suse11.4, 根目录/ 下大小:50G, ibtmp1大小:31G, 磁盘空间爆满100%告警. ibtmp1文件说明 ibtmp1是非压缩的innodb临时表的独 ...

  3. 微信小程序 子组件调用父组件方法

    原文连接   --->  https://blog.csdn.net/qq_40190624/article/details/87972265 组件 js:  var value = 123; ...

  4. .DS_Store文件是什么?Mac系统如何彻底清除该文件?

    用过Mac OS系统的都会注意到一个名为.DS_Store的隐藏文件,尤其是zip格式的压缩包解压的出来,会出现在各种文件夹内,非常烦人! 特别是把文件分享给使用windows的朋友的时候,这些文件会 ...

  5. 【VNCserver】Centos7.4安装VNC连接华为云或亚马逊云

    1.1 文档背景 CentOS 7 / RHEL 7部署图形化界面 安装VNCserver实现linux系统云主机桌面化,通过普通用户实现桌面化操作 2.  Vncserver服务端部署 2.1 安装 ...

  6. linux下activemq安装与配置activemq-5.15.2

    linux下activemq安装与配置 前提 配置好jdk环境   一.下载:apache-activemq-5.15.2-bin.tar.gz https://archive.apache.org/ ...

  7. .NET CORE 升级3.0遇到的问题the project must provide a value for configuration

    将.NET Core 2.2应用程序迁移到Core 3.0时遇到了the project must provide a value for configuration的问题.原来在.proj项目文件文 ...

  8. 【比赛游记】(THUPC,CTS,APIO)2019四连爆蛋记

    5 月 11 日 坐飞机来到帝都,报道 THUPC. 试机题有皮配,不会. 晚上吃全聚德,喝星巴克.奢侈. 5 月 12 日 早上打 THUPC. 咕到 9 点半开始,到 2 点半结束.

  9. 团队项目评审&课程学习总结

    一:实验名称:团队项目评审&课程学习总结 二:实验目的与要求 (1)掌握软件项目评审会流程: (2)反思总结课程学习内容. 三:实验步骤 任务一:按照团队项目结对评审名单,由项目组扮演乙方,结 ...

  10. Discuz通过修改文章标题更好的实现SEO的方法

    找到: /source/module/forum/forum_viewthread.php 代码如下: $navtitle = get_title_page($_G['forum_thread'][' ...