LabVIEW如何方便地调用DLL文件
labview调用动态库Dll

利用LabView调用动态链接库.dll
2013.10蜗牛首先确定要实现的功能:
例如:实现c=a+b;动态库的功能是完成加法运算;
第一部分:生成dll库文件的工程;
1)利用vs2010或者VC++编译器建立一个可以生产动态库的工程,在文件》》新建》》项目,选择Visual C++下面的Win32的控制台运用程序;输入工程名和路劲;如图所示会在VC++的文件夹下建立一个test的文件夹;点击确定》》下一步;选择DLL;如下图所示
点击确定后;自动增加的函数文件如下图左边所示;蓝色阴影部分为自己增加的函数功能;
DLL内申明并定义函数的分为两种:第一种为DLL导出函数,第二种为DLL 为内部函数;其中DLL导出函数可以被其他函数调用,DLL函数只能被内部函数调用,应用程序无法调用他们。
所以在DLL中函数add之前有个关键字_declspec(dllexport)来限制,表示函数为dll导出函数。
然后在生成里面点击生成和编译;那么在所建的工程路劲的Debug文件夹下生产一个test.dll的文件;记住这个路劲;
第二部分:编写LabView程序
导出调用LabView调用动态库节点;放置到程序框图版;
双击程序框图中的图标,按如下所示设置,将路劲和函数名写好;在参数设置栏中根据我们在vc中设置的参数类型选择好,点击ok就行;
根据我们定义的a、b类型为int,编辑好界面后,运行程序,调用DLL完成。
LabVIEW对数据采集卡DLL函数的调用

2004年9月襄樊学院学报 Sept.,2004 第25卷第5期 Journal of Xiangfan University V ol.25 No.5LabVIEW对数据采集卡DLL函数的调用刘传清 (襄樊学院 物理学系,湖北 襄樊 441053) 摘要:首先介绍虚拟仪器及其开发环境LabVIEW6的特点,分析并实现了将LabVIEW与外部代码进行连接的高级技术之一—动态链接库(DLL)机制. 实践表明,此机制高效、易行,是增强LabVIEW与其它Windows应用程序之间的数据共享能力的一条很好的途径. 关键词:虚拟仪器;LabVIEW;动态链接库;DLL 中图分类号:TN311.11 文献标志码:A 文章编号:1009-2854(2004)05-0015-03 0 引言 美国国家仪器NI公司的基于G语言的开发环境LabVIEW的出现,使得虚拟仪器的思想为工业界所接受. 所谓虚拟仪器,就是在通用计算机平台上,用户根据自己的需求定义和设计仪器的测试功能,其实质是将传统仪器硬件和最新计算机软件技术充分结合起来,以模块化软件实现并扩展传统仪器的功能. 与传统仪器相比,虚拟仪器在智能化程度、处理能力、性能价格比、可操作性等方面均具有明显的技术优势.LabVIEW(Laboratory Virtual Instrument Engineering Workbench─实验室虚拟仪器工程平台)是目前国际上首推应用最广的虚拟仪器开发环境之一,主要应用于仪器控制、数据采集、数据分析、数据显示等领域,并适用于Windows 9X/XP/2000/ NT、Macintosh、UNIX等多种不同的操作系统平台. 与传统程序语言不同,LabVIEW采用强大的图形化语言(G语言)编程,面向测试工程师而非专业程序员,编程非常方便,人机交互界面直观友好,具有强大的数据可视化分析和仪器控制能力等特点.使用LabVIEW开发环境,用户可以创建32位的编译程序,从而为常规的数据采集、测试、测量等任务提供了更快的运行速度. LabVIEW是真正的编译器,用户可以创建独立的可执行文件,能够脱离开发环境而单独运行. 对于大多编程任务,LabVIEW通常能产生高效的代码.1 LabVIEW调用外部程序代码的途径之一 —— 动态链接库机制 1.1 动态链接库机制概述 LabVIEW是一个功能强大的虚拟仪器开发环境,它完整地集成了与GPIB、VXI、RS-232、RS-485和内插式数据采集卡等硬件的通讯. LabVIEW还具有内置程序库,提供了大量的连接机制,通过DLLs、共享库、ActiveX等途径实现与外部程序代码或软件系统的连接.LabVIEW提供了4种调用外部程序代码的途径,其中动态链接库(Dynamic Link Library─DLL)机制是从LabVIEW调用标准共享库和用户自定义库函数的通用方法. 具体实现时,是使用LabVIEW功能模板中“Advanced”子模板里的“调用库函数(Call Library Function)”结点.“调用库函数结点”包括大量的数据类型和调用规范,使用它可调用大多数标准共享库和用户自定义库中的函数,包括:Windows9X/XP/2000/NT下的动态链接库(Dynamic LinkLibrary)、Macintosh下的代码段(Code Fragment)、UNIX下的共享库函数(Shared Library Function)等.当用户需要调用的代码已经存在,或者用户比较熟悉Windows中动态链接库、Macintosh中代码段、UNIX中共享库的创建过程时,“调用库函数结点”非常有用,此时使用它也最为合适恰当,因为库使用了收稿日期:2004-04-21基金项目:湖北省教育厅重点项目(2003A006)作者简介:刘传清(1964- )男,湖北鄂州人,襄樊学院物理学系副教授.15刘传清:LabVIEW对数据采集卡DLL函数的调用对几个开发环境都适用的格式标准,故用户可以使用几乎任何开发环境去创建LabVIEW能够调用的库. 1.2动态链接库机制实现步骤在Windows 9X下,利用LabVIEW 6.1 (for Windows 95/98/NT)中的“动态链接库机制”调用一个DLL,此DLL返回机器的名称.1)建立“调用库函数结点”新建LabVIEW程序“hostname.vi”,存至新建目录“d:\temp”下,其前面板如下: 图1 库函数调用前面板图 框图程序如下: 图2 库函数调用程序框图 其中,“Call Library Function”结点是通过选择功能模板中“Advanced”子模板里的“Call Library Function”功能模块而产生的.此LabVIEW程序通过“调用库函数结点”调用一个DLL,此DLL将返回机器的名称,返回结果存至字符串指示量“Machine Name”中,而后将字符串常量“LabVIEW is running on ”与“Machine Name”相拼接,拼接之结果在字符串指示量“Message”中显示.2)配置“调用库函数结点”双击框图程序窗口的“Call Library Function”结点,在弹出的对话框中对此“调用库函数结点”进行配置. 其中:在“Library Name or Path”一项中键入“d:\temp\hostname.dll”(即,指明此结点所链接的DLL文件名,它由C源代码“hostname.c”编译而来);在“Function Name”一项中键入“MachineName”(即,指明与此结点相链接的DLL文件中的函数的名称);参数“return type”的类型选择“Void”;所增加的另一个参数“arg1”的类型选择“String”、字符串格式选择“String Handle”;3)编辑C源文件编辑C源文件“hostname.c”(存至目录“d:\temp”下),其内容如下:/* include extcode.h which contains the prototypes for the LabVIEW functions */#include <extcode.h>#include <stdio.h>#include <windows.h>BOOL WINAPI DllMain (HANDLE hDLL, DWORD dwReason, LPVOID lpReserved) {return TRUE;}/* This functions gets the computer name and returns it to LabVIEW */__declspec (dllexport) void MachineName(void *LVHandle) {char computerName[MAX_COMPUTERNAME_LENGTH+1];int compNameLength = MAX_COMPUTERNAME_LENGTH+1;16第25卷第5期襄樊学院学报 2004年第5期/* Get computer name */GetComputerName(computerName, &compNameLength);/* Size LabVIEW handle to the correct size */DSSetHandleSize(LVHandle, compNameLength + 5);/* Copy the string size to the LabVIEW handle */**(int32 **)LVHandle = compNameLength ;/* Copy the string to the LabVIEW handle */sprintf((*(char **)LVHandle)+4,"%s",computerName);}此程序首先了调用Windows的API函数“GetComputerName”获取机器名;然后调用LabVIEW的函数“DSSetHandleSize”来设置LabVIEW句柄之大小;最后将机器名长度(32位整型)、机器名(字符串型)依次写入句柄中.4)编译C源代码将C源代码“d:\temp\ hostname.c”编译成一个DLL文件“d:\temp\hostname.dll”.可使用VC++ 6.0 (for Windows 95/98/2000/NT),完成此编译工作.5)运行VI运行LabVIEW程序“hostname.vi”,结果如下:图3 前面板运行结果 2 结束语 本文着重阐述并实现了将LabVIEW与外部代码进行连接的高级技术之一─动态链接库机制,并给出了应用实例. 由于在LabVIEW中引入了C语言的强大功能,从而提高了LabVIEW的整体性能.本方法已在LabVIEW 6.1 for Windows 95/98/NT及Visual C++ 6.0 for Windows 9X/XP/2000/NT 环境下实现. 实践证明,此方法高效、易行,是增强LabVIEW与其它Windows应用程序之间的数据共享能力的一条很好的途径.参考文献: [1] LabVIEW User Manual,National Instruments Corporation,1998.[2] G Programming Reference Manual,National Instruments Corporation,1998.LabVIEW Data Acquisition Invoke for DLL FunctionsLIU Chuan-qing(Department of Physics, Xiangfan University, Xiangfan 441053, China)Abstract :This paper introduces virtual instrument and the features of its development environment─LabVIEW,analyzes and realizes the advanced technology-Dynamic Link Library(DLL) ,which is one of the general methods for calling external code from LabVIEW. It has been proved that this method is efficient,practicable and also a good one to enhance LabVIEW’s capacity of sharing data with other applications in Windows.Key words:Virtual instrument; LabVIEW; Dynamic Link Library ; DLL17。
如何使用LabVIEW调用C#编写的DLL

如何使用LabVIEW调用C#编写的DLL
本文以 DrivesInforDll.dll 为例:
我们把DLL复制我要使用它的地方,如下图:
现在,打开LabVIEW2012,新建一个VI,切换到程序框图,选择下图的构造器节点到程序框图:
此时将自动打开选择.NET构造器:
点击浏览按钮,选择要调用的DLL:
点击确定后在对象中选择Class1:,如下图所示:
点击确定按钮关闭对话框。
选择下图的调用节点到程序框图:
将构造器节点的“新引用”输出端与调用节点的“引用”输入端连接起来,然后在调用节点的“方法”上点击,选择我们要使用的方法,这里选择GetDrivesInfo()。
选择下图的关闭引用到程序框图并连接调用节点的“引用输出”输出端到关闭引用的“引用”输入端。
然后创建一个字符串数组,显示GetDrivesInfo方法的执行结果。
完整的程序框图如下:
运行后的前面板结果如下:
这说明程序是执行成功了的。
关于LabVIEW产生的DLL被C调用的问题

关于LabVIEW产生的DLL被C调用的问题1 LabVIEW的工作1.1 工程项目从LV8.0开始,想要生成exe、安装程序或DLL就必须首先创建1个工程,然后把所有有关的VI全部添加到工程中,如图1:图1 LV项目为了使目录结构清晰,最好把最后需要输出的VI放置在一起,把子VI放置在一起,如图1中,虚拟目录Top Level Vis用来存放3个输出的VI(可以把它想像成DLL中的函数)、虚拟目录Dynamic Vis存放子VI、虚拟目录Support Files存放支持文件(位图、光标等)。
1.2 VI设置如同在LV中一样,有些VI完全是作为计算模块使用的(调用时不会弹出界面,如图1中的acquire.vi、analyze.vi),而有些是用来显示界面的(调用时弹出对话框,如图1中的present.vi)。
那么如何设置1个输出VI是否显示界面呢?想要产生界面调用的函数,请配置Window Appearance(如图2),然后确保红线圈住的地方必须被选中:图2 VI界面设置1.3 输出配置(Build Specification)右击Build Specification选择New->DLL,弹出DLL输出配置对话框,其有以下对话框需要配置:1.3.1 基本信息(Information)图3∙Build specification name—指定唯一的生成模板名称(出现在项目管理页面中),用以和其他模板相区别∙Target filename—指定输出的DLL名称∙Destination directory—指定生成文件的输出路径∙Build specification description—描述该生成模板的相关信息。
1.3.2 输出源指定(Source Files)图4∙Project Files窗口—显示项目窗口My Computer下列举的项目(如图1),使用图4中的左/右箭头可将My Computer下列举的项目移入/移出Exported VIs和Always Included窗口。
图解LABVIEW调用DLL

前言:LABVIEW是一个强大的图形编程语言,使用很简单,就是你没有任何编程经验也可以LABVIEW编程,对于需要快速上手图形编程的人是一个不错的选择。
在很多时候我们会用C语言写一些计算机的底层驱动,比如USB数据传输或者串口数据传输,如何把我们自己写的驱动程序集成到LABVIEW中呢?下面我就用图和简单说明的方式给大家说说,由于我也是初学,所以有的地方可能会有错误或不准确的地方,欢迎大家指正,废话不多说了,下面开始正式的教程。
目的:通过一个现成的I2C适配器控制I2C接口的AM2311温湿度传感器,将测得的温度和湿度用LABVIEW显示出来,最终效果如图所示。
准备:1、安装LABVIEW2010。
2、I2C适配器1台。
3、I2C适配器上位机驱动函数库,和函数库头文件。
4、AM2311传感器模块一台。
第一步:打开LABVIEW2010,按下图导入我们需要使用的DLL文件。
得到如下界面,点击下一步。
打开DLL和头文件,点击下一步。
到这里我们的库就基本上导入完毕,但是还有一件事情要做,因为在Ginkgo_Driver.dll里面用到了vt214x.dll里面的一些函数,所以要把这个文件拷贝到刚刚生成库的目录下,否则在运行程序的时候会出现找不到这个DLL的错误提示,而且程序也不能正常工作。
我生成的库目录是:D:\Program Files (x86)\National Instruments\LabVIEW 2010\user.lib\Ginkgo_Driver。
你可以根据自己的实际情况处理,拷贝这个文件后在这个目录下的文件如下图所示:到这里库基本上就导入完毕,下面我们就可以在VI程序里面使用这些库函数了。
第二步:打开LABVIEW软件,新建一个VI文件,另存名字为AM2311.vi。
我们在前面板设计为如下界面。
切换到程序款图界面,因为我们程序需要顺序执行,最后需要在一个循环里面循环读取数据,所以我们可以通过平铺顺序结构来设计程序,在平铺顺序结构的第一帧调用刚刚导入的VTIF_I2C_SelectDevice()函数选择设备,在第二帧调用VTIF_I2C_Init()初始化函数初始化I2C适配器,然后就可以循环的读取数据了,最好将数据解析出来并显示出来。
再谈USB开发:LabVIEW调用DLL文件实现STM32+USB+HID双向通信

4、结尾
到了这里,我们可以看到,LabVIEW 调用 DLL 文件是很简单的,关键是我们要知道 DLL 文件中的函数原型! 我们也可以比较一下通过 VISA 和通过 LabVIEW 调用 DLL 文件实现 USB HID 双向通 信的的优缺点。 1、通过 VISA,我们可以简单和快速地开发 STM32 USB HID 通信,不必了解底层函 数的原型,系统稳定可靠。但需要我们安装庞大的 VISA 驱动程序,而且硬件需要被 MAX 识别。 2、通过 LabVIEW 调用 DLL 文件,我们不需要安装任何驱动程序,发挥 USB HID 免 驱动的优点,但需要我们了解 DLL 文件中的函数原型,而且如果 DLL 文件做得不好的话, 有可能引起程序崩溃。 其 实 我 们 也 可 以 调 用 windows 系 统 自 带 的 hid.dll 文 件 的 , 一 般 在 以 下 路 径 : C:\WINDOWS\system32。现在的 USB HID 上位机软件,一般都是调用微软的 hid.dll 来实现 的。这个留给用户去完成了(不难的,只要知道函数原型就可以了) 。 其实 LabVIEW 作为一种通用的编程语言, 和 VC++一样, 也可以封装和创建 DLL 文件 的,有兴趣的用户可以了解一下,这里就不详细介绍了。
ห้องสมุดไป่ตู้
2、LabVIEW调用我们创建的DLL文件
LabVIEW 的“调用库函数节点”在以下路径: “互连接口”“库与可执行程序” “调用库函数节点”
我们把这个控件放在 VI 的程序框图中:
双击控件后,可以打开如下配置窗口:
“库名/路径”比较简单,就是 DLL 文件的路径了。而“线程” ,一般都是选择“在 UI 线程中运行” 。在“调用规范”中,因为是调用我们写的 DLL 文件,所以选择“C” 。如果 是调用 windows 系统中的 DLL 文件,那么选择“stdcall(WINAPI) ” 。 我们把 DLL 文件装进来之后, 就可以看到 DLL 文件中包含的所有函数了, 在 “函数名” 下拉列表中可以看到。
LabVIEW 调用 C-C++ Dll 详解

LabVIEW 调用C/C++ Dll 详解LabVIEW 在配上NI 的采集卡或者别的第三方的硬件,约等于神器(虽然有时候贵了点)。
这样你可以比较集中精力的专注于数据处理了,就不用学习麻烦的Win32 的GUI 编程, 也不用关注和你自己搞的采集板之间的通信了。
对于每一个测控行业的程序来说,基本上都是:初始化-->数据采集-->数据处理-->数据显示-->数据保存-->结束的一个过程。
当然如果是实时的,那么采集,处理,显示就是在一个loop 里面。
当然为了保证实时性,数据处理和数据采集不一定在一个线程里,因为处理的时候把采集给block 住也挺傻的。
LabVIEW 很容易帮你搞定:初始化-->数据采集-->数据处理-->数据显示-->数据保存-->结束但是数据处理部分,是和你的学科紧密相关的,有时候算法会诡异到你很难用VI来实现,那么你就要有C++”target=“_blank”>C++code来搞了。
那么C/C++ 是如何与LabVIEW 交互的呢,本文来较详细的阐述一下,因为准备采用总分总的写作手法...所以先来个概括...1. 把C/C++ code 编译成Dll。
2. 用LabVIEW 的call library node 来调用。
难点在于:如何把LabVIEW 的数据类型和C/C++ 的来对应。
控件x 相当与一个double,当然其类型也是可以选择的(如右图所示)。
boolean 按理说应该是一个bool, 但是传入call library node 的时候,一般要转成unsigned int 型。
cluster 其实就是个struct ,左图的cluster 是:struct tCluster{ double x11; // 类型都可以向右图那样自己配置double x2; int x3;};对于string,这里要着重讲一下,labview 的string 类型里面是包含长度信息的,它不是一个简单的char *它是个LStrHandle 类型:定义咋extcode.h 里面(可以在labview 目录下搜到)typedef struct {int32 cnt;uChar str[1];} LStr, *LStrPtr, **LStrHandle;cnt 就是含有多少个字符,str 这个指针所指的就是数据区的第一个字符。
LabVIEW 8.6报表工具包生成和调用DLL问题分析及对策

LabVIEW 8.6报表工具包生成和调用DLL问题分析及对策摘要:针对LabVIEW8.6调用报表工具包生成的DLL过程中出现“NI_Word.lvclass”路径无法找到的问题,做了详细描述和分析,并提供了相应的解决方案。
关键词:LabVIEW 8.6 Word 动态链接库报表工具包面向对象LabVIEW是美国国家仪器(NI)公司推出的专门用于虚拟仪器开发的图形化软件编程平台,吸引了大批开发者追随,NI也根据市场需求每年推出一个新版本。
但新技术的引用不可避免的也带来了新的问题和BUG,尤其是升级后,很多硬件驱动不得不更新。
LabVIEW 8.6版本是NI推出的所有版本中,大部分用户公认比较成熟稳定的版本。
NI 报表工具包从1.1.3开始采用面向对象技术,重新设计,1.1.3和1.1.4版本是专为LabVIEW 8.6而定制使用的,而以前的版本如1.1.1、1.1.2(面向过程技术)在LabVIEW 8.6下与自带的Report函数不兼容。
1 问题描述应用开发环境以及报表工具包版本:LabVIEW 8.6 + Report Generation Toolkit 1.1.3。
在LabVIEW 8.6新建工程项目文件,并按照图1和图2建立相应的VI和文件。
当运行main.vi或Main.exe时,出现下面(图3)报错框。
而单独运行1.vi或1.exe时,却能正常运行。
2 问题分析根据问题报错框描述,问题可能出现在“Get LV Class Default Value.vi”的上一层文件“Word class path.vi”传递出的NI_Word.lvclass 路径,图4为报表工具包自带的“Word class path.vi”程序框。
利用LabVIEW自带诊断和调试工具,可获得“Word class path”显示的文件路径,如表1所示。
(1)当运行main.vi时,由于是“Develo- pment system”环境下,根据路径的分离规则,“NI_Word.lvclass”文件路径应在当前DLL文件的下层目录,并且布尔量选择为False,即“..\1.dll\word\ NI_Word.lvclass”。
LabVIEW与外部程序间DLL文件的调用

图20 Parameters页面点击“OK”,将生成的CLN的输入段连接到DAQmx Read.vi,return type 输出连接到波形图表上,即可实现采集值放大10倍的功能。
图21 完成后的程序方法二LabVIEW中还有一种方法可以调用DLL文件,在VI的选项栏,依次选择Tools——Import——Shared Library(.dll),弹出Import Shared Library 对话框。
图22 生成Import Shared Library对话框选择Create VIs for a shared library,点击Next,在Shared Library (.dll) Files中输入Scale.dll文件的路径,Head(.h) File里填写头文件的路径。
图23 选择DLL文件路径和头文件路径点击Next,如果DLL文件中依赖其他的一些DLL文件,需要在Include Paths中填写这些文件的路径。
其他选项可以根据客户需求设置,一般默认即可。
这样一直点击Next到最后,选择Open the generated library,点击Finish。
这样可以生成一个.lvlib格式的库文件,里面包含了Scale.vi,这是将调用该DLL 文件的方法封装好的VI,只留下输入和输出接口,方便运用到LabVIEW的程序中。
直接将Scale.vi拖放到刚才的连续采集中即可完成方法一的功能。
图24 完成的程序VC调用LabVIEW生成的DLL文件刚才介绍了LabVIEW调用DLL文件的方法,使用VC调用LabVIEW生成的DLL 文件也很简单。
还是以之前生成Scale 的DLL文件为例,不同的是采集电压程序使用的是C语言的例程,但和LavVIEW实现的功能相同。
首先将先前生成Scale DLL文件时,路径下所有的文件全部复制粘帖到C语言例程的文件夹下。
打开连续采集程序,点击状态栏的Project——Settings,在Project Settings对话框中加载入Scale.lib的静态链接库。
VC调用labview生成的DLL

VC调用LabVIEW生成的DLL文件刚才介绍了LabVIEW调用DLL文件的方法,使用VC调用LabVIEW生成的DLL 文件也很简单。
还是以之前生成Scale 的DLL文件为例,不同的是采集电压程序使用的是C语言的例程,但和LavVIEW实现的功能相同。
首先将先前生成Scale DLL文件时,路径下所有的文件全部复制粘帖到C语言例程的文件夹下。
打开连续采集程序,点击状态栏的Project——Settings,在Project Settings对话框中加载入Scale.lib的静态链接库。
在程序中键入#include "Scale.h",以便引入该DLL函数。
下面是C程序的代码,功能是有限点采集电压,通过Scale.dll文件实现采样值放大10倍的功能。
加粗部分是因为调用DLL文件所做的改动。
#include <stdio.h>#include "NIDAQmx.h"#include "Scale.h"#define DAQmxErrChk(functionCall)if( DAQmxFailed(error=(functionCall)) ) goto Error; elseint main(void){int32 error=0;TaskHandle taskHandle=0;int32 read;float64 data[1000];char errBuff[2048]={'\0'};int i=0;double x10=0;/*********************************************/// DAQmx Configure Code/*********************************************/DAQmxErrChk (DAQmxCreateTask("",&taskHandle));DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0"/*Config correct device*/,"",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));/ /DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_V al_FiniteSamps,1000));/*********************************************/// DAQmx Start Code/*********************************************/DAQmxErrChk (DAQmxStartTask(taskHandle));/*********************************************/// DAQmx Read Code/*********************************************/DAQmxErrChk(DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,dat a,1000,&read,NULL));printf("Acquired %d points\n",read);for(i=0;i<1000;i++){Scale(data[i], &x10);printf("the %d Value is : %f \n",i,x10);}Error:if( DAQmxFailed(error) )DAQmxGetExtendedErrorInfo(errBuff,2048);if( taskHandle!=0 ) {/*********************************************/// DAQmx Stop Code/*********************************************/DAQmxStopTask(taskHandle);DAQmxClearTask(taskHandle);}if( DAQmxFailed(error) )printf("DAQmx Error: %s\n",errBuff);printf("End of program, press Enter key to quit\n");getchar();return 0;}所以,使用LabVIEW不仅可以方便地调用各种编译软件生成的DLL文件,自己也能生成DLL文件供其他编译软件调用。
LABVIEW调用VC制作的DLL文件

LABVIEW调用VC制作的DLL文件
实现求和运算
1、首先用LABVIEW建立一个空VI,
2、选择CALL LIBRARY FUNCTION NODE ,右击点击CONFIGURA TION配置,函数名取SUM,添加两个变量8 字节双精度变量A,B,返回双精度。
建立好之后,函数原型为double sum(double a, double b);
3、建立的程序为
4、
创建一个C文件,保存皆可,将程序打开改为:
#include "extcode.h"
_declspec(dllexport) double sum(double a, double b);
_declspec(dllexport) double sum(double a, double b) {
/* Insert code here */
double sum;
sum=a+b;
return sum;
}皆可。
5、打开VC,建立DLL文件:步骤如下:
将刚才的C文件添加到工程中,同时必须加头文件
C:\Program Files\National Instruments\LabVIEW 2010\cintools中所有的.h文件。
还必须将所有的.h文件考在同一个目录下才可以。
6、双击
选择路径皆可,这时候设计完成,可以运行看一下效果。
如何使用LabVIEW调用C#编写的DLL

如何使用LabVIEW调用c#编写的DLL最近在做一个项目时,需要在Labview中列出可用的磁盘驱动器,我们可以使用互连接口》库与可执行程序》执行系统命令vi,但是在程序运行时会弹出命令提示符窗口,对于计算机菜鸟用户而言,他们或许会以为那是在执行病毒程序,为了增加用户的好感度,本文采用调用DLL的方式来解决问题。
在调用DLL之前,我们先来创建一个DLL,打开VS2008,新建一个类库项目,如下图:点击确定后进入代码编写窗口。
编写好的代码如下图所示:选择VS2008的生成》配置管理器,打开配置管理器,如下图所示:在活动解决方案配置下拉框中选择Release,然后点击关闭。
选择生成》生成DrivesInfoDll,然后生成一个DLL文件。
在项目的的bin\Release目录下面可以找到生成的DLL文件,如下图所示:我们把它复制我要使用它的地方,如下图:现在,打开LabVIEW2012,新建一个VI,切换到程序框图,选择下图的构造器节点到程序框图:此时将自动打开选择.NET构造器:点击浏览按钮,选择要调用的DLL:点击确定后在对象中选择Class1:,如下图所示:点击确定按钮关闭对话框。
选择下图的调用节点到程序框图:将构造器节点的“新引用”输出端与调用节点的“引用”输入端连接起来,然后在调用节点的“方法”上点击,选择我们要使用的方法,这里选择GetDrivesInfo()。
选择下图的关闭引用到程序框图并连接调用节点的“引用输出”输出端到关闭引用的“引用”输入端。
然后创建一个字符串数组,显示GetDrivesInfo方法的执行结果。
完整的程序框图如下:运行后的前面板结果如下:这说明程序是执行成功了的。
Labview调用库函数节点方法解析

Labview调用库函数节点(调用DLL)相对于CIN来讲,NI更推荐用户使用DLL来共享基于文本编程语言开发的代码。
除了共享和重复利用代码,开发人员还能利用DLL封装软件的功能模块,以便这些模块能被不同开发工具利用。
在labview中,使用DLL一般有以下几种途径:(1)使用自己开发DLL中的函数。
(2)调用操作系统或硬件驱动供应商提供的API。
对于前一种方法来说,又可以通过以下几步实现:(a)在labview中定义DLL原型;(b)生成.C或.C++文件,完成实现函数功能的代码并为函数添加DLL导出声明;(c)通过外部IDE(如VC++)创建DLL项目并编译生成.dll文件。
下面的内容将具体讲解:配置Call library function node (CFN)无论在labview中使用自己开发的DLL,或者硬件驱动供应商(操作系统)提供的API,都可以通过配置CFN来完成。
如下图在CFN图标的右键菜单选择“配置”,打开配置对话框,通过该对话框,可以指定动态库存放路径、调用函数名以及传递给函数的参数类型和函数返回值的类型。
在配置完成后,CFN节点会根据用户的配置自动更新其显示。
通过browse按钮或者直接在library name or path输入框中指定调用函数多在.dll文件的路径。
通过browse按钮下的控件用户可以指定多个线程同时调用DLL。
默认情况下,labview以run in UI Thread方式调用DLL,调用的函数将直接在用户线程中运行。
另外一种方式是递归方式reentrant,在这种情况下可以允许多个线程同时调用DLL中的函数。
但要确保正常调用,必须使dll中的代码线程安全。
在“Function Name”输入框中指定要调用函数的函数名。
通过“Call Conventions”下拉列表框指定调用DLL 中函数的方式。
可以指定调用方式为“C”(默认方式)或Windows 标准调用方式“stdcall”。
Labwindows调用外部DLL文件的问题

1. dll文件的编写(1)打开软件Labwindows/CVI,点击File->New->project新建一个工程*.prj,如图所示。
然后保存为example.prj。
(2)用同样的方式,新建一个*.c文件,然后按照下图所示,在Edit->Insert Construct->Dllmain,然后软件会自动在c文件中添加以下两个函数:int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)这两个函数是DLL动态链接库必须包含的两个函数,函数的具体内容为:#includeint __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){switch (fdwReason){case DLL_PROCESS_ATTACH:if (InitCVIRTE (hinstDLL, 0, 0) == 0)return 0;/* out of memory */break;case DLL_PROCESS_DETACH:CloseCVIRTE ();break;}return 1;}int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){/* Included for compatibility with Borland */return DllMain (hinstDLL, fdwReason, lpvReserved);}然后在上面C源文件中编写相关的函数,然后保存文件为example.c。
Labview调用dll详解(C语言DLL

Labview调用dll详解(C语言DLLLabview调用dll详解(C语言DLL)之一labview中提供了两个C接口,一个是CLF,一个是CIN。
本帖子讨论DLL的调用,也就是CLF。
由于C的强大功能,本帖子讨论C创建的DLL的调用。
首先简单解释一下DLL,也就是动态链接库。
DLL 的好处是屏蔽底层的细节,用户不用也不能打开DLL,便于资源代码数据共享,节省内存等。
一般情况下labview是不需要调用DLL的。
DLL分两类,一类是API,一类是自己创建的DLL。
这两者本质都一样,但是调用一般来说是有区别的。
R) {$ f0 x7 @3 B 要调用DLL必须要有DLL,也就是所谓的路径。
这个一般不会出错的,不用解释了。
其次是选择函数,这个也不难。
线程一般选择UI线程,任意线程的DLL和UI线程DLL有颜色上的区别,其次在源代码中也有区别(这个不是DLL调用失败的主因,不用过多纠缠)。
接下来是调用设置:Ccall和standcall。
一般来说,windows API采用的是standcall,自己创建的采用Ccall。
两种调用区别在于参数进入栈的顺序不同。
这里随便说一下,栈由系统自动分配内存,类似C语言的int a都是分配的栈内存;new分配的是堆内存。
栈内存由系统负责回收,堆内存一般程序员负责释放,所以要注意系统的内存泄漏。
labview的初始化数组也会分配内存,所以不宜频繁调用。
8 h. p8 V/ m, J- D4 X 接下来是最重要的参数配置,也是最复杂的参数配置。
首先要知道函数原型,C语言里面叫导出函数类。
一般在include文件下面的头文件里面。
下面是一个典型的函数原型:extern "C" ZLDS10X_DLL_API SENSOR_HANDLE ZLDS10X_DLL_stdcall ZLDS10X_Open(char * portnum , int baud , int timeout , int address); 值得注意的是,很多人会把函数原型看错。
怎样在LabVIEW中调用Win32动态连接库_DLLs_

收稿日期:1999212218 作者简介: 陶以政 (1971-),男,四川广安人,工程师,主要研究方向:CAD/CAM 应用研究; 潘振显 (1941-),男,江苏苏州人,研究员,主要研究方向:自动控制、CAD/CAM 应用研究.文章编号:1001-9081(2000)06-0072-02怎样在LabVIEW 中调用W in32动态连接库(D LLs )陶以政,潘振显(中国工程物理研究院,四川绵阳621900)摘 要:LabVIEW 是美国国家仪器(National Instruments )公司开发的基于图形化的程序设计语言(G 语言)。
以Windws 95/98/NT 中USER32.D LL 库中的信息框函数MessageBoxA 为例,说明在LabVIEW 中怎样调用Win32动态连接库的方法。
关键词:虚拟仪器;LabVIEW ;动态连接库(D LLs )中图分类号:TP311.13 文献标识码:A LabVIEW 主要用于开发数据检测、数据测量采集系统、工业自动控制系统和数据分析系统等领域,它是虚拟仪器系统的主要开发工具。
LabVIEW 利用NI 公司相关的硬件产品驱动程序,根据用户的需求开发虚拟仪器系统。
我们利用LabVIEW 开发自动控制系统时,通过自己开发的动态连接库,在LabVIEW 应用中获得了成功。
1 LabVIEW 中调用Win32动态连接库 图1 图2在LabVIEW 中利用Call Library Function 节点(node )可以较容易地实现访问动态连接库。
下面是在LabVIEW for Windws 95/98/NT 中调用动态连接库的主要特点:・调用D LLs 可以用C 或stdcall 调用习惯;・能用整数或浮点数的任意维数组;・不需要关心用巨大模式(H UGE )、近(NE AR )或远(FAR )指针;・LabVIEW 字符串能通过C 或Pascal 字符指针;・可以用空(V oid )、整数(integer )和浮点数(Float )指针为返回值。
Labview DLL调用指南-非常有用

【转】labview dll的调用【转载】武汉高收入高福利公司排行榜在LabVIEW中调用DLL的整个过程及注意事项2011-09-15 21:25:44| 分类:驱动开发| 标签:|字号大中小订阅1. LabVIEW支持的数据类型< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />另外,可参考…\Program Files\National Instruments\LabVIEW 2009\examples\dll\data passing\Call Native Code.llb\Call DLL.vi。
…此VI列举了LabVIEW与C语言中兼容的数据类型。
见下表。
2. 在VI里调用DLL时,在DLL的左侧给输出端口添加初始化的值。
给输出端口添加初始化值的目的是分配内存给输出端口。
该初始化数组元素的个数至少为实际输出数组的个数。
若过小,则DLL不正常运行;若相等,则DLL正常运行;若过大,则DLL的数组输出端口除有效数据外,还有其他一些为0的非有效数据。
< xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />3.使用DLL的步骤1)制作子VI,添加控件接口到连接端(connector)。
2)在新建的VI中添加DLL,在DLL中指定其路径,会自动添加该DLL包含的输入输出端口。
对于数值型输出,选择Point to value。
选中“Specify path or diagram”,表示动态调用该DLL,此时路径取决于最上端的路径输入端,Library name or path里输入的路径无效。
在parameters页,系统会自动添加DLL的输入输出端口,如果添加不完整,则需要再手动添加额外的输入端或者输出端。
如何从LabVIEW中调用动态链接库DLL

问题:如何从LabVIEW中调用动态链接库DLL解答:要从LabVIEW中调用动态链接库(DLL),你需要首先确定是哪种类型的DLL。
基本上有两种类型的DLL需要考虑:C/C++ DLL 和Microsoft .NET assembly. C/C++ DLL 用C, C++, 或其他编程语言生成(除了.NET 语言) 比如Java, Fortran, 或Visual Basic 6.0. .NET DLL 也被称为".NET assembly" 或者就是"assembly". 这个术语的区别在于.NET DLL 与其他DLL的工作方式不同. .NET DLL使用Common Language Runtime (CLR) 和.NET Framework "处理" DLL中的函数.如果DLL是C/C++ DLL:1找到头文件(*.h) 或者函数原型声明.2确定你需要调用的function(s) . 注意函数的参数是否包含了原始数据类型参数比如int, char, double, 等等或者是否包含了复杂数据类型比如clusters.3如果函数没有包含复杂数据类型并且你有头文件(*.h), LabVIEW中一个很好的工具可以帮你简单地导入DLL (并且会帮助你创建DLL的整个库). 你可以在Tools?Import?Shared Library (.dll)...中找到该工具; 按照向导进行下去.4如何函数不含有复杂数据类型但是没有头文件(*.h), 首先确定你使用的是C/C++ DLL因为大部分的编程环境将对这种DLL 生成头文件. 如果你确实在处理C/C++ DLL, 找到该函数的相关文档,因为你需要确定那些在DLL中被调用的函数的参数. 一旦参数被确定,使用Call Library Function Node LabVIEW中的函数手动调用该函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LabVIEW如何方便地调用DLL文件
LabVIEW调用DLL文件
LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用。
比如,在实际的工程项目中,用户可以用C++语言实现软件的运算部分,并把这些功能构建在DLL文件中,然后再使用LabVIEW编写程序的界面部分,并通过调用编写好的DLL来调用运算部分的功能。
LabVIEW 中是通过Call Library Function Node(CLN)节点来完成DLL文件调用的。
创建一个新的VI,右击程序框图,在Functions Palette中依次选中Connectivity——Libraries & Executables工具栏即可找到该节点(如下图)。
将节点放置在程序框图中,双击会出现它的配置对话框,共有四页。
第一页用于填写被调用函数的信息Library name or path(库名/路径)需给出DLL文件名和路径,若引用操作系统路径下的DLL文件,直接输入文件名也可调用,其它的必须输入全路径。
在这里已经给出名字的DLL是被静态加载到程序中的,也就是说当调用了这个DLL的VI被装入存时,DLL同时被装入存。
LabVIEW也可动态加载DLL,只要勾选上Specify path on diagram(在程序框图中指定路径)的选项即可。
选择了这个选项,在Library name or path(库名/路径)中输入的容就无效了,取而代之的是CLN 节点多出一对输入输出,用于指明所需要使用的DLL的路径。
这样,当VI被打开时,DLL不会被装入存,只用程序运行到需要使用这个DLL中的函数时,才把其装入存。
Function name是需要调用的函数的名称,LabVIEW 会把DLL中所有的暴露出来的函数都列出,用户只要在下拉框中选取即可。
Thread栏用于设定哪个线程里运行被调用的函数。
用户可以通过CLN 节点的配置面板来指定被调用函数运行所在的线程。
CLN 的线程选项非常简单,只有两项:Run in UI thread和Run in any thread。
LabVIEW的程序框图上直接可以看出一个CLN节点是选用的什么线程。
如果Run in UI thread,节点颜色是橙色的;Run in any thread则是浅黄色的
通常情况下,除非使用的动态库是多线程安全的,CLN 中选择Run in any thread方式;否则必须选择Run in UI thread方式。
判断一个动态库是不是多线程安全的,需通过以下方法:如果一个动态库的文档中没有明确说明它是多线程安全的,那么就要当作是非多线程安全的;在可以看到动态库源代码的条件下,如果代码中存在全局变量、静态变量或者代码中看不到有lock一类的操作,那么这个动态库也就肯定不是多线程安全的。
选择了Run in any thread方式,LabVIEW会在最方便的线程运行动态库函数,且一般会与调用它的VI在同一个线程运行。
因为LabVIEW是自动多线程的语言,它也很可能会把动态库函数分配给一个单独的线程运行。
如果程序中存在没有直接或间接先后关系的两个CLN节点,LabVIEW很可能会同时在不同的线程运行它们所调用的函数,也许是同一函数。
对于非多线程安全的动态库,这是很危险的操作。
很容易引起数据混乱,甚至是程序崩溃。
选择Run in UI thread方式,因为LabVIEW只有一个界面线程,所以如果所有的CLN设置都是界面线程,那么就可以保证这些CLN调用的函数肯定全部都运行在同一线程下,肯定不会被同时调用。
对于非多线程安全的动态库,这种方式就保证了它的安全。
让我们回到配置对话框第一页,Calling convention用于指明被调用函数的调用约定。
这里只支持两种约定:stdcall 和C call。
它们之间的区别在于,stdcall由被调用者负责清理堆栈,C call由调用者清理堆栈。
这个设置错误时,可能会引起LabVIEW崩溃,也就是说如果LabVIEW调用DLL函数时出现异常,首先应该考虑这个设置是否正确。
(Windows API一般使用的都是stdcall;标准C的库函数大多使用C call。
如果函数声明中有类似__stdcall这样的关键字,它就是stdcall的。
)
第二页是函数参数的配置(图4)。
DLL和LabVIEW之间传递参数,最常用的三种数据类型是数值、数值型数组和字符串。
C语言中经常把指针或者数据的地址在函数间传递,在32位操作系统中,可以使用int32数值来表示指针。
因此,当需要在LabVIEW中传递指针数据时,可以使用I32或U32数值类型来表示这个地址类型的数据。
但是,64位的程序中,数据的地址只能使用I64或U64来表示。
这样,如果一个调用了DLL函数的VI,并且函数参数中有地址型数据,使用固定数据类型的数值来表示地址,就要准备两份代码。
解决方法是使用LabVIEW中的新的数据类型Pointer-sized Integer。
这个数据类型的长度在不同的平台上会自动使用32位或64位长度。
如果在C语言函数参数声明中有const关键字,可以选中Constant选项。
布尔类型在DLL函数和LabVIEW VI之间传递没有专有的数据类型,是利用数值类型来传递的。
输入时先把布尔值转变为数值,在传递给DLL函数;输出时再把数值转为布尔值。
对于数组的传递,LabVIEW只支持C 数据类型中的数值型数组,传递数组类型需要注意的的是“Array Format”要选择“Array Data Pointer”。
这个设置中还有其他两个选项,带有“Handle”的参数类型都是表示LabVIEW定义的特殊类型的。
在第三方的DLL中不会使用到数组参数作为输出值时,要记得为输出的数组数开辟空间。
开辟数据空间的方法有两种:第一种方法,创建一个长度满足要求的数组,作为初始值传递给参数,输出数的数据就会被放置在输入数组的所在的存空间。
第二种方法是直接在
参数配置面板上进行设置。
在Minimum size中写入一个固定的数值,LabVIEW就会按此大小为输出的数组开辟空间。
在Minimum size 中选择函数的其它数值参数,而不是固定数值。
这样LabVIEW会按照当时被选择的参数值的大小来开辟空间。
字符串与使用与数组是非常类似的,实际上在C语言中字符串就是一个I8数组。
在NI软件的安装路径下打开当前使用版本的LabVIEW文件夹,通过examples\dll\data passing\Call NativeCode.llb找到简单数据类型在LabVIEW与C之间的对应关系。
部分常见关系见表1。
第三页用于为DLL设置一些回调函数,可以使用这些回调函数在特定的情形下完成初始化、清理资源等工作(图5)
如果为Reserve选择了一个回调函数,那么当一个新的线程开始调用这个DLL时,这个回调函数首先被调用。
可以利用这个函数为新线程使用到的数据做初始化工作。
线程在使用完这个DLL之后,它会去调用Unreserve中指定的回调函数。
Abort中指定的函数用于VI非正常结束时被调用,也就是让一个程序在运行完前停止。
这些回调函数的原型在Prototype for these procedures中列出,必须要由DLL的开发者按照特定的格式实现。
如果使用的DLL不是专为LabVIEW设计的,一般不会包含这样的回调函数。
第四页是错误处理方式,用户可根据需要选择相应的错误检查级别。
另外还需要注意的是,C语言中的struct在LabVIEW中可以使用cluster来表示,但有时需要作出相应的调整。
这是因为在C语言中,struct的字节对齐是可以进行设置的,这就决定了其各元素的存放地址的可变性。
C语言中的对字节对齐数可通过#pragma pack指令或在工程属性中进行指定。
而在LabVIEW的cluster中,所有元素只能是1字节对齐的,所以如果要和C语言中非1字节对齐的struct对应,需要做出一些调整。
比如,对于C语言中2字节对齐的struct,第一个元素如果是I8型的,在LabVIEW的cluster中第一个元素对应不变,但不能紧挨着放第二个元素,必须留一个无意义的空位。
C语言的struct其实也是如此,只不过没有表现出来。
所以为了方便,如果自己用C 语言生成DLL文件供LabVIEW调用最好将struct都设为1字节对齐。
C语言的struct中可以嵌套数组,但是这和LabVIEW中含有数组元素的cluster是不一样的,LabVIEW中需要将数组中的元素都拆开放入cluster中。
如果C语言的struct中含有一个指针,LabVIEW中的cluster只能用一个U32数值(32位系统上,64位系统上使用U64)来表示指针的地址,而不能将指针所指向的容放到Cluster中去。
如果声明的是指向struct的指针,才能在LabVIEW中使用cluster与之对应。
CLN节点的配置面板中,没有一个专门命名的“struct”或者“cluster”参数类型,应选择“Adapt to Type”就可以了。
如果参数的类型就是结构而非指针,考虑到C函数参数的压栈顺序,把一个结构体作为参数传给函数,相当于把结构中每个元素分别作为参数传递给函数。
图6为C语言中struct和LabVIEW中cluster的部分匹配图。