OS实验五:动态链接库的建立与调用

本文详细介绍了Windows操作系统中动态链接库(DLL)的原理、入口函数DllMain()及其作用,以及动态链接库的两种链接方式——隐式链接和显式链接。通过实验步骤,展示了如何在Visual C++ 6.0环境下创建DLL,并使用C++编写示例函数。实验总结强调了DLL在节省内存、代码共享和跨语言调用方面的优势,鼓励读者进一步探索多语言调用DLL的实现。
摘要由CSDN通过智能技术生成

Window的内存管理
3.1 实验五:动态链接库的建立与调用
3.1.1 实验目的
(1)理解动态链接库的实现原理。
(2)掌握Windows系统动态链接库的建立方法。
(3)掌握Windows环境下动态链接库的调用方法。
3.1.2 实验准备知识:动态链接库介绍
动态链接库(Dynamic Link Library DLL)是一个可执行模块,它包含的函数可以由Windows应用程序调用以提供所需功能,为应用程序提供服务。
1.动态链接库基础知识
大型的应用程序都是由多个模块组成的,这些模块彼此协作,已完成整个软件系统的工作。其中可能有些模块的功能是通用的,被多个软件系统使用。在设计软件系统时,如果将所有模块的源代码都静态编译到整个应用程序的.exe文件中,会产生两个问题,一是应用程序过大,运行时消耗较大的内存空间,造成系统资源的浪费;二是在修改程序时,每次程序的调整都必须编译所有的源代码,增加了编译过程的复杂度,也不利于阶段性的模块测试。
Windows系统提供了非常有效的编译和运行环境,可以将独立的模块编译成较小的动态链接库文件,并可对这些动态链接库单独进行编译和测试。运行时,只有在主程序需要时才将动态链接库装入内存并运行。这样不仅减少了应用程序的大小及对内存的大量需求,而且使得动态链接库可以被多个应用程序使用,从而充分利用了资源。Windows系统中的一些主要系统功能都是以动态链接库的形式出现的,如设备驱动器等。
动态链接库文件在Windows系统中的扩展名为.dll,它由全局数据结构、若干函数组成,运行时被系统加载到进程的虚拟地址空间中,成为调用进程的一部分。如果与其他的动态链接库没有冲突,该文件通常映射到进程虚拟地址空间地址上。
2.动态链接库入口函数
DllMain()函数是动态链接库的入口函数,当Windows系统加载动态链接库时调用该函数,DllMain()函数不仅在将动态链接库加载到进程地址空间时被调用,在动态链接库进程分离时也被调用。
每个动态链接库必须有一个入口点,像用C语言编写其他应用程序时必须有一WinMain()函数一样,在Windows系统的动态链接库中,DllMain()是默认的入口函数。函数原型如下:
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
其中参数hModule为动态链接库的句柄,其值与动态链接库的地址相对应。参数ul_reason_for_call指明系统调用该函数的原因。lpReserved说明动态链接库是否需要动态加载或卸载,lpReserved为NULL表示需要动态加载或使用FreeLibrary()卸载,即运行时用到该动态库链接库时才将其装入内存,当进程不用该动态链接库时,可以使用FreeLibrary()将动态链接库卸载。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 TRUE;
}
初始化或清除工作分以下几种情况。
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_DETACH。当处理DLL_PROCESS_DETACH时,动态链接库执行与进程相关的清除操作,如堆栈的撤销等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值