操作系统实验:动态链接库的建立与调用

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


一、实验目的

(1)理解动态链接库的实现原理。
(2)掌握Windows系统动态链接库的建立方法。
(3)掌握Windows环境下动态链接库的静态和动态调用方法。

二、实验准备

(1).建立动态链接库工程:
	Microsoft Visual C++ 6.0环境下选择File->New命令,然后再Project选项卡中选择Win32 Dynamic-Link Library建立一动态链接库工程文件,输入工程文件名,选择工程文件名所在路径,选择完毕单击确定按钮。
(2).动态链接库的相关知识:
	1.动态链接库(Dynamic Link Library DLL)是一个可执行模块,它包含的函数可以由Windows应用程序调用以提供所需功能,为应用程序提供服务。
    2.原理:Windows系统提供了非常有效的编译和运行环境,可以将独立的模块编译成较小的动态链接库文件,并可对这些动态链接库单独进行编译和测试。运行时,只有在主程序需要时才将动态链接库装入内存并运行。这样不仅减少了应用程序的大小及对内存的大量需求,而且使得动态链接库可以被多个应用程序使用,从而充分利用了资源。
    3.动态链接库入口函数:DllMain()函数是动态链接库的入口函数,当Windows系统加载动态链接库时调用该函数,DllMain()函数不仅在将动态链接库加载到进程地址空间时被调用,在动态链接库云进程分离是也被调用。
    BOOL  APIENTRY  DllMain
        (HANDLE  hModule,				动态链接库的句柄
         DWORD  ul_reason_for_call, 	系统调用该函数的原因
         LPVOID  lpReserved )			说明动态链接库是否需要动态加载或卸载
       {
        return  TRUE;
       }
	4.动态链接库导入/导出函数:在SimpleDll工程的Debug目录下,可以看到 SimpleDll.dll和 SimpleDll.lib 两个文件,其中SimpleDll.dll是编译生成的动态链接库可执行文件,SimpleDll.lib 就是导入/导出库文件,该文件中包含SimpleDll.dll文件名和SimpleDll.dll中的函数名Add()和 Sub(),SimpleDll.lib 是文件SimpleDll.dll的映像文件,在进行隐式链接时要用到它。
    5.动态链接库的两种链接方式:当应用程序调用动态链接库时,需要将动态链接库文件映射到调用进程的地址空间中。映射方法有两种:
        一种是应用程序的源代码只引用动态链接库中包含的符号,当应用程序运行时,加载程序隐式地将动态链接库装入到进程的地址空间中,这种方法也称隐式链接;
        另一种方法是应用程序运行时使用LoadLibary()显式地加载所需要的动态链接库,并显式地链接需要的输出符号表。
     (1)隐式链接:当应用程序调用动态链接库时,需要将动态链接库文件映射到调用进程的地址空间中。映射方法有两种:一种是应用程序的源代码只引用动态链接库中包含的符号,当应用程序运行时,加载程序隐式地将动态链接库装入到进程的地址空间中,这种方法也称隐式链接;另一种方法是应用程序运行时使用LoadLibary()显式地加载所需要的动态链接库,并显式地链接需要的输出符号表。
     (2)动态连接:在编译应用程序之前,要把动态链接库文件复制到应用程序所在的目录下。使用显示连接方式,不需要使用相应的.dll文件。使用类型定义关键字typedef定义了指向动态链接库中相同函数原型的指针,然后通过LoadLibrary(“SimpleDll.dll”)将到头了即可文件SimpleDll.dll加载到应用程序中,并返回当前动态链接库文件的句柄。在通过GetProcAddress(hDll,“Add”)和GetProcAddress(hDll,“Sub”)获得导入到应用程序中动态链接库的函数Add()和Sub()的指针。函数调用完毕后使用Freelibrary(hDll)卸载动态链接库文件。


三、实验内容

(一)实验内容
(1).在Windows环境下用VC++6.0建立一个动态链接库。包含两个函数:1.完成两个数相加 2.完成两个数相乘
(2).使用静态调用法调用动态链接库的加乘函数。
(3).使用动态调用法调用动态链接库的加乘函数。
(二)主要代码
1.动态链接库工程
// WYLdll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

extern "C"_declspec(dllexport) int Add (int x,int y);
extern "C"_declspec(dllexport) int Sub (int x,int y);
bool  APIENTRY  DllMain(HANDLE  hModule,
                        DWORD  ul_reason_for_call,
                        LPVOID  lpReserved
						)
{
       return  TRUE;
}
int	Add(int x,int y)
{
   int z;
   z=x + y;
   return z;
}
int	Sub(int x,int y)
{
   int z;
   z=x * y;
   return z;
}
2.静态调用法调用动态链接库
// 051.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "051.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// The one and only application object
CWinApp theApp;
extern "C" _declspec(dllimport) int Add(int x,int y);
extern "C" _declspec(dllimport) int Sub(int x,int y);

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	int x=520;
	int y=521;
	int add=0;
	int sub=0;
	printf("Call WYLDll Now!\n\n");
	add=Add(x,y);
	sub=Sub(x,y);
	printf("520+521=%d\n\n520*521=%d\n\n",add,sub);
	return 0;
}
3.动态调用法调用动态链接库
// 052.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "052.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// The one and only application object
CWinApp theApp;

using namespace std;

int _tmain(int argc,TCHAR*argv[],TCHAR*envp[])
{
	int s;
	int nRetCode=0;

	typedef int (*pAdd)(int x,int y);
	typedef int (*pSub)(int x,int y);

	HMODULE hDll;
	pAdd add;
	pSub sub;

	//加载动态链接库文件WYLDll.dll
	hDll=LoadLibrary("WYLDll.dll");
	if(hDll==NULL)
	{
		printf("LoadLibrary Error!\n\n");
		return nRetCode;
	}
	else  
		printf("LoadLibrary Succes!\n\n");

	//得到动态链接库中函数Add()的内部地址
	add=(pAdd)GetProcAddress(hDll,"Add"); 
	s=add(520,1);
	printf("520+1=%d\n\n",s); 

	//得到动态链接库中函数Sub()的内部地址
	sub=(pSub)GetProcAddress(hDll,"Sub");
	s=sub(522,2);
	printf("522*2=%d\n\n",s);
	
	//释放动态链接库WYLDll.dll
	FreeLibrary(hDll);
	return nRetCode;
}

四、实验结果与总结

1.建立动态链接库
总结:
    Microsoft Visual C++ 6.0环境下选择File->New命令,然后再Project选项卡中选择Win32 Dynamic-Link Library建立一动态链接库工程文件,输入工程文件名,选择工程文件名所在路径,选择完毕单击确定按钮。然后在工程文件中找到 .dll文件 和 .lib文件。
    学会了建立一个动态链接库工程,然后学会了DllMain入口函数的相关功能。 DllMain()函数在将动态链接库加载到进程地址空间时被调用。

image

image

2.静态调用法调用动态链接库
总结:
    首先建立一个控制台工程文件051,用此文件中的051.cpp调用前面建立的动态链接库.dll文件。在生成控制台工程文件051的可执行文件前,先将 .dll文件 复制到工程文件051的Debug目录下,讲 .lib文件 复制到051.cpp所在的目录下,然后在Microsoft Visual Studio的环境下,选择Project->Setting命令,在Link选项卡中的Option文件框中输入动态链接库的导入/导出库文件.lib文件。

image

image

3.动态调用法调用动态链接库
总结:
    首先,在编译应用程序之前,要把动态链接库文件复制到应用程序所在的目录下。使用显示连接方式,不需要使用相应的 .dll文件。然后通过LoadLibrary(“SimpleDll.dll”)将到头了即可文件SimpleDll.dll加载到应用程序中,并返回当前动态链接库文件的句柄。在通过GetProcAddress(hDll,“Add”)和GetProcAddress(hDll,“Sub”)获得导入到应用程序中动态链接库的函数Add()和Sub()的指针。函数调用完毕后使用Freelibrary(hDll)卸载动态链接库文件。

![image][3.1]

![image][3.2]

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司马道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值