调用动态链接库 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

8 thoughts on “调用动态链接库 2 – CLN 的配置选项

  1. 把wait until complication 设为 False后,函数就进入CMD不返回了,起不了LV与控制台程序输入输出进行交互的作用。难道在WINDOWS下就实现不了类似管道的功能吗?

  2. 调用一下就关闭是正常的,你调用的程序运行结束,自然就关闭了。如果希望把控制带打开,可以输入命令“cmd”,并且把wait until complication 设为 False。

  3. 我试过System Exec.vi,但调用一下进程就关闭了。现在想与控制台程序的输入输出进行交互,应该怎么做?

  4. 调用console标准输入输出控制台是非常简单和直观的。使用LabVIEW中的 “Connectivity->Libraries and Executables->System Exec.vi”就可以了。在控制台上输入什么命令,就直接传给这个函数。它返回的文本,就是在控制台上显示的内容。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s