如何调试 LabVIEW 调用的DLL

 

问题(Frank):
    我用 Labwindow 编写了一个读文件的动态库, 即向动态库传递文件路径及文件名和某特定字符串,然后通个三个参数返回读到的值, 在labVIEW里调用该动态库,结果返回值老是显示打开文件失败, 不知错误出现在那里,另外在LabVIEW里如何调试确定传到动态库的参数是符合函数参数格式的呢?该函数在Labwindow里调试没有问题.请大侠指点迷津,不胜感激!

回答:
    我好久没有用过 CVI 了,计算机上也没有装,不过用 CVI 来调试,应该和用 VC 来调试原理是相同的,步骤也想类似。我就以 VC 为例说明一下。首先在 Debug 模式下 build 出一个 DLL 来。 (VC 7.1 即便是 release 模式下也可以设置断点,单步运行,但别的编译器不一定行。)然后用这个新的 Debug DLL 覆盖原有的DLL。

    关闭 LabVIEW,点击 VC 菜单 Debug->Start (F5)。因为工程生成的是不可以直接执行的 DLL 文件,这是 VC 会弹出一个对话框,问你用什么运行。选择浏览,然后找到 LabVIEW.exe。(这个可执行文件也可以在工程属性中 Debugging->Command 一栏设置。)之后,VC 就会把 LabVIEW 调用起来。

    在 VC 中设置好断点。在 LabVIEW 中运行想要调试的 VI。程序会停在你设置断点的地方。

技术文章和问题讨论

编辑

7 thoughts on “如何调试 LabVIEW 调用的DLL

  1. Pingback引用通告: 博客版《我和LabVIEW》目录 « 凡人琐忆

  2. 这个问题很具体,没没法调试也是找不到问题的。你最好找周围熟悉C语言的人帮忙看一下。

  3. 能帮我看看这段数据采集卡的驱动有没有什么问题啊为什么我编译不了啊#include <windows.h>#include <dos.h>#define DLLExport_declspec(dllexport)DLLExport float hydaq (int chreg){ float value;int i,a,c,base,dl,dh;base=0x280;a=inportb(base+4);outportb(base,0);outportb(base+1,chreg);for(i=0;i<70;i++)outportb(base+2,0);do{c=inportb(base);}while(!(c&0x40));dl=inportb(base+3);dh=inportb(base+4)&0xf;value=((dh*256+dl)-2048)*10/4096;return value;}

  4. 天鹰,你这恐怕是很细致的某一处错误导致的问题,恐怕不是我一下就能说到问题所在的。一般这样常见的问题就是参数配置有误,你还没有理解他的函数每个参数的意义,应当如何设置。建议和厂家或做过类似工作的人联系一下,问他们应当如何配置。

  5. 长侠:
       你好,我看了你的博客,关于labview调用dll的文章,我最近就在调试,我用的是中泰pci8333采集卡,外部使用数字信号发生器产生两路正旋波,用8333来采集,其中就是用到了cln调用8333的动态库pci8kp.dll,但调试的返回值均为0,表明驱动起来了,但就是采不回来数,我在想是不是我的调用语句使用得有问题?还请长侠多多指教!
          
                                                                                                      天鹰
     

  6. 我一般是用MessageBox将传进来的参数显示出来看对不对, 虽然很傻的方法,但很实用。

  7. 首先要确定调用规则是不是设对了,LabVIEW里面的配置一定要和被调函数一致.__cdecl还是__stdcall,这两者的压栈顺序一样,从右向左,但是负责清栈不一样。其次要确定LabVIEW里设定的参数个数,类型和被调函数一致。LabVIEW是动态调用DLL,不会在编译时替你检查参数的个数和类型。运行时只是完全按照你的配置压栈,退栈。文件打开失败一般有两个原因,文件名字不对,或者权限有问题。首先debug进你的Dll,确定文件名是不是被正确传递了。如果传递不正确,试着确认一下LabVIEW CLN中的配置,例如,C的string用CSTR。如果文件名字是对的,确定文件I/O操作的返回值。LabVIEW有个特点,LabVIEW的VI和LabVIEW本身是在同一个进程中运行的,也就是说就算VI停止运行,你的DLL还是在内存中,看看是不是你的文件正在被别人打开,而你又试图以独占方式打开文件。
    关于调试,Debug和Release的区别在于Debug模式下编译器会试图加入一些附加信息以给调试者更多的提示,设置_DEBUG宏,assert函数生效。Release模式下设置编译器产生调试信息后,在调试时和Debug没有本质区别。在MSVC中可以由DLL工程F5加载LabVIEW进程,或者在Debug菜单下以Attach Process加载。

发表评论

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

WordPress.com 徽标

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

Google photo

You are commenting using your Google 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 /  更改 )

Connecting to %s