-1-上海电力学院计算机操作系统原理实验报告题目:实验一动态链接库的建立与调用院系:计算机科学与技术学院班级:学生姓名:学号:评语:成绩:2014年10月10日-2-上海电力学院实验报告课程名称:计算机操作系统实验项目:动态链接库的建立与实调用姓名:学号:班级:专业:同组人姓名无指导教师姓名徐曼实验日期一.实验目的和要求:1.理解动态链接库的实现原理;2.掌握WINDOWS系统动态链接库的建立方法;3.掌握WINDOWS环境下动态链接库的调用方法。4.掌握动态链接库建立和调用方法,在WINDOWSXP+VC++6.0环境下建立一个动态链接并分别使用隐式和显式将其调用,从而体会使用动态链接库的优点。二.实验内容:1.在Windows环境下建立一个动态链接库。2.使用隐式调用法调用动态链接库。3.使用显式调用法调用动态链接库。三.实验平台:VisualStudioC++6.0四.实验原理本次实验将在Windows7和VisualStudioC++6.0环境下建立一个动态链接库,分别使用隐式和显示的方式将其调用。动态链接库是一个可执行模块,它包含的函数可以由Windows应用程序调用提供所需功能,为应用程序提供服务。五.实验步骤与记录1)启动VisualStudioC++6.02)选择file-new命令,新建一个Win32Dynamic-LinkLinrary程序。-3-3)创建一个简单的工程4)用户直接使用DllMain的动态链接库入口函数-4-5)使用编译连接工具生成动态链接库6)动态连接库的隐式调用首先建立一个Win32ConsoleApplication,在位置栏内输入工程文件名所在路径。7)选择控制台文件类型:一个支持MFC的程序,单击完成按钮。-5-8)用此文件中的CallDll.cpp调用前面建立好的函数动态链接库Mydll.dll9)生成控可执行文件之前,把Mydll.dll复制到工程文件CallDll的debug文件中,将Mydll.lib复制到CallDll.cpp中,然后在MicrosoftVisualC++环境-6-下,选择ProjectSetting命令,在连接选项中的ProjectOptions文本框中输入动态链接库的导入/导出库文件Mydll..lib10)如果需要设置函数调用参数传递,在编辑环境中进行设置。选择工程-设置,在C/C++选项中的Category下拉列表框中选择CodeGeneration,在Callingconvention选择_cdecl。-7-11)隐式调用实验结果截图:12)选择file→new命令,选择Win32ConsoleApplication建立一个控制台工程文件Call。-8-13)选择一个支持MFC的程序14)打开编辑环境,编译后,连接并运行程序。-9-15)显示调用实验结果截图六.程序源代码1.建立动态链接库Mydll.cpp文件源代码://jkh.cpp:DefinestheentrypointfortheDLLapplication.#includestdafx.hexternC_declspec(dllexport)intAdd(intx,inty);externC_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;-10-z=x-y;returnz;}2.隐式调用动态链接库CallDll.cpp文件源代码#includeStdAfx.hexternC_declspec(dllimport)intAdd(intx,inty);externC_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文件源代码:#includeStdAfx.h#includeCall.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif-11-///////////////////////////////////////////////////////////////////////////////TheoneandonlyapplicationobjectCWinApptheApp;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);-12-printf(6+2=%d\n,s);sub=(pSub)GetProcAddress(hDll,Sub);s=sub(6,2);printf(6-2=%d\n,s);FreeLibrary(hDll);returnnRetCode;}七.实验小结实验中遇到的问题:①第八步中,将CallDll.cpp中文件运行,发现出现问题不能实现,后来发现是程序在编写过程中错误,将程序改正后编译正常。②第九步中,生成可控制文件之前,需要把Mydll.dll复制到工程文件CallDll的debug文件中,将Mydll.lib复制到CallDll.cpp中,但在Mydll中却找不到Mydll.lib文件,不知道是什么原因,只能重新创建后找到了。后面依次完成。③在整个程序运行的过程中,刚开始出现无法连接的问题,在同学的帮助下,知道要将C++源程序文件夹创建在MicrosoftVisualC++的C盘中。心得:动态链接库是Windows下程序组织的一种重要方式,使用动态链接库可以极大的保护用户在不同开发工具,不同时期所作的工作,提高编程效率。通过此次实验,让我对动态链接库有了更近一步的认识,掌握了动态链接库隐式和显式两种调用方法。