2.1 Function页
1)Library path or name
Library Name:
即只写动态库的名称,不包含路径信息,动态库
必须
位于Labview自动搜索目录或系统路径下,即系统环境变量path指定的所有目录;在build时,项目
不会自动
包含该库,所以项目移植时,需要保证目标电脑的PATH目录下包含该dll。
(不同操作系统使用的搜索顺序不一致)
。
Window搜索顺序:<labview>\resource--->当前模块所在目录-->\Windows\System32--->PATH
Library Path:
即绝对路径或相对路径+动态库名称,若动态库不在系统目录下,在build时,项目会
自动包
含该库,在exe所在目录,./data/xxx.dll。(对于
系统自带的dll
,如C:\Windows\System32的库
一定不能通过路径指定
,在其它电脑上运行程序时由于找不到dll会不正常或崩溃)
Specify path on diagram
: 如果使用该选项,则labview会忽略Library path or name,所以在打包过程中不会自动将该dll复制到data目录下,除非将dll显示地包含在Always Included类别下。
2)Function name
根据需要选择需要的函数
3)Thread
-
run in UI thread:
即调用了该函数的VI使用“user interface”执行系统来执行。有些dll是线程不安全的,故只能使用该选项。因为labview针对“user interface”执行系统只有一个进程可用,所有执行系统为“user interface”的VI不能并行运行。当调用该dll的VI的执行属性和此处不一致时,当程序执行到该调用节点时,会发生执行系统切换,调用结束又会发生一次执行系统切换,降低程序允许速度,且由于VI的默认执行系统是“same as caller”,当选择该调用方式时,如需要对该VI的所有父VI的执行属性都做检查。
-
in any thread:
即调用了该函数的VI可以使用任意执行系统来执行,如果该VI属性是可重入或预分配副本执行,则必须选择该调用方式。如果线程不安全的dll选择该调用方式,会使程序会崩溃,并抛出异常:Resetting VI: ACBRProxyCaller.AABBBBBB(此处为8位16进制数,每次运行得到的值不一样,应该是内存地址之类)。
-
注意
如果dll是由Labview编译, 必须使用Run in any thread,且调用该dll的vi的执行线程也 不 能是UI线程,即不能选择same as caller这个选项;
https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z000000P6tcSAC&l=zh-CN
若需多线程调用由Labview编译成的dll,dll对应用的源码.VIs(Top vi and all subVIs)的重入属性必须要设置为预分配副本;
https://forums.ni.com/t5/LabVIEW/LabVIEW-built-DLL-s-in-a-multi-threaded-C-app-Help-Needed/td-p/822273?profile.language=zh-CN
非线程安全Dll不能设置为Run in any thread?如何知道dll是不是线程安全的?
-
It does not store any global data, such as global variables, files on disk, and so on.
-
It does not access any hardware. In other words, the code does not contain register-level programming.
-
It does not make any calls to any functions, shared libraries, or drivers that are not thread safe.
-
It uses semaphores or mutexes to restrict access to global resources.
-
It is called by only one non-reentrant VI。
4)Calling convention 调用规范
NI的官方解释是:C calling 允许可变长度的参数列表,所以使用到的堆栈的清理工作由调用VI完成,而standcall(WINAPI)的参数列表长度是固定的,所以内存释放工作由被调用的函数完成。
注意:如果调用方(LabVIEW)和被调用DLL函数使用不同的调用规范,那会出现:要么它们都将数据移出堆栈或者它们都不清空堆栈。任意一种情况会在被调用函数返回的时候导致 LabVIEW崩溃
2.2 Parameters
定义函数参数类型和返回值类型,如果函数原型为 function(int *a, int b, int *c,char *string, mytype struct)
-
a为数组,type---array, arrayFormat---Array Data Pointer, Minium size---数组长度
-
b为单个数值,type---Numeric, Constant, Pass-Value
-
c为指向数值的指针,type---Numeric, Pass-Pointer to Value, 在labview中有获取变量地址的函数,但一般用不上,因为类似这种输入参数为指向单个数值的指针,一般是用于存储函数的返回值(此时,return value一般为0或1,代表该调用执行成功与否,而指向数值或字符的指针里存储实际需要的信号。),故在输入端需要连接相同数据类型的输入控件,输入控件不用初始化。
-
string为字符串,type---String, String format---C String Pointer,使用时直接在输入端连接字符串即可,同上,如果该字符串是实际需要的信号,则在输入端需要连接相同数据类型的输入控件,输入控件不用初始化。
-
struct为结构体,在labview中对应簇,type---Adapt to Type, Data format---Handles by Value,如果确实用作输入参数,直接把簇连接在输入端即可,如果是返回值为簇,则需要在输入端连接一个初始化了的簇。注意簇和结构体字节对齐。
-
其余数据类型用到再记录。
2.3. CallBacks
目前没使用过,但是这里只能从该dll中选择的函数
2.4 Error Checking
提供了maximum,Default, Disable三个等级,默认是Default,如果可忽略错误,应选择Disable,否则在调用dll出错时会等待较长时间。
https://zone.ni.com/reference/zhs-XX/help/371361R-0118/lvexcodeconcepts/configuring_the_clf_node/ NI官方文网
大家都知道,
LabVIEW
在做大型项目的时候,我们不可能把所有的函数全部展示在主VI中,所以肯定会使用到子VI,子VI的有两种,一种是直接使用
LabVIEW
中的函数生成功能的VI,还有一种方式就是
调用
动态链接库
DLL
生成相应功能的VI,今天给大家介绍一下
调用
动态链接库
DLL
生成VI。本笔记为笔者在项目中记录,为方便之后查看,同时也希望能帮助有需要的朋友。
LabVIEW
调用
DLL
时出现异常0xc0000005代码
当
调用
本地
DLL
时,
LabVIEW
崩溃,并且收到一条错误消息,说明发生了内存访问冲突(异常代码:0xc0000005)。
将
LabVIEW
版本从32位更改64位,现在应用程序出现随机行崩溃,崩溃时仍有异常代码:0xc0000005。
确实存在一些不同的原因可能会导致
LabVIEW
在
调用
dll
函数的时候崩溃,如下所示:
1.确保选择了和
DLL
相同的
调用
规范
如果
调用
库函数
节点
中的
调用
规范与
DLL
的
调用
规范不匹配,则会导致LabV
在工具中找到导入选择共享库(.
dll
) 点击下一步,选择要导入的
dll
文件及头文件(.h)点击下一步
注意:1、若该程序中
调用
了其他头文件等,将他的文件夹添加到include中
2、预处理定义需要输入如下来解析数据类型:ULONG = unsigned long;VOID = void;LONG = long;UCHAR = unsigned char;PUCHAR = unsigned char*;PULONG = unsigned long*;WINAPI;BOOL =
WINDIR: //系统目录 - C:\WINDOWS
SYSTEMROOT: //系统目录 - C:\WINDOWS
SYSTEMDRIVE: //系统根目录 - C:
HOMEDRIVE: //当前用户根目录 - C:
US
ER
PROFILE: //当前用户目录 - C:\Us
er
s\Kandy
HOMEPATH:
确保环境路径变量包含保存解释器和相应库文件的目录,将允许任何System Exec
调用
将p
er
l和python令牌识别为使用P
er
l和Python解释器执行脚本的命令。需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。需要确保修改环境路径变量以包含解释器和相应库文件所在的目录,以便机器将P
er
l和Python标记识别为使用解释器的命令。此文件夹包含一个P
er
l和Python脚本,以及为
调用
这些脚本而生成的
LabVIEW
代码。
该类的主题结构如下:(为了方便阅读,我删除了一些格式验证之类的代码)
@Call
er
Sensitive
public static Object new
Proxy
Instance(ClassLoad
er
load
er
,
Class<?>[] int
er
f...
显示变量没有被定义,原因是clear 关键字的问题,去掉即可!!! 未找到 文件路径,定位: 文件路径中不能有中文路径
转载于:https://www.cnblogs.com/hwtxf/p/6280360.html...
转自:http://bbs.elecfans.com/jishu_469502_1_1.html
LabVIEW
调用
DLL
文件
LabVIEW
支持通过
调用
DLL
文件的方式与其它编程语言混合使用。比如,在实际的工程项目中,用户可以用C++语言实现软件的运算部分,并把这些功能构建在
DLL
文件中,然后再使用
LabVIEW
编写程序的界面部分,并通过
调用
编写好的
DLL
来
调用
运算部分的功能。
LabVIEW
中是...