操作系统实验一动态链接库的建立与调用.docx
《操作系统实验一动态链接库的建立与调用.docx》由会员分享,可在线阅读,更多相关《操作系统实验一动态链接库的建立与调用.docx(12页珍藏版)》请在冰豆网上搜索。
![操作系统实验一动态链接库的建立与调用.docx](https://file1.bdocx.com/fileroot1/2023-1/21/dd67bca8-1d6a-4717-a9e0-4b13263c5868/dd67bca8-1d6a-4717-a9e0-4b13263c58681.gif)
操作系统实验一动态链接库的建立与调用
上海电力学院
计算机操作系统原理
实验报告
题 目:
实验一动态链接库的建立与调用
院 系:
计算机科学与技术学院
班级:
学生姓名:
学号:
评语:
成绩:
2014年 10月10 日
上海电力学院
实验报告
课程名称:
计算机操作系统实验项目:
动态链接库的建立与实调用
姓名:
学号:
班级:
专业:
同组人姓名无指导教师姓名徐曼实验日期
一.实验目的和要求:
1.理解动态链接库的实现原理;
2.掌握WINDOWS系统动态链接库的建立方法;
3.掌握WINDOWS环境下动态链接库的调用方法。
4.掌握动态链接库建立和调用方法,在WINDOWSXP+VC++6.0环境下建立一个动态链接并分别使用隐式和显式将其调用,从而体会使用动态链接库的优点。
二.实验内容:
1.在Windows环境下建立一个动态链接库。
2.使用隐式调用法调用动态链接库。
3.使用显式调用法调用动态链接库。
三.实验平台:
VisualStudioC++6.0
4.实验原理
本次实验将在Windows7和VisualStudioC++6.0环境下建立一个动态链接库,分别使用隐式和显示的方式将其调用。
动态链接库是一个可执行模块,它包含的函数可以由Windows应用程序调用提供所需功能,为应用程序提供服务。
5.实验步骤与记录
1)启动VisualStudioC++6.0
2)选择file->new命令,新建一个Win32Dynamic-LinkLinrary程序。
3)创建一个简单的工程
4)用户直接使用DllMain的动态链接库入口函数
5)使用编译连接工具生成动态链接库
6)动态连接库的隐式调用首先建立一个Win32ConsoleApplication,在位置栏内输入工程文件名所在路径。
7)选择控制台文件类型:
一个支持MFC的程序,单击完成按钮。
8)用此文件中的CallDll.cpp调用前面建立好的函数动态链接库Mydll.dll
9)生成控可执行文件之前,把Mydll.dll复制到工程文件CallDll的debug文件中,将Mydll.lib复制到CallDll.cpp中,然后在MicrosoftVisualC++环境下,选择ProjectSetting命令,在连接选项中的ProjectOptions文本框中输入动态链接库的导入/导出库文件Mydll..lib
10)如果需要设置函数调用参数传递,在编辑环境中进行设置。
选择工程->设置,在C/C++选项中的Category下拉列表框中选择CodeGeneration,在Callingconvention选择_cdecl。
11)隐式调用实验结果截图:
12)选择file→new命令,选择Win32ConsoleApplication建立一个控制台工程文件Call。
13)选择一个支持MFC的程序
14)打开编辑环境,编译后,连接并运行程序。
15)显示调用实验结果截图
6.程序源代码
1.建立动态链接库Mydll.cpp文件源代码:
//jkh.cpp:
DefinestheentrypointfortheDLLapplication.
#include"stdafx.h"
extern"C"_declspec(dllexport)intAdd(intx,inty);
extern"C"_declspec(dllexport)intSub(intx,inty);
BOOLAPIENTRYDllMain(HANDLEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
returnTRUE;
}
intAdd(intx,inty)
{
intz;
z=x+y;
returnz;
}
intSub(intx,inty)
{
intz;
z=x-y;
returnz;
}
2.隐式调用动态链接库CallDll.cpp文件源代码
#include"StdAfx.h"
extern"C"_declspec(dllimport)intAdd(intx,inty);
extern"C"_declspec(dllimport)intSub(intx,inty);
intmain(intargc,char*argv[])
{
intx=7;
inty=6;
intadd=0;
intsub=0;
printf("calldllnow!
\n");
add=Add(x,y);
sub=Sub(x,y);
printf("7+6=%d,7-6=%d\n",add,sub);
return0;
}
3.显示调用动态链接库Mydll.dll的Call.cpp文件源代码:
#include"StdAfx.h"
#include"Call.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//Theoneandonlyapplicationobject
CWinApptheApp;
usingnamespacestd;
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
ints;
intnRetCode=0;
typedefint(*pAdd)(intx,inty);
typedefint(*pSub)(intx,inty);
HMODULEhDll;
pAddadd;
pSubsub;
hDll=LoadLibrary("Mydll.dll");
if(hDll==NULL)
{
printf("LoadLibraryError......\n");
returnnRetCode;}
elseprintf("LoadLibrarySuccess.....\n");
add=(pAdd)GetProcAddress(hDll,"Add");
s=add(6,2);
printf("6+2=%d\n",s);
sub=(pSub)GetProcAddress(hDll,"Sub");
s=sub(6,2);
printf("6-2=%d\n",s);
FreeLibrary(hDll);
returnnRetCode;
}
7.实验小结
实验中遇到的问题:
①第八步中,将CallDll.cpp中文件运行,发现出现问题不能实现,后来发现是程序在编写过程中错误,将程序改正后编译正常。
②第九步中,生成可控制文件之前,需要把Mydll.dll复制到工程文件CallDll的debug文件中,将Mydll.lib复制到CallDll.cpp中,但在Mydll中却找不到Mydll.lib文件,不知道是什么原因,只能重新创建后找到了。
后面依次完成。
③在整个程序运行的过程中,刚开始出现无法连接的问题,在同学的帮助下,知道要将C++源程序文件夹创建在MicrosoftVisualC++的C盘中。
心得:
动态链接库是Windows下程序组织的一种重要方式,使用动态链接库可以极大的保护用户在不同开发工具,不同时期所作的工作,提高编程效率。
通过此次实验,让我对动态链接库有了更近一步的认识,掌握了动态链接库隐式和显式两种调用方法。