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,此时路径取决于
在parameters页,系统会自动添加DLL的输入输出端口,如果添加不完整,则需要再手动添加额外的输入端或者输出端。
需检查DBL输入:Value;DBL输出Pointer to Value。
3)务必给DLL的每个输出端添加初始值,否则DBL数组没有输出。
len、 len2分别为输入数组、输出数组的个数,需将这两个参数设置为与实际的数组大小一致。
4)C调用,具体为什么选择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),可参考如下链接:
如果是静态调用,则可不用设置该项。
关于调用DLL导致LabVIEW崩溃的解决办法,可参考如下链接:
http://digital.ni.com/public.nsf/allkb/C48880127BDB18B5482571BC00289A23
4. 生成DLL的两种方式
1). LabVIEW环境
不过多赘述。在DLL和LabVIEW之间传递参数,最常用的三种数据类型是:数值类型、字符串、数值型数组。
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时内存资源的浪费。
转载地址:
http://blog.163.com/lxfan_0406@126/blog/static/6096992620118159222229/
用户403664 2013-11-19 09:54