如何在LabVIEW下调用DLL
2个回答
2015-06-16 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517192
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
动态链接库英文为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 链接:https://decibel.ni.com/content/docs/DOC-9079(看这些VI调用的时候,一定要参考C/C++中的原代码来进一步的理解,原代码在其链接中都提供下载)
但是这篇文档有几处地方运行的时候出现错误,列举如下:
1. 2D Dimensional Array –c. Passing a parameter (Pass by Value) Function
2. Simple Struct – a. Returning a value (return statement) Function
在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 链接:https://decibel.ni.com/content/docs/DOC-9079(看这些VI调用的时候,一定要参考C/C++中的原代码来进一步的理解,原代码在其链接中都提供下载)
但是这篇文档有几处地方运行的时候出现错误,列举如下:
1. 2D Dimensional Array –c. Passing a parameter (Pass by Value) Function
2. Simple Struct – a. Returning a value (return statement) Function
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询