VC++动态链接库编程之DLL典型实例
来源:互联网 发布:网易steam编程 编辑:程序博客网 时间:2024/06/09 16:40
动态链接库DLL实现了库的共享,体现了代码重用的思想。我们可以把广泛的、具有共性的、能够多次被利用的函数和类定义在库中。这样,在再次使用这些函数和类的时候,就不再需要重新添加与这些函数和类相关的代码。具有共性的问题大致有哪些呢?笔者归纳如下:
(1)通用的算法
图像处理、视频音频解码、压缩与解压缩、加密与解密通常采用某些特定的算法,这些算法较固定且在这类程序中往往经常被使用。
(2)纯资源DLL
我们可以从DLL中获取资源,对于一个支持多种语言的应用程序而言,我们可以判断操作系统的语言,并自动为应用程序加载与OS对应的语言。这是多语言支持应用程序的一般做法。
(3)通信控制DLL
串口、网口的通信控制函数如果由DLL提供则可以使应用程序轻松不少。在工业控制、modem程序甚至socket通信中,经常使用通信控制DLL。
本节将给出DLL的三个典型应用实例。
7.1 算法DLL
我们直接用读者的一个提问作为例子。
宋宝华先生,您好!
我在dev.yesky.com上看到你连载的《VC++动态链接库编程》,觉得非常好。我以前主要是用Delphi的,C/C++学过,对Win32和VCL比较熟悉,但是没有接触过VC++,对MFC很陌生。这段时间和一个同学合作做光学成像的计算机模拟,用到傅立叶变换,手里面有例程是VC++写的。我们的界面是用Delphi开发,需要将其傅立叶变换功能提出做一个DLL供Delphi调用。苦于不懂MFC,试了很多方法,都不成功,最后只得采用折衷方案,简单修改一下程序,传一个参数进去,当作exe来调用,才没有耽搁后续进程。
……
谢谢!
致
礼!
某某
学习过较高级别数学(概率统计与随机过程)、信号与线性系统及数字信号处理的读者应该知道,傅立叶变换是一种在信号分析中常用的算法,用于时域和频域的相互转换。FFT变换算法通用而有共性,我们适宜把它集成在一个DLL中。
随后,这位读者提供了这样的一个函数:
* 参数:
* complex<double> * TD - 指向时域数组的指针
* complex<double> * FD - 指向频域数组的指针
* r -2的幂数,即迭代次数
* 返回值: 无。
* 说明:该函数用来实现快速傅立叶变换
*/
void FFT(complex<double> * TD, complex<double> * FD, int r)
{
LONG count; // 傅立叶变换点数
int i,j,k; // 循环变量
int bfsize,p; // 中间变量
double angle; // 角度
complex<double> *W,*X1,*X2,*X;
count = 1 << r; //傅立叶变换点数
// 分配运算所需存储器
W = new complex<double>[count / 2];
X1 = new complex<double>[count];
X2 = new complex<double>[count];
// 计算加权系数
for(i = 0; i < count / 2; i++)
{
angle = -i * PI * 2 / count;
W[i] = complex<double> (cos(angle), sin(angle));
}
// 将时域点写入X1
memcpy(X1, TD, sizeof(complex<double>) * count);
// 采用蝶形算法进行快速傅立叶变换
for(k = 0; k < r; k++)
{
for(j = 0; j < 1 << k; j++)
{
bfsize = 1 << (r-k);
for(i = 0; i < bfsize / 2; i++)
{
p = j * bfsize;
X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2];
X2[i + p + bfsize / 2] = (X1[i + p] - X1[i + p + bfsize / 2]) * W[i * (1<<k)];
}
}
X = X1;
X1 = X2;
X2 = X;
}
// 重新排序
for(j = 0; j < count; j++)
{
p = 0;
for(i = 0; i < r; i++)
{
if (j&(1<<i))
{
p+=1<<(r-i-1);
}
}
FD[j]=X1[p];
}
// 释放内存
delete W;
delete X1;
delete X2;
}
既然有了FFT这个函数,我们要把它做在DLL中,作为DLL的一个接口将是十分简单的,其步骤如下:
(1)利用MFC向导建立一个非MFC DLL;
(2)在工程中添加fft.h和fft.cpp两个文件;
fft.h的源代码为:
#define FFT_H
#include <complex>
using namespace std;
extern "C" void __declspec(dllexport) __stdcall FFT(complex<double> * TD, complex<double> * FD, int r);
#define PI 3.1415926
#endif
fft.cpp的源代码为:
/* 文件名:fft.cpp */
#include "fft.h"
void __stdcall FFT(complex<double> * TD, complex<double> * FD, int r)
{
…//读者提供的函数代码
}
在任何编程语言中使用Win32 API LoadLibrary都可以加载这个DLL,而使用GetProcAddress(hDll, "FFT")则可以获得函数FFT的地址,读者所提到的Delphi当然也不例外。
这个DLL中有两点需要注意:
(1)使用extern "C"修饰函数声明,否则,生成的DLL只能供C++调用;
(2)使用__stdcall修饰函数声明及定义,__stdcall是Windows API的函数调用方式。
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例(转)
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程之DLL典型实例
- VC++动态链接库编程(五)之DLL典型实例
- VC++动态链接库(DLL)编程(五)――DLL典型实例
- VC++动态链接库编程之DLL木马
- VC++动态链接库编程之DLL木马
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之MFC规则DLL
- VC++动态链接库编程之MFC扩展 DLL
- HDU 2176
- c#中Windows消息对应的十六进制表
- 教你几个用BULK INSERT命令导入数据的小窍门
- VC++动态链接库编程之DLL典型实例
- 大网的经验(华为的创新—转载)
- CSDN最近图片好像不能发了!!!
- 自动查找本机串口的数目并且将其添加至Combo Box中
- DataGrid使用心得(附大量代码)
- 数据库sql的特殊字符:
- 面试时候最难回答的25个问题
- VC++动态链接库编程之DLL木马
- flex 操作xml 实现增删改查