欢迎来到天天文库
浏览记录
ID:50470308
大小:463.62 KB
页数:6页
时间:2020-03-06
《LabVIEW如何方便地调用DLL文件.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、LabVIEW如何方便地调用DLL文件LabVIEW调用DLL文件 LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用。比如,在实际的工程项目中,用户可以用C++语言实现软件的运算部分,并把这些功能构建在DLL文件中,然后再使用LabVIEW编写程序的界面部分,并通过调用编写好的DLL来调用运算部分的功能。 LabVIEW中是通过CallLibraryFunctionNode(CLN)节点来完成DLL文件调用的。创建一个新的VI,右击程序框图,在FunctionsPalette中依次选中Connectivit
2、y——Libraries&Executables工具栏即可找到该节点(如下图)。将节点放置在程序框图中,双击会出现它的配置对话框,共有四页。第一页用于填写被调用函数的信息Librarynameorpath(库名/路径)需给出DLL文件名和路径,若引用操作系统路径下的DLL文件,直接输入文件名也可调用,其它的必须输入全路径。在这里已经给出名字的DLL是被静态加载到程序中的,也就是说当调用了这个DLL的VI被装入内存时,DLL同时被装入内存。LabVIEW也可动态加载DLL,只要勾选上Specifypathondiagram(在程
3、序框图中指定路径)的选项即可。选择了这个选项,在Librarynameorpath(库名/路径)中输入的内容就无效了,取而代之的是CLN节点多出一对输入输出,用于指明所需要使用的DLL的路径。这样,当VI被打开时,DLL不会被装入内存,只用程序运行到需要使用这个DLL中的函数时,才把其装入内存。Functionname是需要调用的函数的名称,LabVIEW会把DLL中所有的暴露出来的函数都列出,用户只要在下拉框中选取即可。Thread栏用于设定哪个线程里运行被调用的函数。用户可以通过CLN节点的配置面板来指定被调用函数运行所在
4、的线程。CLN的线程选项非常简单,只有两项:RuninUIthread和Runinanythread。LabVIEW的程序框图上直接可以看出一个CLN节点是选用的什么线程。如果RuninUIthread,节点颜色是橙色的;Runinanythread则是浅黄色的通常情况下,除非使用的动态链接库是多线程安全的,CLN中选择Runinanythread方式;否则必须选择RuninUIthread方式。判断一个动态链接库是不是多线程安全的,需通过以下方法:如果一个动态链接库的文档中没有明确说明它是多线程安全的,那么就要当作是非多线程
5、安全的;在可以看到动态链接库源代码的条件下,如果代码中存在全局变量、静态变量或者代码中看不到有lock一类的操作,那么这个动态链接库也就肯定不是多线程安全的。 选择了Runinanythread方式,LabVIEW会在最方便的线程内运行动态链接库函数,且一般会与调用它的VI在同一个线程内运行。因为LabVIEW是自动多线程的语言,它也很可能会把动态链接库函数分配给一个单独的线程运行。如果程序中存在没有直接或间接先后关系的两个CLN节点,LabVIEW很可能会同时在不同的线程内运行它们所调用的函数,也许是同一函数。对于非多线程
6、安全的动态链接库,这是很危险的操作。很容易引起数据混乱,甚至是程序崩溃。 选择RuninUIthread方式,因为LabVIEW只有一个界面线程,所以如果所有的CLN设置都是界面线程,那么就可以保证这些CLN调用的函数肯定全部都运行在同一线程下,肯定不会被同时调用。对于非多线程安全的动态链接库,这种方式就保证了它的安全。让我们回到配置对话框第一页,Callingconvention用于指明被调用函数的调用约定。这里只支持两种约定:stdcall和Ccall。它们之间的区别在于,stdcall由被调用者负责清理堆栈,Ccall
7、由调用者清理堆栈。这个设置错误时,可能会引起LabVIEW崩溃,也就是说如果LabVIEW调用DLL函数时出现异常,首先应该考虑这个设置是否正确。(WindowsAPI一般使用的都是stdcall;标准C的库函数大多使用Ccall。如果函数声明中有类似__stdcall这样的关键字,它就是stdcall的。)第二页是函数参数的配置(图4)。DLL和LabVIEW之间传递参数,最常用的三种数据类型是数值、数值型数组和字符串。C语言中经常把指针或者数据的地址在函数间传递,在32位操作系统中,可以使用int32数值来表示指针。因此,
8、当需要在LabVIEW中传递指针数据时,可以使用I32或U32数值类型来表示这个地址类型的数据。但是,64位的程序中,数据的地址只能使用I64或U64来表示。这样,如果一个调用了DLL函数的VI,并且函数参数中有地址型数据,使用固定数据类型的数值来表示地址,就要准备两份代码。
此文档下载收益归作者所有