LabVIEW调用函数返回指针的动态链接库DLL
引言
LabVIEW通过调用库函数节点可以调用C/C++生成的动态链接库。首先在VC/CVI/Matlab等语言中设计好完成计算处理任务的动态链接库,通过配置调用库函数节点调用动态链接库中相应的库函数,获取所需的处理结果。在LabVIEW中,通过库函数输出参数(指针或数组参数)以及库函数返回单值获取数据有完善的解决办法,可以参考这篇文章。本文讲述获取函数返回值为指针(含单值和数组指针)数据的方法。
LabVIEW调用库函数节点返回值只有空、数值和字符串三种类型,似乎无法返回指针数据(数组),其实是有解决办法的:对于返回指针的函数,返回的数值为存放数据的地址(对于数组,则为第一个元素的地址),用LabVIEW内置函数MoveBlock即可获取具体数据,下面以具体实例讲解创建DLL及调用、获取数据过程。
创建动态链接库
在VC6.0中创建动态链接库项目文件DllMain(创建过程略),代码文件main.cpp如下所示:
#include <objbase.h> // 也可以 #include <windows.h>
#include <stdio.h>
_declspec(dllexport) double * GetDimData(void)
{
double *p=(double *) malloc(sizeof(double)*3);
p[0]=1.01;
p[1]=2.02;
p[2]=3.03;
return p;
}
_declspec(dllexport) int * GetSingleData(void)
{
int *p=(int *) malloc(sizeof(int));
*p=101;
return p;
}
头文件main.h如下所示:
_declspec(dllexport) double * GetDimData(void);
_declspec(dllexport) int * GetSingleData(void);
生成动态链接库DllMain.dll。
LabVIEW中调用DllMian.dll
- 获取单值指针数据
在LabVIEW新建一个vi,拖一个调用库函数节点到程序框图中,双击节点弹出配置对话框,函数及参数配置如下图所示:
再拖一个调用库函数节点到程序框图中,双击节点弹出配置对话框,如下图所示,在库名栏中直接输入LabVIEW,在函数名栏中选择MoveBlock。
在参数栏中新建三个参数,分别为Address、MySingleData、Size,数据类型分别设置如下图所示:
创建的程序框图及运行结果如下图所示(和库函数中的变量数据是一致的):
- 获取数组指针数据
在LabVIEW新建一个vi,拖一个调用库函数节点到程序框图中,双击节点弹出配置对话框,函数及参数配置如下图所示:
再拖一个调用库函数节点到程序框图中,双击节点弹出配置对话框,如下图所示,在库名栏中直接输入LabVIEW,在函数名栏中选择MoveBlock。
在参数栏中新建三个参数,分别为Address、MyDimData、Size,数据类型分别设置如下所示:
创建的程序框图及运行结果如下图所示(和库函数中的数组数据是一致的):
上面的程序框图中,数字3表示数组元素有3个,8表示双精度数据长度为8个字节,MoveBlock函数从指定地址开始读取3*8=24个字节的数据并转换为双精度一维数组。
结束语
解决本文议题的关键是采用了LabVIEW内置的内存管理函数MoveBlock,通过输入数据地址,MoveBlock可以控制从指定地址开始读取多少字节数据,并将读取的数据转化为具体类型的数据。MoveBlock还可读取更复杂类型的数据,具体参见这篇文章。