程下,肯定不会被同时调用。对于非多线程安全的动态链接库,这种方式就保证了它的安
全。
让我们回到配置对话框第一页,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”。这个设置中
还有其他两个选项,带有“Handle”的参数类型都是表示 LabVIEW 定义的特殊类型的。在
第三方的 DLL 中不会使用到数组参数作为输出值时,要记得为输出的数组数开辟空间。开
辟数据空间的方法有两种:第一种方法,创建一个长度满足要求的数组,作为初始值传递
给参数,输出数的数据就会被放置在输入数组的所在的内存空间内。第二种方法是直接在
参数配置面板上进行设置。在 Minimum size 中写入一个固定的数值,LabVIEW 就会按
此大小为输出的数组开辟空间。在 Minimum size 中选择函数的其它数值参数,而不是固