非MFC动态链接库

创建一个名为ex1的Win32项目

创建一个DLL项目,保留预编译的头文件
 

默认文件

创建完成项目之后,包含几个默认的文件
 
stdafx.h文件用于包含标准系统包含的头文件

 对应于stdafx.cpp文件,主要包含stdafx.h的头文件

 targetver.h主要用于定义dll可以使用的最高的Windows版本

 dllmain.cpp用于定义dll的程序入口点

 dllmain函数是加载dll时候的入口函数
 
创建ex1.h文件,定义导出的变量和导出的函数

 可以快速创建文件,在dllmain.cpp中定义add和sub的函数
 
  可以修改dllmain.cpp文件,定义程序入口函数处,设置Num=100
 
 编译函数,得到dll文件


使用Dependency查看DLL的情况

如果没有找到可以独立下载:http://www.dependencywalker.com/ 
发现我们定义好的函数和变量
这里的Function定义都有明确的含义,C++默认使用__cdecl调用的约定 

DLLMain函数
Windows在加载DLL的时候,需要一个入口函数,即DLLMain函数。如果没有为DLL编写一个DLLMain函数,则系统会自动引入一个不做任何处理的默认DLLMain函数
函数内部根据dll被加载的原因进行不同的操作
名称 作用 备注
DLL_PROCESS_ATTACH 进程被调用,DLL被连接到当前进程并被初始化
DLL_THREAD_ATTACH 当前进程创建一个新线程,DLL在新线程内被调用
DLL_PROCESS_DETACH 调用DLL的进程被终止,DLL被卸载
DLL_THREAD_DETACH 调用DLL的线程被终止,DLL被卸载
 

DLL库的调试

由于dll文件不能单独调试,所以需要创建一个调试dll工程的project,这里创建一个Win32的控制台应用程序
创建完成后,将这个项目设置为启动项

应用过程使用隐式链接方式调用ex1.dll文件

DLL生成的时候,会配套生成一个LIB文件,这个文件中定义了DLL的变量和函数
DLL加载的过程中,Windows将按照如下的顺序来定位DLL
- 包含EXE文件的目录
- 进程的当前工作目录
- Windows系统目录
- Windows目录
- 列在PATH环境变量中的一系列目录
将LIB库文件添加到项目中,一共有3中方法
1.通过属性配置附加依赖项

 加载完成后,声明一下来自外部的函数,即可在后文去应用这些函数了
 
 2.通过程序代码中添加LIB文件导入
先删除程序配置中的附加依赖项,然后尝试编译,发现无法通过编译
在语句中添加LIB导入内容

这里需要注意的是,附加目录库需要指定

  3.通过文件的方式直接添加LIB文件

 

应用工程以显示连接方式调用ex1.dll文件

显示调用需要使用代码的方式链接dll,使用显式链接方式可以在应用程序执行过程中随时加载DLL,也可以随时卸载DLL,这是隐式无法做到的。
好处:可以在启动程序时,不必将所有的应用DLL一起加载到DLL内存中,只有在使用某个DLL的时候才会载入,这样可以减少应用程序初始化加载的时间,可以降低内存的使用

这里暂时不做过多深入,等后续需要的使用继续学习



使用非MFC DLL 导出类

如果建立的DLL不需要使用MFC,为了节约磁盘和内存空间,可以建立非MFC动态库
创建一个ex2的非MFC动态链接库
新建一个头文件ex2.h,在这个头文件中定义一个类

 使用Dependency可以查看类的导出内容,比较复杂,所以不适合使用def的方式进行

 为了测试我们的DLL,新建一个Console工程进行测试

如果要调用lib文件,可以使用Solution的相对路径来完成项目库的导入操作

 


 

 
 

VS2015_动态链接库学习的更多相关文章

  1. Linux 动态链接库学习笔记

    参考资料: http://www.linuxidc.com/Linux/2012-01/50739.htm http://www.yolinux.com/TUTORIALS/LibraryArchiv ...

  2. java 用JNA调用dll 参考文档

    1  Java调用C语言动态库(JNA方式):回调函数.结构体数组传参.结构体数组返回 2jna结构体数组  JNA结构体数组 3JNA调用C语言动态链接库学习实践总结 4 Java 通过 JNA 调 ...

  3. 文本分类学习 (十)构造机器学习Libsvm 的C# wrapper(调用c/c++动态链接库)

    前言: 对于SVM的了解,看前辈写的博客加上读论文对于SVM的皮毛知识总算有点了解,比如线性分类器,和求凸二次规划中用到的高等数学知识.然而SVM最核心的地方应该在于核函数和求关于α函数的极值的方法: ...

  4. 孙鑫MFC学习笔记19:动态链接库

    1.动态链接库 2.静态库和动态库 3.使用动态链接库的好处 4.动态链接库编译需要导出,使用需要导入 __declspec(dllexport),__declspec(dllimport) 5.动态 ...

  5. 动态链接库(Dynamic Link Library)学习笔记(附PE文件分析)

    转载:http://www.cnblogs.com/yxin1322/archive/2008/03/08/donamiclinklibrary.html 作者:EricYou 转载请注明出处   注 ...

  6. JAVA调用动态链接库DLL之JNative学习

    package com.ehfscliax; import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import ...

  7. LoadRunner 脚本学习 -- 使用动态链接库

    DLL = Dynamic Link Library DLL最重要的一个特点就扩展应用程序的特性. 再强大的工具也有不是万能的,通过调用动态库的方法极大地增强loadrunner的功能.当你在用loa ...

  8. Linux学习日记-(一)

    一.为什么学习Linux 大学时开始接触Linux,最开始学习的是RedHat(小红帽),感觉Linux好像很久不见的老朋友,用起来很舒服(虽然我们用的是DotNet).很喜欢它的命令模式,让我能接触 ...

  9. [机器学习] 深度学习之caffe1——软件配置与测试

    caffe的编译配置真的是很让人头疼啊,不知道试过多少次了~~~ 重装系统了七八次,搞得linux的一些常用命令倒是很熟悉了~~~ 我有洁癖~~~某一个点上出了错,我一定要把它搞好了,再重新来一次,我 ...

随机推荐

  1. 【数据库_Postgresql】sql查询结果添加序号列

    ROW_NUMBER () OVER (ORDER BY A .ordernumber ASC) AS 序号

  2. (三)MySQL学习笔记

    [Leecode]175. 组合两个表 解答:由于是组合两个表的信息,很容易想到连接查询,这里使用左连接 select p.Firstname,p.Lastname,q.City,q.State fr ...

  3. 【刷题】BZOJ 1951 [Sdoi2010]古代猪文

    Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...

  4. 【总结】Link-Cut Tree

    这是一篇关于LCT的总结 加删边的好朋友--Link Cut Tree Link-Cut Tree,LCT的全称 可以说是从树剖引出的问题 树剖可以解决静态的修改或查询树的链上信息:那如果图会不断改变 ...

  5. 【UOJ#188】Sanrd(min_25筛)

    [UOJ#188]Sanrd(min_25筛) 题面 UOJ 题解 今天菊开讲的题目.(千古神犇陈菊开,扑通扑通跪下来) 题目要求的就是所有数的次大质因子的和. 这个部分和\(min\_25\)筛中枚 ...

  6. python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数

    1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  7. 【mysql】测试方案整理

    http://www.cnblogs.com/callhe/ https://www.digitalocean.com/community/tutorials/how-to-measure-mysql ...

  8. 「Linux」centos7安装uWSGI

    一定要记得先安装python-devel,再安装uWSGI,否则即使安装成功也是不能使用的,切记切记

  9. sqlserver 2008连接

    初次安装使用SQL server 2008时,可能会遇到无法连接到(local)的情况.那么,如何解决此问题?   工具/原料   SQL server 2008 方法/步骤   1 打开SQL se ...

  10. DES加密解密类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...