C++实验报告七--动态链接库的制作与调用

更新时间:2023-10-24 18:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

南昌航空大学实验报告

2011年12月11号

课程名称: 面向对象程序设计B

实验名称: 动态链接库的制作与调用(多项式矩阵定义) 班级: 姓名: 同组人: 无

指导教师评定: 签名: 一、实验目的

综合运用所学面向对象编程知识完成动态链接库文件的创建、调用,理解动态链接库的工作原理,体会声明和定义分开方法在程序设计中的优势,掌握利用动态链接库实现不同开发平台间混合编程的方法,掌握利用动态链接库实现代码可复用技术,进一步掌握混合开发的方法。

二、实验内容

综合应用所学面向对象编程知识定义一个多项式矩阵类并应用该类实现多项式矩阵类的运算。具体实现该矩阵的加法(采用运算符“+”重载)、转置(采用运算符“-”重载)及输出(采用运算符“<<”重载)操作。将该类制作为动态链接库,然后在其他工程中对该动态链接库进行调用。

三、动态链接库示例

首先我们做一个动态链接库提供add函数接口的方法,在VC++中new一个Win32 Dynamic-Link Library工程dllTest。注意不要选择MFC AppWizard(dll)。 在建立的工程中添加lib.h及lib.cpp文件,源代码如下: /* 文件名:lib.h */ #ifndef LIB_H #define LIB_H

extern \#endif

/* 文件名:lib.cpp */ #include \int add(int x, int y) {

return x + y; }

1

这两个文件建立结束后,执行“build”命令完成动态链接库的编译与生成,此时,在该工程目录下的“debug”目录下则会生成dllTest.dll和dllTest.lib文件。

然后,我们也建立一个与DLL工程处于同一工作区的应用工程dllCall,将刚刚生成的两个文件拷贝到该共分成目录下,它调用DLL中的函数add。

四、详细设计:

1、动态调用动态链接库方式

#include #include

typedef int(*lpAddFun)(int, int); int main(int argc, char *argv[]) {

HINSTANCE hDll; lpAddFun addFun;

hDll = LoadLibrary(\if (hDll != NULL) {

addFun = (lpAddFun)GetProcAddress(hDll, \if (addFun != NULL) {

int result = addFun(2, 3); printf(\}

FreeLibrary(hDll); } return 0; }

2、静态调用动态链接库方式

#pragma comment(lib,\文件中仅仅是关于其对应DLL文件中函数的重定位信息

extern \int main(int argc, char* argv[]) {

int result = add(2,3); printf(\return 0; }

2

五、程序调试

经调试无误后,运行程序得到的结果为: Area:3.141593 girth:6.283185 Press any key to continue.

六、实验总结:

1、实验时要耐心,按部就班进行,充分利用上机时间巩固所学动态链库的知识。 2、通过这次的试验,我明显的感觉到自己对这方面的知识掌握的还不够熟练,不能顺利地、流畅地运用这方面的知识,因为我没有在规定的时间内完成程序的设计,课后还是要多复习。

七附录(源代码程序):

DLL中定义的类在应用工程中的使用 //文件名:point.h,point类的声明

#ifndef #define POINT_H #ifdef DLL_FILE

class _declspec(dllexport) point //导出类point #else

class _declspec(dllimport) point //导入类point #endif { public: double y; double x; point();

point(double x_coordinate, double y_coordinate); }; #endif

//文件名:point.cpp,point类的实现 #ifndef DLL_FILE #define DLL_FILE #endif

#include \//类point的缺省构造函数 point::point() { x = 0.0;

3

POINT_H

y = 0.0; }

//类point的构造函数

point::point(double x_coordinate, double y_coordinate) {

x = x_coordinate; y = y_coordinate; }

//文件名:circle.h,circle类的声明 #ifndef CIRCLE_H #define CIRCLE_H #include \ #ifdef DLL_FILE

class _declspec(dllexport)circle //导出类circle #else

class _declspec(dllimport)circle //导入类circle #endif { public:

void SetCentre(const point &rePoint); void SetRadius(double r); double GetGirth(); double GetArea(); circle(); private: double radius;

4

point centre; }; #endif

//文件名:circle.cpp,circle类的实现 #ifndef DLL_FILE #define DLL_FILE #endif

#include \#define PI 3.1415926 //circle类的构造函数 circle::circle() {

centre = point(0, 0); radius = 0; }

//得到圆的面积

double circle::GetArea() {

return PI *radius * radius; }

//得到圆的周长

double circle::GetGirth() {

return 2 *PI * radius; }

//设置圆心坐标

void circle::SetCentre(const point &rePoint) {

centre = rePoint; }

//设置圆的半径

void circle::SetRadius(double r) {

radius = r; }

类的引用:

5

#include \ //包含类声明头文件 #pragma comment(lib,\int main(int argc, char *argv[]) { circle c;

point p(2.0, 2.0); c.SetCentre(p); c.SetRadius(1.0);

printf(\return 0; }

6

本文来源:https://www.bwwdw.com/article/kn92.html

Top