在LabVIEW中调用DLL的整个过程及注意事项

点击打开链接

为什么LabVIEW在调用我的LabVIEW DLL的时候会出现崩溃?

如何在LabVIEW下调用DLL

全在这里


1. LabVIEW支持的数据类型

< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />    

在LabVIEW中调用DLL的整个过程及注意事项 - 小雨点 - lxfan_0406的博客

另外,可参考…\Program Files\National Instruments\LabVIEW 2009\examples\dll\data passing\Call Native Code.llb\Call DLL.viVI列举了LabVIEWC语言中兼容的数据类型。见下表。

在LabVIEW中调用DLL的整个过程及注意事项 - 小雨点 - lxfan_0406的博客

2. VI里调用DLL时,在DLL的左侧给输出端口添加初始化的值。

给输出端口添加初始化值的目的是分配内存给输出端口。该初始化数组元素的个数至少为实际输出数组的个数。若过小,则DLL不正常运行;若相等,则DLL正常运行;若过大,则DLL的数组输出端口除有效数据外,还有其他一些为0的非有效数据。

< xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" /> 

在LabVIEW中调用DLL的整个过程及注意事项 - 小雨点 - lxfan_0406的博客

 

3.使用DLL的步骤

1)制作子VI,添加控件接口到连接端(connector)。

2)在新建的VI中添加DLL,在DLL中指定其路径,会自动添加该DLL包含的输入输出端口。对于数值型输出,选择Point to value

 
在LabVIEW中调用DLL的整个过程及注意事项 - 小雨点 - lxfan_0406的博客

选中“Specify path or diagram”,表示动态调用该DLL,此时路径取决于

在LabVIEW中调用DLL的整个过程及注意事项 - 小雨点 - lxfan_0406的博客 最上端的路径输入端, Library name or path 里输入的路径无效。

parameters页,系统会自动添加DLL的输入输出端口,如果添加不完整,则需要再手动添加额外的输入端或者输出端。

需检查DBL输入:ValueDBL输出Pointer to Value

 

在LabVIEW中调用DLL的整个过程及注意事项 - 小雨点 - lxfan_0406的博客

3)务必给DLL的每个输出端添加初始值,否则DBL数组没有输出。

len len2分别为输入数组、输出数组的个数,需将这两个参数设置为与实际的数组大小一致。

4C调用,具体为什么选择C调用,可参考:

Calling convention 用于指明被调用函数的调用约定。这里只支持两种约定:stdcall  C call。它们之间的区别在于,stdcall 由被调用者负责清理堆栈;C call 由调用者清理堆栈(在LabVIEW中调用该DLL,则选择C调用)。这个设置错误时,可能会引起 LabVIEW 崩溃,所以一定要小心。反过来说,如果 LabVIEW 调用 DLL 函数时出现异常,首先就可以考虑这个设置是否正确。
Windows API 一般使用的都是 stdcall;标准C的库函数大多使用 C call。如果函数声明中有类似__stdcall 这样的关键字,它就是 stdcall 的。)具体链接为:

http://www.testdevelop.com/forum/viewthread.php?tid=255&extra=&page=9

另外,也可以这样理解。

对库函数的调用规则,选择stdcall。比如调用凌华的数据采集卡驱动提供的DLL,则选择stdcall调用规范。

调用自己用C语言写的程序而后编译成DLL文件时,调用规范选择“C”。

5)选择哪种线程?

选择Run in UI thread,具体为什么选择该界面线程(Run in UI thread),可参考如下链接:

http://ruanqizhen.wordpress.com/2007/01/26/labview-%e7%a8%8b%e5%ba%8f%e4%b8%ad%e7%9a%84%e7%ba%bf%e7%a8%8b-4-%e5%8a%a8%e6%80%81%e8%bf%9e%e6%8e%a5%e5%ba%93%e5%87%bd%e6%95%b0%e7%9a%84%e7%ba%bf%e7%a8%8b/

6 )如果动态调用,则必须设置调用 DLL 的那个 VI 。设置该 VI 的执行系统不能够为“ User Interface ”。
在LabVIEW中调用DLL的整个过程及注意事项 - 小雨点 - lxfan_0406的博客

如果是静态调用,则可不用设置该项。

关于调用DLL导致LabVIEW崩溃的解决办法,可参考如下链接:

http://digital.ni.com/public.nsf/allkb/C48880127BDB18B5482571BC00289A23

4. 生成DLL的两种方式

1). LabVIEW环境

不过多赘述。在DLLLabVIEW之间传递参数,最常用的三种数据类型是:数值类型、字符串、数值型数组。

2 )VC等环境

VC环境为例,参考一个例子解释:

http://cspiao1986.blog.163.com/blog/static/70113974200911225944903

此例子讲述了如何在VC中建立DLL,以及如何在VC中使用DLL

5.动态链接库

1)静态库和动态库

静态库:函数和数据被编译成一个二进制文件(一般为LIB格式),在使用静态库编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他的模块组合起来创建最终的可执行文件(EXE文件)。

动态库:在使用动态库时,往往提供两个文件:引入库(.lib)和一个DLL(.dll)文件。该引入库不同于静态库,因为引入库文件包含了该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL。

2)使用动态链接库的好处

动态链接库通常不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含了能被可执行程序或其他DLL调用来完成某项工作的函数。只有在被调用时,才被载入内存。如果多个应用程序同时调用该DLL,则在内存中只需载入一次,从而避免多个应用程序调用相同DLL时内存资源的浪费。

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
LabVIEW可以通过动态调用DLL来实现与其他编程语言的交互,这里给出一个简单的示例: 1. 编写C++代码并生成DLL文件 ```c++ // mydll.cpp #include "stdafx.h" #include <iostream> using namespace std; extern "C" __declspec(dllexport) int add(int a, int b) { cout << "This is a DLL function!" << endl; return a + b; } ``` 在Visual Studio创建一个Win32控制台应用程序,然后在mydll.cpp编写上述代码,最后生成DLL文件。 2. 在LabVIEW调用DLLLabVIEW,可以使用Call Library Function Node节点来动态调用DLL。具体步骤如下: 1. 打开LabVIEW,新建一个VI。 2. 在Block Diagram右键,选择Functions -> All Functions -> Connectivity -> Libraries & Executables -> Call Library Function Node。 3. 将Call Library Function Node节点拖拽到Block Diagram。 4. 右键点击Call Library Function Node节点,选择Select a VI Server Class -> .NET Class -> System -> IntPtr,这样可以将返回值类型设置为IntPtr类型。 5. 在Call Library Function Node节点上方的Function Prototype,设置Library Name为DLL文件的路径(如D:\mydll.dll)。 6. 在Call Library Function Node节点上方的Function Prototype,设置Function Name为DLL需要调用的函数名(如add)。 7. 在Call Library Function Node节点上方的Function Prototype,设置Parameter Data Types为需要传入的参数类型(如int32,int32)。 8. 在Block Diagram添加Constant节点,设置其值为需要传入的参数(如2,3)。 9. 将Constant节点与Call Library Function Node节点连接起来。 10. 运行VI,即可得到返回值。 注意:LabVIEW动态调用DLL需要使用C调用约定,所以在编写DLL文件时需要使用extern "C"修饰。同时需要注意传入参数和返回值类型的对应关系,不匹配会导致程序崩溃。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值