VS2015_动态链接库学习

非MFC动态链接库

创建一个名为ex1的Win32项目
841277-20170818215612850-1144704481.png
创建一个DLL项目,保留预编译的头文件
  841277-20170818215613115-1724175298.png

 默认文件

创建完成项目之后,包含几个默认的文件
  841277-20170818215613443-1081559569.png
stdafx.h文件用于包含标准系统包含的头文件
841277-20170818215613756-432050744.png
 对应于stdafx.cpp文件,主要包含stdafx.h的头文件
841277-20170818215614225-1884580180.png
 targetver.h主要用于定义dll可以使用的最高的Windows版本
841277-20170818215614662-1418137083.png
 dllmain.cpp用于定义dll的程序入口点
841277-20170818215615068-1526465206.png
 dllmain函数是加载dll时候的入口函数
 
创建ex1.h文件,定义导出的变量和导出的函数
841277-20170818215615318-667240885.png
  可以快速创建文件,在dllmain.cpp中定义add和sub的函数
  841277-20170818215615646-1256814552.png
   可以修改dllmain.cpp文件,定义程序入口函数处,设置Num=100
  841277-20170818215616006-1112071466.png
 编译函数,得到dll文件
841277-20170818215616412-1939465142.png

 使用Dependency查看DLL的情况

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

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被卸载
  841277-20170818215617771-1382932846.png

 DLL库的调试

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

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

DLL生成的时候,会配套生成一个LIB文件,这个文件中定义了DLL的变量和函数
DLL加载的过程中,Windows将按照如下的顺序来定位DLL
- 包含EXE文件的目录
- 进程的当前工作目录
- Windows系统目录
- Windows目录
- 列在PATH环境变量中的一系列目录
将LIB库文件添加到项目中,一共有3中方法
1.通过属性配置附加依赖项
841277-20170818215619053-1438684843.png
 加载完成后,声明一下来自外部的函数,即可在后文去应用这些函数了
  841277-20170818215619787-643013619.png
 2.通过程序代码中添加LIB文件导入
先删除程序配置中的附加依赖项,然后尝试编译,发现无法通过编译
841277-20170818215620287-247493308.png
在语句中添加LIB导入内容
841277-20170818215620803-1245390403.png
这里需要注意的是,附加目录库需要指定
841277-20170818215621443-146377190.png
   3.通过文件的方式直接添加LIB文件
841277-20170818215622053-2018154335.png
 

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

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

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


 使用非MFC DLL 导出类

如果建立的DLL不需要使用MFC,为了节约磁盘和内存空间,可以建立非MFC动态库
创建一个ex2的非MFC动态链接库
841277-20170818215622865-619469135.png
新建一个头文件ex2.h,在这个头文件中定义一个类
841277-20170818215623506-544835747.png
 使用Dependency可以查看类的导出内容,比较复杂,所以不适合使用def的方式进行
841277-20170818215624037-2032583574.png
 为了测试我们的DLL,新建一个Console工程进行测试
841277-20170818215624396-314181489.png
如果要调用lib文件,可以使用Solution的相对路径来完成项目库的导入操作
841277-20170818215624834-752255872.png
 


 

 
 




转载于:https://www.cnblogs.com/EltonLiang/p/7392410.html

使用VS2015编译和调用动态链接库dll 1. 首先建工程,选择dll,记得勾上“导出符号” 后面不用自己搞那些宏定义会省事很多。 建立工程myDll,记得勾上“导出符号” 类型选择dll 2. IDE自动生成的代码已经把整个架构弄好了,其中和项目同名的.h和.cpp文件就是我们自己写代码的地方了。我想写的dll是导出一个类,在这里我就直接在它自动生成的CmyDll类上面改了。 myDll.h myDll.cpp 在mydll.h和mydll.cpp中给类添加成员函数 //mydll.h class MYDLL_API CmyDll { public: CmyDll(void); // TODO: 在此添加您的方法。 int myFunction(int a, int b); }; //mydll.cpp int CmyDll::myFunction(int a, int b) { return a*b; } 3.编译的时候我选择了release,这里可以用默认的debug也行 在mydll.h和mydll.cpp中给类添加成员函数 最后生成解决方案后产生的mydll.lib和mydll.dll就是我们需要的二进制文件了。lib文件是编译是要用的,而dll是调用这个库的程序运行时需要的。 调用dll 1.重新建立一个工程 这回选择普通的控制台程序就行了。我建了个名为myDllCall的工程。 2.把库的头文件include进来,以及连接lib文件 其中 include进来的 myDll.h 和 **#pragma comment()**的lib根据自己的路径写。 #include "stdafx.h" #include "../../myDll/myDll/myDll.h" //头文件 #pragma comment(lib,"../../myDll/Release/myDll.lib") //调用自己写的外部库 #include int main() { CmyDll mydll; int a, b; std::cin >> a >> b; std::cout << mydll.myFunction(a, b) <> a >> b; std::cout << mydll.myFunction(a, b) << std::endl; return 0; } 3.dll放到可执行文件同一目录下面 刚刚的代码直接编译没问题,运行会报错. 直接编译没问题,运行会报错 原因是dll要和生成的可执行文件在同一个目录下,我把mydll.dll放进去之后就解决了。 我们成功的在自己的工程里调用了外部的类 可以看到我们成功的在自己的工程里调用了外部的类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值