- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验五:动态链接库的建立与调用
1、实验目的
理解动态链接库的实现原理。
掌握Windows系统动态链接库的建立方法。
掌握Windows环境下动态链接库的调用方法。
2、相关知识介绍
动态链接库是一个可执行模块,它包含的函数可以由Windows应用程序调用以提供所需功能,为应用程序提供服务。
2.1动态链接库基础知识
大型的应用程序由很多模块组成,这些模块彼此协作,以完成整个软件系统的工作。其中可能有些模块的功能是通用的,被多个软件系统使用。在设计软件系统时,如果将整个模块的源代码都静态编译到整个应用程序.exe文件中,会产生两个问题,一是应用程序过大,运行时消耗较大的内存空间;二是在修改程序时,每次程序的调整都必须编译所有的源代码,这个增加了编译过程的复杂度。
Windows提供的动态链接库,可以将独立的模块单独编译和测试,生成动态链接库,运行时,只有在主程序需要时,才将动态链接库装入内存并运行。这样,不仅减少了应用程序的大小及对内存的大量需求,而且动态链接库可以被多个应用程序使用,从而充分利用了资源。Windows系统中一些主要的系统功能都是以动态链接库的形式出现的,如设备驱动程序等。
动态链接库文件在Windows系统中的扩展名为.dll。它由全局数据结构、若干个函数组成,运行时被加载到进程的虚拟地址空间,成为调用进程的一部分。
2.2 动态链接库入口函数
DLLMain( )函数是动态链接库的入口函数,当Windows系统加载动态链接库时调用该函数,同时在动态链接库与进程分离时也调用函数,每个动态链接库必须有一个入口点。就像c语言编程应用程序时必须有main( )函数一样,在Windows系统的动态链接库中DLLMain( )是默认的入口函数。
原型:
BOOL APIENTRY DllMain (HANDLE hModule,DWORD ul_reaseon_for_call, LPVOID lpReserved)
{
Return true;
}
参数说明:
hMode:动态链接库句柄,其值与动态链接库的地址相对应
ul_reason_for_call:系统调用该函数的原因
lpReserved:说明动态链接库是否需要动态加载或卸载。为NULL表示动态加载和卸载,否则表示静态加载,进程装入内存时同时加载链接库,进程终止时才卸载。
使用入口函数还可以做一些初始化工作,如分配额外的内存或其他资源,在撤销时做一些清除工作,如回收占用的内存或其他资源。需要做初始化或清除工作时,DllMain( )函数格式如下:
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
Switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH
break;
}
return TURE;
}
初始化或清除工作分以下几种情况
DLL_PROCESS_ATTACH
当动态链接库被初次映射到进程的地址空间时,系统将调用该动态链接库的DLLMain( )函数,给它传递参数ul_reason_for_call的值DLL_PROCESS_ATTACH。当处理DLL_PROCESS_ATTACH时,动态链接库应执行动态链接库函数要求的任何与进程相关的初始化工作,如动态链接库堆栈的建立等。当初始化成功时,DllMain( )返回TRUE,否则返回FALSE,并终止整个进程的执行。
DLL_PROCESS_DETACH
当动态链接库与进程分离时,系统将调用该动态链接库的DLLMain( )函数,给它传递参数ul_reason_for_call的值DLL_PROCESS_DEATTACH。动态链接库执行与进程相关的清除操作,如堆栈的撤销等等。
DLL_THREAD_ATTACH
DLL_THREAD_DETACH
2.3 动态链接库导入/导出函数
动态链接库文件中包含一个导出函数表,这些导出函数由它们的符号名和标识号被唯一地确定,导出函数表中还包含了动态链接库中的函数地址。当应用程序加载动态链接库时,通过导出函数表中各个函数的符号名和标识号找到该函数的地址。如果重新编译动态链接库文件,并不需要修改调用动态链接库的应用程序,除非改变了导出函数的符号名和其他参数。
在动态链接库源程序文件中声明导出函数的写法如下:
原型:
_ _declspec(dllexport) MyDLLFunction (int x ,int y)
其中_ _declspec(dl
文档评论(0)