DLLWord文档格式.docx
- 文档编号:21788417
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:8
- 大小:18.66KB
DLLWord文档格式.docx
《DLLWord文档格式.docx》由会员分享,可在线阅读,更多相关《DLLWord文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
反正ctrl+c、ctrl+v的事。
可还是麻烦不是,于是,DLL就顺势而生了。
DLL提供接口供我们使用,我们要做的只是要用的时候导入就好了,至于怎么导入,我们下面再谈。
说白了:
DLL就是封装好的,使用特定方法运行的类。
提前声明,本文在VS环境下教学。
一、静态库和动态库
可能有人会有疑问,静态库又是什么?
唉,都是一样的,他们都是提供功能给我们用,就是有时候要考虑效率啊、资源的东东,因此才有什么静态库、动态库的出现,编程之所以如此复杂,就是因为懒人出现太多,他们为了方便自己设计出了一大堆乱七八糟的东西,他们自己是方便了,不懂的就纠结了。
要想详细的区分静态库与动态库,就要对项目的编译和运行有足够的了解。
静态库在编译时就制这些函数和数据,把它们和应用程序的其它模块组合起来,创建最终的可执行文件(.exe),发布产品时只需发布可执行文件,不需要发布静态库;
动态库编译链接时不复制,运行时才加载(将DLL映射到进程的地址空间中),然后访问导出函数。
发布产品时除了可执行文件,还要有动态链接库。
哪一种比较好?
这个高深的问题,有兴趣的请访问:
简单的说下就是,合适的时候是最好的,不然编程世界也不会出现这么多东西,还***的没用到的一大堆。
二、静态库的使用方法
既然说到静态库,我们就简单的谈谈静态库的使用,也让跟我一样的初学者对比下,有什么不同。
关于库,不管是静态库还是动态库,都只是两个要点:
导出与导入。
静态库的导出
首先我们要新建一个静态库,要注意了,库是属于WIN32项目,但WIN32项目分:
windows应用程序、控制台应用程序、DLL(动态链接库)、静态库。
怎么建一个静态库,会了吧,选空项目就好了。
假设我们要写一个加法的静态库供人使用,怎么写?
//lib.h(头文件)
Extern“C”intadd(intx,inty)
//lib.cpp
Intadd(intx,inty)
{
Returnx+y;
}
编译,好了~~~~~
乍看,跟我们平时写函数没什么两样,靠、本来就没什么不同,只是这个项目的类型是静态库,因此生成的时候,在DEBUG里面,我们看到的是XXX.lib文件,而不是XXX.exe。
这个生成的lib就是我们到处的静态库了。
导入静态库
我们已经生成了,静态库,现在,我们要使用它。
我们新建一个普通的控制台项目,新建main.cpp
//main.cpp
#include<
stdio.h>
lih.h>
//将上个项目的头文件拷贝到项目里
#pragmacomment(lib,”xxx.lib”)//XXX就是上面建的静态库的名字,lib文件也要拷贝到项目了
Intmain()
Printf(“2+3=%d\n”,add(2,3));
Return0;
好了,这样,我们就简单的使用了一个我们自己所建立的静态库。
导入静态库除了用代码导入,还可以直接用VS或者VC导入,在项目、属性、连接器、输入里面就可以设置,跟.h文件一样,我们都可以直接使用IDE进行关联依赖。
狠多项目也是这种做法。
静态库我们就简单的讲完了,接下去,我们重点讲讲动态库
三、动态库的使用
DLL,DynamicLinkableLibrary。
动态链接库
动态库我们也是从导入、导出来讲解,毕竟我们就是这么用的。
我们分三种来讲动态库使用:
导出函数、导出类、导出变量。
1导出函数;
导出动态库
同样,我们新建lib.h、lib.cpp、main.cpp两个项目三个文件来简单的学习如何导出函数。
//lib.h
extern"
C"
int__declspec(dllexport)add(intx,inty);
导入动态库
//main.cpp//动态导入,使用load、get、free。
windows.h>
Typedefint(*AddFun)(int,int);
//函数指针
HINSTANCEhDll;
hDll=LoadLibrary(“xxx.dll”);
//将dll拷贝到项目里
AddFunaddfun;
Addfun=(AddFun)GetProcAddress(hDll,”add”)
Printf(“3+3=%d\n”,addfun(3,3));
FreeLibrary(hDll);
//使用完毕,free
到这里,我们简单的对比下,动态库与静态库的区别。
首先,导出的时候,多了个关键字__declspec(dllexport),这是干嘛的?
这是MS定义的宏,用来标志DLL的导出与导入而已,有兴趣的可以详细的去了解了解,导入则是__declspec(dllimport).
其次,在导入动态库的时候,我们定义了函数指针,可以不定义吗?
不可以,动态导入动态库的时候,我们需要定义指针去接收函数,我们可以简单的认为,DLL提供了接口,我们需要去重载它,当然,我们不需要去实现,直接能用。
最后,load的是.DLL文件,而不是lib文件。
接下去,我们看看静态导入的方法,也是比较常用的方法。
//main.cpp静态导入
#pragmacomment(lib,”xxx,lib”)//动态库也会生成lib文件,要拷贝到项目里,dll文件也要,只是他跟静态库产生的lib在内容上有些不同,有兴趣的可以深入研究
Extern“C”__declspec(dllimport)add(intx,inty);
Printf(“2+3=%d\n”,add(2,3));
OK了,简单不。
我们来看看,静态导入和动态导入有什么区别。
首先,看起来简便了很多。
其次,他们都需要做个函数声明。
还好,现在函数比较简单,可是接下去的导出类呢?
天,难道我们要写一大段的类声明吗,那DLL还能简化我们代码的书写吗,太糟糕了,有木有。
从代码上,是需要的,当然,聪明的我们只要对头文件做一个简单的优化,然后引用头文件就OK了,反正类的定义都是在头文件,对吧,,,且看真相。
2导出类;
一样的,我们用三个文件,神奇的文件,lib.h、lib.cpp、main.cpp。
#ifdefLIB_DLL
Class__declspec(dllexport)Add
#else
Class__declspec(dllimport)Add
#endif
//想一想,如果我们包含这个头文件,代码是怎么执行的,是执行哪一句,如何让它执行另一句,会有什么方便之处。
Public:
Ints;
Add();
IntSum(intx,inty);
#ifndefLIB_DLL
#defineLIB_DLL
#endif//现在引用头文件,代码会怎么执行?
#include”lib.h”
Add:
:
Add()
S=0;
IntAdd:
Sum(intx,inty)
S=x+y;
Returns;
//mian.cpp
#include”lib.h”//头文件要拷贝过来,或者用VS直接包含,这边会怎么执行?
//#pragmacomment(lib,”xxx,lib”)
//也可以使用VS直接包含.lib,.dll不用就XX吧,,哇咔咔
Addtem;
Printf(“3+3=%d\n”,tem.sum(3,3));
狠简单,有木有,导出类。
其实跟导出函数差不多,就是类比较常用,顺便写个例子上去
3导出变量;
一般用于导出全局变量,
首先,3个神奇的文件
ExternintdllGlobalVar;
IntdllGlobalVar;
BOOLAPIENTRYDllMain(HANDLEhModule,DWOREul_reason_for_call,LPVOIDlpReserved)
Switch(ul_reason_for_call)
{
CaseDLL_PROCESS_ATTACH:
dllGlobalVar=100;
break;
CaseDLL_THREAD_ATTACH:
CaseDLL_THREAD_DETACH:
CassDLL_PROCESS_DETACH:
Break;
Returntrue;
//lib.def//此种导出方法,需要第四个文件,def模块定义文件,不仅可以用来导出变量,也能用于导出函数、导出类,具体的用法,可以去XX,至于上面的DLLMAIN函数,就是库的入口函数,相当于main函数
LIBRARYVar
EXPORTS
dllGlobalVarDATA
#pragmacomment(lib,”var.lib”)
//externint_declspec(dllimport)dllGlobalVar;
Printf(“%d\n”,(*int*)dllGlobalVar);
//这种方法导出的并不是变量本身,而是DLL中变量的指针,可以采取dllimport的导入方法,直接使用
//printf(“%d\n”,dllGlobalVar);
Return0;
至此,DLL基本的用法已经讲解完毕。
DLL其实分:
非MFCDLL、MFC规则DLL、MFC扩展DLL
详细的我就不做深入的讨论了,有兴趣的可以继续深入研究,比如DLLMAIN的,就算你不知道也能用了,但DLL作为常用的组件方法,希望大家好好学习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DLL