标题
如何在 LabVIEW 下调用 DLL
问题描述
动态链接库英文为 DLL,是 Dynamic Link Library 的缩写形式,DLL 是一个包含可由
多个程序同时使用的代码和数据的库。
在 LabVIEW 中,一维数组、二维数组、字符串是可以和 C/C++中的相应数据类型直
接对应起来,因此比较容易实现。那么对于 C/C++语言中的结构体,大家也会想到可以和
LabVIEW 中的簇对应起来,但是在具体的应用中还会涉及到一些细节,需要我们去留意,
否则很可能调用不成功,甚至由于非法读写内存导致系统崩溃。另外,在 LabVIEW 中的
返回值只有数值、字符串和指针,因此当 DLL 中的函数返回值为结构体时该如何处理?当
输入参数包含指向函数的指针时该如何处理?
解答方案
在解决这些问题之前,先推荐四篇文档,有长有短,但是都写得很细致:
1) 如何通过调用库函数结点使用 DLL——Configuring the Call Library Function Node
to call a Simple DLL 链接:https://decibel.ni.com/content/docs/DOC-9069
2) 如果是简单的数据类型(如数值、数组、字符串、简单结构体),在 LabVIEW 和
DLL 之间传递或接收指针,LabVIEW 能够自动的正确的解析指针——Passing and
Receiving Pointers with C/C++ DLLs from LabVIEW 链接:
https://decibel.ni.com/content/docs/DOC-9080
3) 因为 LabVIEW 隐藏了对内存的管理,没有开放的函数提供对具体内存地址的直接
访问,所以当 C/C++中返回的是一个指针,并且 LabVIEW 又不能自动解析这个指
针时,该怎么办——Dereferencing Pointers from C/C++ DLLs in LabVIEW 链接:
https://decibel.ni.com/content/docs/DOC-9091
4) 介绍导入共享库工具(Import Shared Library Wizard),当我们拿到一个 DLL 和
它的头文件(.h)时,利用该工具,能够自动生成针对 DLL 每个函数的子 VI,最大的
好处是不需要再手动设置输入输出参数并进行类型匹配,当然它有一定的局限性,
比如复杂的类型它匹配不了——Creating Wrapper VIs for C/C++ DLL functions
using the Import Shared Library Wizard 链接:
https://decibel.ni.com/content/docs/DOC-9078
5) 大家也可以通过这篇文档直入主题,因为它写得很全,包含详细的 VI 和 C/C++源
代码,并且有一个目录供大家索引,它回答了以下情况的问题:1)数值型 2)一
维数组 3)字符串 4)二维数组 5)简单结构体 6)复杂结构体。每种情况又包括:
返回值、返回指针、传递值、传递指针——Calling C/C++ DLLs Containing
Simple and Complex Datatypes from LabVIEW 链接: