资源描述:
《操作系统实验(四)动态链接库的建立与调用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、动态链接库的建立与调用姓名:蒙吉学号:20072411603实验名称:动态链接库的建立与调用实验目的:1)理解动态链接库的实现原理;2)掌握WINDOWS系统动态链接库的建立方法;3)掌握WINDOWS环境下动态链接库的调用方法。实验准备知识:1)动态链接库基础知识;2)动态链接库入口函数(DllMain);3)动态链接库导入/导出函数:声明导出函数的代码:_declspec(dllexport)MyDllFunction(intx,inty);声明导入函数的代码:_declspec(dllexport)MyDllAdd(intx,int
2、y);4):隐式连接和显式连接;5)函数调用参数传递约定:(1)_stdcall调用约定;(2)C调用约定;(3)_fastcall调用约定。实验内容:1)在WINDOWS环境下建立一个动态链接库;2)使用隐式调用法调用动态链接库;3)使用显式调用法调用动态链接库;实验要求:掌握动态链接库建立和调用方法。在WINDOWSXP+VC++6.0环境下建立一个动态链接库,并分别使用隐式和显式将其调用,从而体会使用动态链接库的优点。参考源代码://SimpleDll.cpp:DefinestheentrypointfortheDLLapplica
3、tion.#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;
4、returnz;}//隐式调用动态链接库的程序//CallDll.cpp:Definestheentrypointfortheconsileapplication.#include"stdafx.h"extern"C"_declspec(dllimport)intAdd(intx,inty);extern"C"_declspec(dllimport)intSub(intx,inty);intmain(intargc,char*argv[]){intx=7;intx=6;intadd=0;intsub=0;printf("CallDllNo
5、w!");//调用动态链接库add=Add(x,y);sub=Sub(x,y);printf("7+6=%d,7-6=%n",add,sub);return0;}//显示调用动态链接库的程序//CallDllAddress.cpp:Definestheentrypointfortheconsoleapplication.#include"stdafx.h"#include"CallDllAddress.h"#ifdaf_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS__FLL
6、E[]=__FILE__;#endif/////////////////////////////////////////////////////////////////TheoneandonlyapplicationobjectCWinApptheApp;usingnamespacestd;int_tmain(intargc,TCHAR*argv[],TCHAR*envp[]){ints;intnRetCode=0;typedefint(*pAdd)(intx,inty);typedefint(*pSub)(intx,inty);HMOD
7、ULEhDll;pAddadd;pSubsub;hDll=LoadLibrary("SimpleDll.dll");//加载动态链接库文件SimpleDll.dllif(hDll==NULL){printf("LoadLobraryError......");returnnRetCode;}elseprintf("LoadLibrarySuccess......");add=(pAdd)GetprocAddress(hDll,"Add");//得到动态链接中函数Add()的内部地址s=add(6,2);printf("6+2=%d
8、",s);sub=(pSub)GetprocAddress(hDll,"Sub");//得到动态链接库中函数Sub()的内部地址s=sub(6,2);printf("6-2=%d",s