毕业论文 - VC++环境下的动态链接库的开发与应用 联系客服

发布时间 : 星期日 文章毕业论文 - VC++环境下的动态链接库的开发与应用更新完毕开始阅读

VC++环境下动态链接库的开发及应用

class AFX_EXT_CLASS CExtDialog : public CDialog { public: CExtDialog( CWnd* pParent = NULL ); enum { IDD = IDD_DLL_DIALOG }; protected: virtual void DoDataExchange( CDataExchange* pDX ); DECLARE_MESSAGE_MAP() };

这其中最主要的改变是我们在class AFX_EXT_CLASS CExtDialog语句中添加了

“AFX_EXT_CLASS”宏,则使得DLL中的CExtDialog类被导出。 为对话框按钮“MFC Extention DLL”添加消息响应函数

void CExtDialog::OnButton1() { } // TODO: Add your control notification handler code here MessageBox(\Extention DLL \最后,编译运行,生成.lib文件和.dll文件。

29

VC++环境下动态链接库的开发及应用

4.3. MFC扩展DLL的加载

在上述工程所在的工作区中添加一个LoadExtDllDlg工程,用于演示MFC扩展DLL的加载。在LoadExtDllDlg工程中添加一个如下图所示的对话框,这个对话框上包括一个“调用DLL”按钮。

图 4-3-1 MFC扩展DLL调用工程中的对话框

在与上图对应对话框类实现文件的头部添加:

// LoadExtDllDlg.cpp : implementation file // #include \#pragma comment( lib, \..\\Debug\\ExtDll.lib\

而“调用DLL”按钮的单击事件的消息处理函数为:

void CLoadExtDllDlg::OnDllcallButton() { CExtDialog extDialog; extDialog.DoModal(); } 最后编译并运行,运行结果如下:

30

VC++环境下动态链接库的开发及应用

图 4-3-2 运行结果

从上述加载过程,我们可总结出:

为提供给用户隐式加载,MFC扩展DLL需要提供三个文件: (1)描述DLL中扩展类的头文件; (2)与动态链接库对应的.LIB文件; (3)动态链接库.DLL文件本身。

有了这三个文件,应用程序的开发者才可充分利用MFC扩展DLL。

五、动态链接库的典型应用

动态链接库DLL实现了库的共享,体现了代码重用的思想。我们可以把广泛的、具有共性的、能够多次被利用的函数和类定义在库中。这样,在再次使用这些函数和类的时候,就不再需要重新添加与这些函数和类相关的代码。因此,动态链接库的应用广泛,而其主要的典型应用有以下几方面:

5.1. 通用的算法

图像处理、视频音频解码、压缩与解压缩、加密与解密通常采用某些特定的算法,这些算法较固定且在这类程序中往往经常被使用。如以下的例子: 学习过较高级别数学(概率统计与随机过程)、信号与线性系统及数字信号处理的读者应该知道,傅立叶变换是一种在信号分析中常用的算法,用于时域和频域的相互转换。FFT变换算法通用而有共性,我们适宜把它集成在一个DLL中。我们可在相关资料上获取到FFT变换算法的函数代码如下:

31

VC++环境下动态链接库的开发及应用

/* 函数名称:FFT() * 参数:

* complex * TD - 指向时域数组的指针 * complex * FD - 指向频域数组的指针 * r -2的幂数,即迭代次数 * 返回值: 无。

* 说明:该函数用来实现快速傅立叶变换 */

void FFT(complex * TD, complex * FD, int r) {

LONG count; // 傅立叶变换点数 int i,j,k; // 循环变量 int bfsize,p; // 中间变量 double angle; // 角度

complex *W,*X1,*X2,*X; count = 1 << r; //傅立叶变换点数

// 分配运算所需存储器

W = new complex[count / 2]; X1 = new complex[count]; X2 = new complex[count];

// 计算加权系数

for(i = 0; i < count / 2; i++) {

angle = -i * PI * 2 / count;

W[i] = complex (cos(angle), sin(angle)); }

// 将时域点写入X1

memcpy(X1, TD, sizeof(complex) * count);

// 采用蝶形算法进行快速傅立叶变换

32