1.动态库的使用主要有两种方式:
动态链接库的静态调用
需要.h .dll文件, 有时候甚至会用到.lib文件,在工程编译时就将库中的方法和类等引入
2.动态链接库的动态调用
在已知库文件内容的前提下,只使用.dll文件,动态的将其调用,本文就在描述此方法的实现。(库文件可使用dumpin等工具打开dll已查看)。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。
写的动态调用动态库的代码可以作为参考:原来只有dll也可以调用函数。
#include "stdio.h"
#include "windows.h"
#include<malloc.h>
#include <stdlib.h>
//#include "RS120.h"
#define ADC_TIMES 1 //ADC采集次数
int times = 0;
#define FFT_POINT_LEN 8192
float data_buffer[FFT_POINT_LEN * 3] = {0}; //数据值保存
int i = 0;
//
FILE *fp;//文件指针
typedef int(*lpAddFun)();//定义函数指针类型
typedef int(*rs120_Configure)(float, float, int, float);
typedef int(*rs120_SignalProcessing)(int, float *output);
typedef int(*rs120_SignalProcessingEx)(int fftlen, float fPlotStart,float fPlotStop, float *output,double *dAcc);
int main(int argc, char* argv[])
{
int result = 0;
fp = fopen("fft_data.txt", "w");//fopen打开文件,这个文件可以是当前不存在的。“w”以写入的形式打开,“r”以读的形式打开
if (fp == NULL) //判断如果文件指针为空
{
printf("File cannot open! ");
exit(0);//在以0的形式退出,必须在文件开头有#include <stdlib.h>,stdlib 头文件即standard library标准库头文件
}
float *output = (float *)malloc(FFT_POINT_LEN * 2 * sizeof(float));
HINSTANCE hDll;
lpAddFun RS120_Init;
rs120_Configure RS120_Configure;
rs120_SignalProcessing RS120_SignalProcessing;
rs120_SignalProcessingEx RS120_SignalProcessingEx;
hDll = LoadLibrary(L"RS120.dll");//加载动态链接库
//printf("data_buffer[5]=%f\n", data_buffer[5]);
if (hDll != NULL)
{
printf("load dll successful\n");
RS120_Init = (lpAddFun)GetProcAddress(hDll, "RS120_Init"); //获得指定动态链接库中特定函数地址指针。
if (RS120_Init != NULL)
{
printf("find RS120_Init successful\n");
result = RS120_Init();//调用动态链接库中的函数。
if (result == 0) //初始化雷达设备成功
{
printf("初始化雷达设备成功\n");
}
else
{
printf("初始化雷达设备失败\n");
}
//
RS120_Configure = (rs120_Configure)GetProcAddress(hDll, "RS120_Configure"); //获得指定动态链接库中特定函数地址指针
if (RS120_Configure != NULL)
{
printf("find RS120_Configure successful\n");
result = RS120_Configure(120,130,10,10);//调用动态链接库中的函数。
if (result == 0) //初始化雷达设备成功
{
printf("RS120_Configure 配置雷达成功\n");
}
else
{
printf("RS120_Configure 配置雷达失败\n");
}
}
else
{
printf("find RS120_Configure failed\n");
}
//雷达回波读取函数
RS120_SignalProcessing = (rs120_SignalProcessing)GetProcAddress(hDll, "RS120_SignalProcessing");
//数据采集与处理扩展
RS120_SignalProcessingEx = (rs120_SignalProcessingEx)GetProcAddress(hDll, "RS120_SignalProcessingEx");
while (1)
{
// printf("Find RS120_SignalProcessing successful\n");
result = RS120_SignalProcessing(FFT_POINT_LEN, data_buffer); //数据采集与处理 4096
if (result == 0)
{
printf("RS120_SignalProcessing 采集数据成功\n");
printf("频谱数据为:\n");
for (i = 0; i < FFT_POINT_LEN /2; i++)
{
if (i % 20 == 0)
printf("\n");
printf("%10f", data_buffer[i]);
}
}
else
{
printf("RS120_SignalProcessing 采集数据失败\n");
}
//将数据写入到txt中
for (i = 0; i<4096; i++)
{
fprintf(fp, "%15f", data_buffer[i]);//写入指针fp,写入的东西就是刚才的用户输入的d,注意这里的fp和d没有引号
}
printf("\n");
printf("\n");
//跳出程序模块,这个就是采集几次的雷达回波值
times++;
if (times == ADC_TIMES)
break;
}
}
else
{
printf("RS120_Init failed\n");
}
}
else
{
printf("load dll failed\n");
}
//getchar();
//关闭文件
fclose(fp);
printf("卸载动态库\n");
FreeLibrary(hDll);//卸载动态链接库
return 0;
}