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 中是...