分享好友 方案首页 频道列表

NI LabVIEW调用外部程序DLL文件的CLN ———NI LabVIEW调用外部程序DLL文件的CLN

2012-04-15北京中科泛华测控技术有限公司DAQ事业部

  什么是DLL文件
  DLL(动态链接库)文件是Dynamic Link Library的缩写形式,是一种允许程序共享执行特殊任务所必需的代码和其他资源的可执行文件。其多数情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名。Windows提供的DLL文件中包含了允许基于Windows的程序在Windows环境下操作的许多函数和资源。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。这些函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源,多个应用程序可同时访问内存中单DLL副本的内容。总之,DLL是一个包含可由多个程序同时使用的代码和数据的库。动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
  由于向运行于Windows操作系统下的程序提供代码、数据或函数,程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。在Windows操作系统中,DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。而有些DLL文件可以被许多程序共用,因此程序设计人员可以利用DLL文件, 使程序不至于太过巨大。但是当安装的程序越来越多,DLL文件也就会越来越多, 如果当删除程序的时候, 没有用的DLL文件没有被删除的话, 久而久之就造成系统的负担了。
  通过使用DLL,程序可以实现模块化,由相对独立的组件组成。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,可能有一个工资计算程序,税率每年都会更改,当这些更改被隔离到 DLL中以后,我们无需重新生成或安装整个程序就可以应用更新。
  总的来说,使用DLL文件有以下好处:1、多个应用程序可以共享代码和数据。比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态链接库实现的。2、在钩子程序过滤系统消息时必须使用动态链接库。3、动态链接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作,而且各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态链接库中,供其他成员使用。4、实现应用程序的国际化,往往需要使用动态链接库。使用动态链接库可以将针对某一国家、语言的信息存放在其中。例如,在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态链接库实现的。对于不同的版本,使用不同的动态链接库,常用的一些编程软件均可以编写DLL文件。DLL不是独立运行的程序,而是某个程序的一个部分,它只能由所属的程序调用,用户不能,也不需要打开它。 

  LabVIEW调用DLL文件
  LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用。比如,在实际的工程项目中,用户可以用C++语言实现软件的运算部分,并把这些功能构建在DLL文件中,然后再使用 LabVIEW编写程序的界面部分,并通过调用编写好的DLL来调用运算部分的功能。
  LabVIEW 中是通过Call Library Function Node(CLN)节点来完成DLL文件调用的。创建一个新的VI,右击程序框图,在Functions Palette中依次选中Connectivity——Libraries&Executables工具栏即可找到该节点(图1)。


                 图1 Call Library Function Node
  将节点放置在程序框图中,双击会出现它的配置对话框,共有四页。第一页用于填写被调用函数的信息(图2)。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节点是选用


                  图2 填写被调用函数信息
的什么线程。如果Run in UI thread,节点颜色是橙色的;Run in any thread则是浅黄色的(图3)。


                 图3 CLN不同线程对比
  通常情况下,除非使用的动态链接库是多线程安全的,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)。


                  图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”。这个设置中还有其<

收藏
神州普惠试验检验管理解决方案
试验检验管理系统TCM紧紧围绕产品生产试验检验的全过程进行系统规范的监控和管理,有力的监管了整个试验检验过程、协调组织了试验检验工作的开展、规范了试验检验过程的管理,同时还以方便高效的手段,整理和收集了全部试验检验过程的信息数据。

0评论2014-03-24

宏电工业级TD无线路由器应用于交警局电子警察项目
“电子警察”是高科技的交通管理手段,也是道路交通技术监控系统的重要环节,是智能交通系统建设的重要组成部分。它以其无人值守、自动记录、容量大、无需当场处罚、便于管理等优点成为交通管理工作中必不可少的装备。

0评论2013-02-27

领邦公布新型全自动检测方案:弹丸尺寸的快速检测
近日,北京领邦仪器技术有限公司(后文简称“领邦”)公布了一套新型的全自动检测方案——弹丸尺寸检测系统。该系统是一套在线全自动终检设备,采用激光扫描的方式,在计算机中还原炮弹外形,能够实现炮弹外形尺寸和形位公差的快速检测,满足大批量产品的在线自动化检测,避免人为检测造成的误差,同时保证数据的可靠性以及提高数据管理方便性。

0评论2012-08-31

仪器总线技术的回顾与展望
在测试测量领域,仪器总线技术的发展历来是工程师和科学家们最为关心的部分。从上世纪60年代推出的专用于仪器控制的GPIB总线,到现在被广泛使用的 USB、VXI、PXI和最新推出的LXI、PXI Express,不断涌现的新型总线技术在帮助我们的工程师更快捷高效的完成测量任务的同时,也引起了行业内专家们的广泛争论,究竟哪一种总线将会主宰未 来的测试测量领域呢?

0评论2012-05-28

加固电源典型应用方案
美国北大西洋(NAII)公司为军工和航空领域的嵌入式市场所提供的加固电源,类型齐全,无论是标准型产品还是定制型产品,都应有尽有。在国内外航空、航海、舰船等应用中占有及其重要的地位。

0评论2012-05-03

倾角传感器在无人机上的应用
无人驾驶飞机简称无人机,是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机。机上无驾驶舱,但安装有自动驾驶仪、程

0评论2012-04-13

倾角传感器在移动通讯车平衡系统上的应用
移动通信基站车是移动通信领域中用于应急通信信道建立的系统集成车辆。主要的功能一般包括GSM、CDMA、3G基站信道的建立、无线计

0评论2012-04-13

倾角传感器在水平平台测量上的应用
在仪器仪表、精密工具、机械制件的检验等行业经常会使用到水平平台,而大理石平台可以作为一个理想的选择,因为大理石的平台是一

0评论2012-04-13

SST倾角传感器在阳光追踪系统上的应用
随着能源的匮乏,人类越来越注重利用新型能源来代替现有的煤、石油原料,利用太阳能获得能源就是一个非常好的办法。阳光追踪器

0评论2012-04-13