1.什么是DLL
DLL,即动态链接库,是包含若干个函数的库文件,可供其他程序运行时调用。

2.DLL的优缺点
优点:代码重用,可供多个程序同时调用

缺点:易发生版本冲突
当新版本的动态链接库不兼容旧版本时,其他使用该DLL的程序可能无法正常工作。
针对这一问题,我们需要在程序中加上一个manifest文件,指明该程序所使用的DLL版本号。
此时,程序将根据manifest加载指定版本的DLL,否则按默认版本加载。

3.关于LIB和DLL
LIB,是静态链接库,分为静态lib和动态lib。
静态lib:包含函数代码声明和实现,编译后所有代码都嵌入到宿主程序中。不需要再另行调用DLL。
动态lib:相当于一个.h头文件,它是对实现部分(.DLL)的导出部分的声明。编译后宿主程序也只包括声明部分。运行时需调用相应的DLL文件。

4.DLL编写
1)在vs中,选择“文件”-》“新建”-》“项目”,选择“Visual C++”-》“win32项目”,来创建DLL类库。
如下图所示:

2)添加头文件(.h)和源文件(.cpp)
mydll.h

extern "C" _declspec(dllexport) int add(int a, int b); 

extern关键字:函数可以在本模块或其他模块中使用;
"C":表明函数必须按C语言方式进行编译,因为C++支持函数的重载,编译时会对函数名进行更改(按照函数名+参数类型),
       所以需要声明"C",以便链接时能正确找到相应的函数。
_declspec(dllexport)关键字:该函数可以从DLL中导出,程序引入DLL时,只有声明了该关键字的函数,才能导入使用

mydll.cpp

#include "mydll.h"
int add(int a, int b) //该DLL需要导出的函数功能:加法
{
return a + b;
}

编译后,我们可以在生成目录中找到相应的DLL文件和LIB文件。

mydll.dll,mydll.lib

5.DLL调用
调用DLL有两种方式。
1)显式链接(只使用DLL)

特点:不需要使用相应的lib文件,可随时加载和卸载DLL,方便灵活。

void main(void)
{
typedef int(*padd)(int a,int b);
HINSTANCE hDLL;
padd add;
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
add=(padd)GetProcAddress(hDLL,"add");
int result=add(,);
Printf("计算的结果为%d\n",result);
FreeLibrary(hDLL);//卸载MyDll.dll文件;
}

上例通过LoadLibray()将DLL加载到当前的应用程序,并返回当前DLL文件的句柄。
然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,
函数调用完毕后,使用FreeLibrary()卸载DLL文件。

2)隐式链接(使用LIB,DLL)

特点:程序开始执行时将DLL文件加载到应用程序中,程序结束后,释放DLL。

#pragma comment(lib,"MyDll.lib")
extern "C"_declspec(dllimport) int add(int a,int b);
void main()
{
int a;
a=add(,)
printf("计算的结果为%d\n",a);
}

#pragma comment是预处理指令,使得链接器在链接库的时候去找"MyDll.lib"这个库。

Windows动态链接库DLL的更多相关文章

  1. Golang编写Windows动态链接库(DLL)及C调用范例

    一.准备. 1.GoLang在1.10版本之后开始支持编译windows动态链接库,可以打开命令行工具使用go version 查看自己的go版本. 2.你的电脑上需要gcc,如果没有的话[点击这里] ...

  2. Windows 动态链接库DLL使用

    转载:https://blog.csdn.net/heyabo/article/details/8721611 转载:https://www.cnblogs.com/jin521/p/5598529. ...

  3. Windows Phone 8加载外部动态链接库DLL(非安装包内的)

    Windows Phone 8加载外部动态链接库DLL(非安装包内的) 在<动态加载与插件化>中大概介绍了下,wp8加载非安装包的下动态链接库,这次详细梳理下. 加载外部DLL主要的原理: ...

  4. Windows动态链接库:dll与exe相互调用问题

    本文回顾学习一下Windows动态链接库:dll与exe相互调用问题.一般滴,exe用来调用dll中的类或函数,但是dll中也可以调用exe中的类或函数,本文做一些尝试总结. dll程序: Calcu ...

  5. VC++动态链接库(DLL)编程深入浅出(zz)

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

  6. VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

    转自:http://blog.csdn.net/testcs_dn/article/details/27237509 本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链 ...

  7. delphi 2010 动态链接库DLL断点调试

    DELPHI 2010 动态链接库DLL断点调试 马根峰 (广东联合电子服务股份有限公司,广州 510300) 摘要:本文详细介绍了Delphi 2010中的动态链接库DLL断点调试技术 关键词:DE ...

  8. MinGW gcc 生成动态链接库 dll 的一些问题汇总 (补充)

    我以前写过一个小短文,介绍MinGW gcc 生成动态链接库 dll 的一些问题.当时写的并不全面.近期又遇到写新的问题.这里记录一下,做个补充. 通常情况下,dll 中的函数假设採用 _stdcal ...

  9. 动态链接库dll,静态链接库lib, 导入库lib

    转载地址:http://www.cnblogs.com/chio/archive/2008/08/05/1261296.html 目前以lib后缀的库有两种,一种为静态链接库(Static Libar ...

随机推荐

  1. “java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp”

    最近在项目中使用hibernate查询时,总报错“java.sql.SQLException: Value '0000-00-00' can not be represented as java.sq ...

  2. 使用 VisualVM 进行性能分析及调优

    VisualVM 是一款免费的性能分析工具.它通过 jvmstat.JMX.SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态 ...

  3. 数据结构 《5》----二叉搜索树 ( Binary Search Tree )

    二叉树的一个重要应用就是查找. 二叉搜索树 满足如下的性质: 左子树的关键字 < 节点的关键字 < 右子树的关键字 1. Find(x) 有了上述的性质后,我们就可以像二分查找那样查找给定 ...

  4. MongoDB索引、聚合

    用$where可以执行任意的js作为查询的一部分. db.foo.find({"$where" : function(){          for(var current in ...

  5. iOS打包为ipa的两种方式和生成P12证书的方式

    iOS项目打包为ipa的两种方式: 准备工作:先行在Xcode里面打开preferences,填写apple id. 通过iTunes+Xcode 在Xcode里,把模拟器调整为iOS Device, ...

  6. IOS 作业项目(4)步步完成 画图 程序(中续)

    一,程序布局整理 前言://1,程序启动//2,程序流程框架//3,程序界面一致//4,程序界面功能, //这里只做页面的固定功能, //在首次创建界面时,我们会指定好固定事件触发前的固定方法 //至 ...

  7. Oracle修改字段类型方法总结(转)

    有一个表名为tb,字段段名为name,数据类型nchar(20). 1.假设字段数据为空,则不管改为什么字段类型,可以直接执行:alter table tb modify (name nvarchar ...

  8. Web页面性能测试工具浅析

    http://www.cnblogs.com/fo0ol/p/3297054.html 做Web开发,难免要对自己开发的页面进行性能检测,自己写工具检测,工作量太大.网上有几款比较成熟的检测工具,以下 ...

  9. typeof、offsetof、container_of的解释

    链表是内核最经典的数据结构之一,说到链表就不得不提及内核最经典(没有之一)的宏container_of. container_of似乎就是为链表而生的,它的主要作用是根据一个结构体变量中的一个域成员变 ...

  10. javascript 中 typeof 的使用

    javascript 中 typeof 的使用 javascript有五种基本的数据类型(简单数据类型),它们分别是:String.Undefined.Null.Boolean和Number.还有一种 ...