动态调用动态库

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;
}
 



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值