调用动态链接库 2 – CLN 的配置选项

    双击一个 CLN(Call Library Function Node)节点,就会出现它的配置对话框。这个对话框有四页。

    第一页是被调用函数的信息。
    Library name or path 是DLL文件名和路径。在系统路径下的DLL,直接输入文件名即可,否则需要全路径。在这里知名的DLL是被静态加载的程序中的。当调用了这个DLL的VI被装入内存时,DLL也同时被装入内存。
    LabVIEW 也可动态加载DLL。只要把 Specify path on diagram 选上就可以了。选择了这个选项,在 Library name or path 中输入的内容就无效了。取而代之的是,CLN 节点多出一对输入输出,用于指明你需要使用的DLL的路径。这样,当VI被打开时,DLL不会被装入内存,只用程序运行到需要使用这个DLL中的函数时,才把其装入内存。
    Function name 及需要调用的函数的名称。LabVIEW 会把DLL中所有的暴露出来的函数都列出,用户只要在下拉框中选取即可。
    Thread 栏用于设定哪个线程里运行被调用的函数。它的具体含义可以参考《LabVIEW 程序中的线程 4 – 动态连接库函数的线程》。
    Calling convention 用于指明被调用函数的调用约定。这里只支持两种约定:stdcall 和 C call。它们之间的区别在于,stdcall 由被调用者负责清理堆栈;C call 由调用者清理堆栈。这个设置错误时,可能会引起 LabVIEW 崩溃,所以一定要小心。反过来说,如果 LabVIEW 调用 DLL 函数时出现异常,首先就可以考虑这个设置是否正确。
    (Windows API 一般使用的都是 stdcall;标准C的库函数大多使用 C call。如果函数声明中有类似 __stdcall 这样的关键字,它就是 stdcall 的。)

    第二页是函数参数的配置,这是最复杂的部分,留待下次详细分析。

    第三页用于为DLL设置一些回调函数,可以使用这些回调函数在特定的情形下完成初始化、清理资源等工作。
    如果为 Reserve 选择了一个回调函数,那么当一个新的线程开始调用这个DLL时,这个回调函数首先被调用。可以利用这个函数为新线程使用到的数据做初始化工作。
    如果一个线程使用了这个DLL,在线程结束时,它会去调用 Unreserve 中指定的回调函数。
    Abort 中指定的函数用在 VI 非正常结束时被调用。比如按 Abort 按钮让一个VI停止,而不是让他运行完。
    这里的几个回调函数必须要由DLL的开发者按照特定的格式实现。它的原型就是 Prototype for these procedures 中列出的那个。如果你使用的DLL不是专为 LabVIEW 设计的,一般不会包含这样的回调函数。

    第四页是错误处理方式,这上面说明写得已经够详细了,我也在补充不了什么了。不过,像我在《用户界面设计 4 – 帮助和反馈信息》里提到的,把帮助文档直接写在界面上的地方,都是极不常用的设置。所以,我们基本上可以不关心这页的设置。

《我和LabVIEW》目录

Advertisements

调用动态链接库 1 – 动态链接库导入工具

    在 Windows 系统上,动态链接库就是DLL文件。调用DLL是 LabVIEW 与其它语言混合使用是最重要的一种方法。比如,在一个大的项目中,用户可以用 C++ 语言实现软件的运算部分,并把这些功能构建在DLL文件中;再使用 LabVIEW 编写程序的界面部分,并通过调用编写好的DLL来调用运算部分的功能。
    现在轻易就可以找到完成各种功能的DLL,LabVIEW 通过调用它们,也几乎无所不能。

    在 LabVIEW 中,通过 Connectivity -> Libraries & Executables -> Call Library Function Node(CLN)节点来调用DLL中的函数。
    在函数选板上,它旁边的一个节点是 Code Interface Node,这个 CIN 节点也是用来与C语言混合编程用的。这是在 CLN 节点出现以前,LabVIEW 调用C函数的方法。现在有了CLN,可以不再考虑它了。(我个人强烈建议:不要使用CIN!因为那样会遇到很多问题,但没人能帮你解决。)

    在 LabVIEW 中调用 DLL 中的函数,最大的难度就在于把函数参数的数据类型映射为相应的 LabVIEW 中的数据类型。在准备研究 CLN 中的参数如何配置之前,可以先考虑一下这个工具:Tools -> Import -> Shared Library。这个工具专门用作把 DLL 中的函数包装成 VI,升成的每个 VI 中最主要的部分就是一个 CLN 节点。它自动帮你把函数的参数都已经设置好了,有了这个工具你就不需要再费脑筋去考虑数据类型匹配的问题了。
    这个工具的第一个版本是我开发的。它虽然不算完美,但大多数情况下也够用了。如果你有现成的DLL,打算在LabVIEW 中使用,首先应该考虑的就是用这个工具,把DLL中所有函数都包装成 VI。再使用起来,就方便多了。

    某些特别复杂的情况下,Import Shared Library 这个工具可能无法处理,或者包装出来的 VI 不令人满意。这时就需要编程人员手工做一些设置或修改了。因此,高级用户了解这些数据类型的匹配也还是有必要的。我会在后续文章里对此做一详细的解释。

《我和 LabVIEW》目录

用户界面设计 4 – 帮助和反馈信息

    用户界面要照顾到那些不熟悉它的用户。为了方便用户了解界面的使用方法,需要给用户提供足够的帮助信息。对于 LabVIEW,给用户提供提示主要通过以下几个手段:用户手册、在线帮助窗口、提示条、利用控件的标题、选项文字、直接把帮助文字写在界面上。

    不论何时,都应该尽量使用有意义的控件名称。比如某一控件用来表示使用触发信号的上跳沿还是下跳沿作为触发条件。假若偷懒,不给这个控件起名,或者起个很简略的名称如“方式”,用户在看到这个控件时还是无法得知其确切用途。不如将名称写的详细一些,如图1所示的“边沿触发方式”,会更便于用户理解。
    单有控件标题还不够完善。因为这个控件的输入值只有两种,可以使用布尔数值类型来表示。但是用户并不清楚“真”值在这里表示的是上跳沿还是下跳沿。因此,还应该把表示当前状态的布尔文本也显示出来。这样用户就可以行处的知道当前是什么方式。


图1:一个布尔型控件

     提示条在一般程序中使用的非常广泛,把鼠标移到工具条的按钮上,就会出现一个黄色的小条提示这个按钮的用途。但是,由于 LabVIEW 有一个 Context Help 窗口,使用 LabVIEW编写的程序大多数是把帮助信息写在这个在线帮助窗口里,就不需要再为界面添加提示条了。与提示条相比,在线帮助窗口面积比较大,可以写入更详细的信息,但是有时候可能影响整个界面的美观。

    在线帮助窗口可以容纳的信息也还是有限的,对于十分难以掌握的界面,就只能把信息写到用户手册中去了。如果用户手册有相关内容一定要在界面上醒目的提示用户可以查看用户手册。在 LabVIEW 程序中,一般是把相关的链接写在在线帮助窗口中。

    对于那些不经常被访问到的界面,比如用户可能一两年才使用某一配置界面一次,是不能指望用户记住界面上每个条目的意义的,而且这样的界面也不必做的太简洁。因此可以把帮助信息直接就写在界面上。

    以 Import Shared Library 工具为例,下图是它的一页界面。在这个界面上其实用户真正需要选择的就只是“Error Handling Mode”这一项。界面下方的文字,是针对不同的错误处理模式的解释说明。用户选择不同的模式,给出的帮助文字也会相应调整。由于这个错误处理模式仅用文字描述还不够直观,因此界面中部还给出了图片作为帮助信息。
    按 Ctrl+H 键,就会看到在线帮助窗口,里面有对每个界面元素的解释。如果觉得这还不够详细,可以点击界面右下方的 Help 按钮打开用户手册,阅读更为细致的解释。


图2:Import Shared Library 的界面

《我和 LabVIEW》目录

公司十周年庆典

    今年是NI上海分公司成立的第十个年头。昨天,公司在举办了一次隆重的庆典。庆典分两部分:

    下午的活动地点在金茂一楼音乐厅。第一环节,领导讲话。除了上海的大老板,这次还有几位总部的VP特地赶来参加庆典。
    之后,几位员工代表回顾了自己在公司里的往事以及自己对公司的感受。这一环节的形式颇有点像《艺术人生》。(我从来没看过《艺术人生》这个节目,只是看过朱军和冯巩在春节晚会上的小品。至于小品和真实节目是否有差距就不得而知了)
    接下来,是新员工展示我们产品。有点类似电视直销节目中,模特托着手机、笔记本等那种感觉。看完本节目,发现公司这两年还真是招了不少帅哥美女啊。
    再下面是一个展现公司十年发展的小品剧。
    最后一个环节是颁奖。所有在公司工作超过十年的中国区员工都得到了一个“十年成就”奖杯。我自己也得到了一个“良师益友”奖。这个奖是员工投票选举的,说明我人缘还不错啦:)(要特别感谢投了我票的同事们,谢谢你们的鼓励!)

     第二部分就是晚宴啦,在金茂二楼宴会厅举办。这次晚宴,公司还特地邀请了一些已经离开公司的老员工回来参加。我和大多数老同事都还保持着联系,不过老友重聚还是感触颇多的。

    下面是我的相册。有些照片我和同事的合照,没得到人家授权,不敢公布:)

2008.03 公司10周年庆典

其他同事的相册:
    http://cid-8e722c4178b3fbd7.spaces.live.com/Photos/cns!8E722C4178B3FBD7!340
    http://cindydoris.spaces.live.com/photos/cns!31B3D9BFA6DFB5B5!1133/
    http://liudibo.spaces.live.com/photos/cns!ED3FFE7293541AAC!209
   

《生活随笔》目录