给一个dll封装的例子:
/* 函数名称:FFT()
* 参数:
* 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 = 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的源代码为:
#ifndef 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的函数调用方式。
C++ dll 封装实例
最新推荐文章于 2024-08-18 23:50:27 发布