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
* 说明:该函数用来实现快速傅立叶变换 */
void FFT(complex
LONG count; // 傅立叶变换点数 int i,j,k; // 循环变量 int bfsize,p; // 中间变量 double angle; // 角度
complex
// 分配运算所需存储器
W = new complex
// 计算加权系数
for(i = 0; i < count / 2; i++) {
angle = -i * PI * 2 / count;
W[i] = complex
// 将时域点写入X1
memcpy(X1, TD, sizeof(complex
// 采用蝶形算法进行快速傅立叶变换
32