年 月 日
课程名称:面向对象程序设计 实验名称:动态链接库的制作与调用 班 级: 100462 学生姓名: 陈冬杨 学号: 10046213 指导教师评定: 签名:
一 用所学的内容编写一个动态链接库的文件
1、实验目的
(1) 了解和掌握类和指向函数的指针的使用。 (2) 了解和掌握宏的使用,
(3) 掌握动态链接库文件创建的过程。
2、实验要求
熟练掌握动态链接库文件的创建
3、实验步骤与内容
题目:创建一个动态链接库,实现画一棵树。 1).启动Visual C++6.0或者C++ Builder 5.0 .在WINDOWS98或WINDOWS 2000环境下,找到Visual C++6.0或者C++ Builder 5.0图标,双击之。为了不使Visual C++6.0或者C++ Builder 5.0的默认搜索路径与WINDOWS其他软件相冲突,清修改Visual C++6.0或者C++ Builder 5.0图标的属性。在属性|程序|批处理一栏中填上你自己的批处理程序名。以便启动时,首先运行你的批处理程序。然后在该批处理程序中,写上path=...路径。 2).设置用户程序子目录
设置用户程序子目录的目的是,将所有编程时产生的中间文件和最终执行程序文件全部 放在自己的目录中,以便管理。 3).创建和输入程序
Visual C++6.0启动后,要先建立一个project工程文件。方法为: ·选择File|new 菜单项,将弹出New 对话框。 ·单击Projects 选项卡
·在Location中填用户子目录路径
·在Project name中填入工程名(如MyDll)
·在列表中选择MFC AppWizard(dll),表示你编制的应用程序将生成动态链接库文件(.dll)
·按照提示创建一个自己想要的工程
定位到mydll.h文件处,添加动态链接库的函数原型声明,下面为mydll.h的内容: …..
int DrawTree(CPaintDC *dc,int xStart,int yStart,double length,double angle,int num); class CMyDllApp : public CWinApp {…….. };
定位到mydll.cpp 文件处,添加动态链接库中的函数的实现部分,下面为mydll.cpp
的内容: ……..
// The one and only CMyDllApp object CMyDllApp theApp;
int DrawTree(CPaintDC *dc,int xStart,int yStart,double length,double angle, int num) { int xEnd,yEnd; if (num==0) return 1; xEnd=xStart+(int)(length*cos(angle)); yEnd=yStart+(int)(length*sin(angle)); dc->MoveTo(xStart,yStart); dc->LineTo(xEnd,yEnd); DrawTree(dc,xEnd,yEnd,length*0.6,angle+0.624,num-1); DrawTree(dc,xEnd,yEnd,length*0.85,angle+0.08,num-1); DrawTree(dc,xEnd,yEnd,length*0.65,angle-0.6,num-1); return 1; }
在mydll.def中引出DrawTree函数,下面为mydll.def的内容。 ; MyDll.def : Declares the module parameters for the DLL.
LIBRARY \"MyDll\"
DESCRIPTION 'MyDll Windows Dynamic Link Library' EXPORTS DrawTree
二 动态链接库文件的调用
1、实验目的
(1) (2) (3) (4) (5)
解和掌握类和指向函数的指针的使用。 了解和掌握宏的使用。
掌握如何显示调用动态链接库文件。 掌握如何隐示调用动态链接库文件。 调用动态链接库文件的步骤。
2、实验要求
熟练掌握在自己的应用程序中调用动态连接库文件的方法
3、实验步骤与内容
1) 启动Visual C++6.0或者C++ Builder 5.0
.在WINDOWS98或WINDOWS 2000环境下,找到Visual C++6.0或者C++ Builder 5.0图标,双击之。为了不使Visual C++6.0或者C++ Builder 5.0的默认搜索路径与WINDOWS其他软件相冲突,清修改Visual C++6.0或者C++ Builder 5.0图标的属性。在属性|程序|批处理一栏中填上你自己的批处理程序名。以便启动时,首先运行你的批处理程序。然后在该批处理程序中,写上path=...路径。
2)设置用户程序子目录
设置用户程序子目录的目的是,将所有编程时产生的中间文件和最终执行程序文件全部 放在自己的目录中,以便管理。 3)创建和输入程序
Visual C++6.0启动后,要先建立一个project工程文件。方法为: ·选择File|new 菜单项,将弹出New 对话框。 ·单击Projects 选项卡
·在Location中填用户子目录路径 ·在Project name中填入工程名
·在列表中选择MFC AppWizard(exe),表示你编制的应用程序将生成可执行文件(.exe) ·按照提示创建一个自己想要的工程 4)调用步骤
隐示链接
包含导出函数(或C++类)声明的头文件(.h) 导入库(.lib)文件 实际的DLL(.dll)文件 显示链接
显示链接时,使用DLL的可执行程序在运行时通过函数调用来显示加载或卸载 DLL,并通过函数指针来调用DLL的导出函数,要显示链接DLL,应用程序必须
调用LoadLibrary来加载DLL,并获取模块句柄,调用GetProcAddress来获取应用程序要调用的导出函数的指针,使用完DLL后,应调用FreeLibrary来卸载DLL.
5)主要程序代码
定位到视图类 CtestDllView的实现TestDllView.cpp中的函数OnPaint处,加入下列的代码: void CTestDllView::OnPaint() { CPaintDC dc(this); // device context for painting
// typedef int(*DRAWTREE)(CPaintDC *,int,int,double,double, // int); typedef int(*DRAWTREE)(CPaintDC *,int,int,double,double,int); DRAWTREE DrawTree; CRect rect; GetClientRect(rect); FARPROC lpfn=NULL; HINSTANCE hinst=NULL; hinst=LoadLibrary(\"MyDll.dll\"); if (hinst==NULL) { AfxMessageBox(\"不能加载动态链接库\");
return; } lpfn=GetProcAddress(hinst,\"DrawTree\"); DrawTree=(DRAWTREE)lpfn; dc.SetMapMode(MM_LOENGLISH) ; if (lpfn==NULL)
AfxMessageBox(\"不能加载画树函数\"); else DrawTree(&dc,rect.right/2,-rect.bottom *9/10,(double)rect.bottom *0.2,1.57,9); FreeLibrary(hinst); // TODO: Add your message handler code here // Do not call CView::OnPaint() for painting messages }
4实验结果:
5.实验小结:
1. 本次实验主要按照老师所给步骤进行操作,编译时老是出现运行结果为空白的情况,最
后在将Mydll.dll和Mydll.lib文件拷入TestDll文件夹中并且加上ON_WM_PAINT()代码后可运行出结果。
2. 通过本次实验我们对动态数据库和创建和调用有了初步的了解,还需勤加练习。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务