LabVIEW调用动态链接库dll
- 格式:pdf
- 大小:296.54 KB
- 文档页数:6
利用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完成。
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的调用【转载】武汉高收入高福利公司排行榜在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的输入输出端口,如果添加不完整,则需要再手动添加额外的输入端或者输出端。
0.参考示例:LabVIEW1.调用库函数节点2.配置参数2.1.返回参数类型:有Void,Numeric和String三种,如下图所示。
(1)VoidVoid is only available for return type and is not available for other parameters. Use Void for the return type if your function does not return any values.Even if the function you call returns a value, you can use Void for the return type. When the function returns a value and you select Void as the return type, the value returned by the function is ignored.(2)Numberic(pointer-sized integer),以winpcap.dll为例,如下图。
另外数据类型中的“指针大小整型”帮助文档的解释如下:(3)String目前还没碰到过,等遇到时再补充。
2.2.输入(出)参数其类型共有9种,常用的有数值、数组、字符串和匹配值类型。
2.2.1.数值需要注意的是,其传递选项有“值”和“指针”两种,分别对应值传递和指针传递。
a. 数据类型为int32函数原型为void LVint32(int32 input, int32 *output);本函数计算输入值的平方,然后将结果显示在“输出”中。
返回类型为void,input类型为int32,值传递output类型为int32,指针传递注:如将结果返回至某个控件,该控件本身即可为返回数据提供必要的内存空间。
b. 数据类型为float64函数原型为void LVfloat64(float64 input, float64 *output);本函数计算输入值的平方,然后将结果显示在“输出”中。
Labview 下建立dll及其使用1、建立动态连接库的C代码调用1.1建立函数原形1)后面框图程序中,调用CLF节点;2)配置一个函数原形,比如long add2(long a,long b),设置调用规程为C,其它不变,确定,退出;3)右键CLF节点,create C file,保存名字为code.cpp,以供VC++编译使用;1.2 编辑源代码文件1)将所需要的labview头文件复制到code.cpp所在目录中,包括:extcode.h platdefines.h fundtype.h;2) 打开code.cpp,添加关键词extern “c”、_declspec(dllexport)并包装;然后输入函数的功能代码,如果1个dll里面需要多个函数,则需要声明多个函数的原形。
本例子采用了2个函数,add 和mult2./* Call Library source file */#include "extcode.h"extern "C"{_declspec(dllexport) long add2(long a, long b);_declspec(dllexport) long mult2(long a, long b);}_declspec(dllexport) long add2(long a, long b){/* Insert code here 加法*/return(a+b);}_declspec(dllexport) long mult2(long a, long b){return(a*b); /* 乘法*/}2、VC++中编译产生dll1)建立project ,file→new-> win32 Dyna,mic Link Library,输入工程名,选择an empty dll project;2)添加code.cpp到source file,添加extcode.h platdefines.hfundtype.h到head files里面;3)设置dll参数project→settings→c/C++中设置参数:category:code generation ;根据函数要求可以选择1Byte\4 Byte\ 8Byte,采用默认就可以;multithread;其余默认可以;自己也可以微调;4)Build Build code.dll;5)Ok!3采用Labview测试验证。
问题:如何从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中的函数手动调用该函数。
收稿日期:2009-10-13作者简介:苗立交(1980),男,硕士研究生,研究方向为智能仪器仪表。
基于LabVIEW 的动态链接库的设计与调用苗立交1,杨新华1,王巍2(1.兰州理工大学电气工程与信息工程学院,兰州730050;2.本溪供电公司,辽宁本溪117000)摘要:介绍了具有USB 通信接口的动态链接库设计方法,并通过实例阐述了动态链接库关键的设计技术和具体调用步骤。
实验证明动态链接库技术与LabVIEW 软件相结合的机制解决了USB 总线与LabVIEW 软件通信的问题,提高了数据传输效率。
关键词:USB ;CY7C68013;LabVIEW ;动态链接库中图分类号:TP334.4文献标志码:A 文章编号:1000-0682(2010)04-0071-03Design and call the dynamic link library based on LabVIEWMIAO Lijiao 1,YANG Xinhua 1,WANG Wei 2(1.College of Elec &lnfo Eng ,Lanzhou University of Technology ,Lanzhou 730050,China ;2.Benxi Power Supply Company ,Liaoning Benxi 117000,China )Abstract :The method of designing the USB communication interface dynamic link library is de-scribed.The dynamic link library key design techniques and specific steps in the call is explained by ex-amples.It is clear that the combined method of the dynamic link library technology and LabVIEW soft-ware resolve the communication problem between them.Key words :USB ;CY7C68013;LabVIEW ;dynamic link library0引言USB 总线因具有热插拔、即插即用、共享式接口、接口体积小、传输速度快的优点,所以越来越多的测试仪器采用USB 接口实现上位机与下位机通信。
LabVIEW与外部程序间DLL文件的调用什么是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文件, 使程序不至于太过巨大。
如何调试LabVIEW 调用的DLL
问题(Frank):
我用Labwindow 编写了一个读文件的动态库, 即向动态库传递文件路径及文件名和某特定字符串,然后通个三个参数返回读到的值, 在labVIEW里调用该动态库,结果返回值老是显示打开文件失败, 不知错误出现在那里,另外在LabVIEW里如何调试确定传到动态库的参数是符合函数参数格式的呢?该函数在Labwindow里调试没有问题.请大侠指点迷津,不胜感激!
回答:
我好久没有用过CVI 了,计算机上也没有装,不过用CVI 来调试,应该和用VC 来调试原理是相同的,步骤也想类似。
我就以VC 为例说明一下。
首先在Debug 模式下build 出一个DLL 来。
(VC 7.1 即便是release 模式下也可以设置断点,单步运行,但别的编译器不一定行。
)然后用这个新的Debug DLL 覆盖原有的DLL。
关闭LabVIEW,点击VC 菜单Debug->Start (F5)。
因为工程生成的是不可以直接执行的DLL 文件,这时VC 会弹出一个对话框,问你用什么运行。
选择浏览,然后找到LabVIEW.exe。
(这个可执行文件也可以在工程属性中Debugging->Command 一栏设置。
)之后,VC 就会把LabVIEW 调用起来。
在VC 中设置好断点。
在LabVIEW 中运行想要调试的VI。
程序会停在你设置断点的地方。
调用动态链接库 2 - CLN 的配置选项双击一个CLN(Call Library Function Node)节点,就会出现它的配置对话框。
这个对话框有四页。
第一页是被调用函数的信息。
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 栏用于设定哪个线程里运行被调用的函数。
它的具体含义可以参考《LabVIEW 程序中的线程 4 - 动态连接库函数的线程》。
Calling convention 用于指明被调用函数的调用约定。
这里只支持两种约定:stdcall 和C call。
它们之间的区别在于,stdcall 由被调用者负责清理堆栈;C call 由调用者清理堆栈。
这个设置错误时,可能会引起LabVIEW 崩溃,所以一定要小心。
反过来说,如果LabVIEW 调用DLL 函数时出现异常,首先就可以考虑这个设置是否正确。
(Windows API 一般使用的都是stdcall;标准C的库函数大多使用 C call。
如果函数声明中有类似__stdcall 这样的关键字,它就是stdcall 的。
)第二页是函数参数的配置,这是最复杂的部分,留待下次详细分析。
收稿日期: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调用
郑铭
【期刊名称】《电子测试》
【年(卷),期】2009(000)006
【摘要】本文在介绍了动态链接库程序概念的基础上,以台湾泓格科技股份有限公司ISI-AD32、32通道隔离A/D数据采集卡为例,介绍了在LabVIEW 8.5开发环境下,通过利用LabVIEW开发环境中"导入"工具实现DLL调用方法.该方法克服了程序设计者通常在开发环境中通过CLF节点进行调用繁琐、各种不同类型的变量转换不正确时会造成不能控制的问题,及对类似的硬件提供的LabVIEW驱动版本太低或没有驱动,没有办法控制的问题同样可以解决.该方法简单实用,非常方便快捷,希望广大程序设计广为利用.
【总页数】4页(P33-35,39)
【作者】郑铭
【作者单位】91370部队,福建省福州市,350014
【正文语种】中文
【中图分类】TP312
【相关文献】
1.基于LabVIEW环境下调用DLL实现仪器控制 [J], 侯博;廖醒宇
2.嵌入式LabVIEW调用DLL实现数据采集 [J], 黄佳钰;邓焱;张锦杰
bVIEW平台下调用DLL实现PC/104数据采集 [J], 袁魏华;韩裕生;张伟伟;李
小明
4.基于调用DLL的LabVIEW数据采集的实现 [J], 张亿雄;顾海明
bVIEW 8.6报表工具包生成和调用DLL问题分析及对策 [J], 胡胜文;万加林因版权原因,仅展示原文概要,查看原文内容请购买。