关于LabVIEW产生的DLL被C调用的问题

合集下载

LabwindowsCVI调用外部DLL文件的问题

LabwindowsCVI调用外部DLL文件的问题
panelHandle = 0;
}
}
这样的目的是:在外部调用的时候,便于调用。
C源文件编写完整后,把相关的*.uir文件添加到工程中,然后编写一个*.h文件,命名为exampledll.h,里面包含一个源文件中的函数申明。定义如下:
externint InitUIForDLL (void);//调用面板的函数
InitUIForDLL ();
return 0;
}
(2)通过一个按键来调用dll,即在一个工程中通过一个按钮来调取dll中的函数,来完成此按扭的功能。
与用c源代码来调用的方式一样,只是此工程已经有*.uir对象面板,在*.uir的面板上添加一个按钮,为按钮生成一个函数,在函数中调用外部dll中的函数。在编译前,要将*.lib和*.dll文件和头文件包含在工程中,并且将dll中的函数用一个*.h头文件包含:
int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
这两个函数是DLL动态链接库必须包含的两个函数,函数的具体内容为:
#include <cvirte.h>
int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
#include "CFI.h"
static int panelHandle;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1;/* out of memory */

LabVIEW编程调用DLL时遇见的问题

LabVIEW编程调用DLL时遇见的问题

LabVIEW编程调用DLL时遇见的问题对于使用LabVIEW编程的人来说,都知道LabVIEW功能强大,但也会发现似乎缺少某些功能,而像其他编程语言的DLL、ActiveX组件则能提供。

在使用DLL(动态链接库)时,最大的困难就是把函数参数的数据类型映射为相应的LabVIEW中的数据类型。

LabVIEW 提示:未定义符号可能会造成函数和参数无法被识别。

如要解决该问题,检查头文件并确定是否必须添加预定义符号。

单击上一步按钮返回至向导的前一页并添加预定义符号(例如,"NIAPI_stdcall = __stdcall"或"NIAPIDefined = 1")在一次进行串口调试软件的编写过程中,要求使用动态链接库(其实使用VISA同样可以实现),使用导入共享库工具以自动生成配置CLN(Call Library Function)节点,工具在“工具—导入—共享库(.dll)”菜单项下,专门用于将DLL 中函数包装成VI。

下一步下一步点击解析头文件后,依然遇见(如下图)extern UINT Recv(UCHAR *pRecvBytes,UINT unRecvLength);(函数原型)未定义符号可能会造成函数和参数无法被识别。

如要解决该问题,检查头文件并确定是否必须添加预定义符号。

单击上一步按钮返回至向导的前一页并添加预定义符号(例如,"NIAPI_stdcall = __stdcall"或"NIAPIDefined = 1")归咎原因就是头文件中的一些类型定义不符合标准C语法,而使解析器无法获得正确的的mPWIN32_COMMAND定义。

DLL函数的头文件中可能使用了某个系统定义的数据类型,数据类型的定义在windows.h中,(windows.h是Windows SDK的一个文件,VC等开发环境中常常带有Windows SDK),要正确解析必须得到这些数据类型,也就是找到windows.h 这个头文件,用户须把windows.h文件的全路径加在“包括路径”中。

LabVIEW 调用 C-C++ Dll 详解

LabVIEW 调用 C-C++ Dll 详解

LabVIEW 调用C/C++ Dll 详解LabVIEW 在配上NI 的采集卡或者别的第三方的硬件,约等于神器(虽然有时候贵了点)。

这样你可以比较集中精力的专注于数据处理了,就不用学习麻烦的Win32 的GUI 编程, 也不用关注和你自己搞的采集板之间的通信了。

对于每一个测控行业的程序来说,基本上都是:初始化-->数据采集-->数据处理-->数据显示-->数据保存-->结束的一个过程。

当然如果是实时的,那么采集,处理,显示就是在一个loop 里面。

当然为了保证实时性,数据处理和数据采集不一定在一个线程里,因为处理的时候把采集给block 住也挺傻的。

LabVIEW 很容易帮你搞定:初始化-->数据采集-->数据处理-->数据显示-->数据保存-->结束但是数据处理部分,是和你的学科紧密相关的,有时候算法会诡异到你很难用VI来实现,那么你就要有C++”target=“_blank”>C++code来搞了。

那么C/C++ 是如何与LabVIEW 交互的呢,本文来较详细的阐述一下,因为准备采用总分总的写作手法...所以先来个概括...1. 把C/C++ code 编译成Dll。

2. 用LabVIEW 的call library node 来调用。

难点在于:如何把LabVIEW 的数据类型和C/C++ 的来对应。

控件x 相当与一个double,当然其类型也是可以选择的(如右图所示)。

boolean 按理说应该是一个bool, 但是传入call library node 的时候,一般要转成unsigned int 型。

cluster 其实就是个struct ,左图的cluster 是:struct tCluster{ double x11; // 类型都可以向右图那样自己配置double x2; int x3;};对于string,这里要着重讲一下,labview 的string 类型里面是包含长度信息的,它不是一个简单的char *它是个LStrHandle 类型:定义咋extcode.h 里面(可以在labview 目录下搜到)typedef struct {int32 cnt;uChar str[1];} LStr, *LStrPtr, **LStrHandle;cnt 就是含有多少个字符,str 这个指针所指的就是数据区的第一个字符。

LabVIEW 8.6报表工具包生成和调用DLL问题分析及对策

LabVIEW 8.6报表工具包生成和调用DLL问题分析及对策

LabVIEW 8.6报表工具包生成和调用DLL问题分析及对策摘要:针对LabVIEW8.6调用报表工具包生成的DLL过程中出现“NI_Word.lvclass”路径无法找到的问题,做了详细描述和分析,并提供了相应的解决方案。

关键词:LabVIEW 8.6 Word 动态链接库报表工具包面向对象LabVIEW是美国国家仪器(NI)公司推出的专门用于虚拟仪器开发的图形化软件编程平台,吸引了大批开发者追随,NI也根据市场需求每年推出一个新版本。

但新技术的引用不可避免的也带来了新的问题和BUG,尤其是升级后,很多硬件驱动不得不更新。

LabVIEW 8.6版本是NI推出的所有版本中,大部分用户公认比较成熟稳定的版本。

NI 报表工具包从1.1.3开始采用面向对象技术,重新设计,1.1.3和1.1.4版本是专为LabVIEW 8.6而定制使用的,而以前的版本如1.1.1、1.1.2(面向过程技术)在LabVIEW 8.6下与自带的Report函数不兼容。

1 问题描述应用开发环境以及报表工具包版本:LabVIEW 8.6 + Report Generation Toolkit 1.1.3。

在LabVIEW 8.6新建工程项目文件,并按照图1和图2建立相应的VI和文件。

当运行main.vi或Main.exe时,出现下面(图3)报错框。

而单独运行1.vi或1.exe时,却能正常运行。

2 问题分析根据问题报错框描述,问题可能出现在“Get LV Class Default Value.vi”的上一层文件“Word class path.vi”传递出的NI_Word.lvclass 路径,图4为报表工具包自带的“Word class path.vi”程序框。

利用LabVIEW自带诊断和调试工具,可获得“Word class path”显示的文件路径,如表1所示。

(1)当运行main.vi时,由于是“Develo- pment system”环境下,根据路径的分离规则,“NI_Word.lvclass”文件路径应在当前DLL文件的下层目录,并且布尔量选择为False,即“..\1.dll\word\ NI_Word.lvclass”。

LABVIEW的DLL与API调用

LABVIEW的DLL与API调用

LABVIEW的DLL与API调用LABVIEW的DLL与API调用一.实验目的1.熟悉LabVIEW调用动态链接库的过程2.学会编写用LabVIEW调用WINDOWS的API函数二.实验器材1.计算机(带有声卡)2.LABVIEW8.20软件三.实验原理在开发自动测量系统时,经常遇到计算机与仪器的通信问题,涉及仪器控制及数据处理问题,LabVIEW语言在这一领域的应用有着独到的优势。

为了在LabVIEW中能够充分利用其他编程语言的优势,LabVIEW提供了外部程序接口能力,包括动态链接库(DLL)、C语言接口(CIN)、ActiveX和Matlab等。

动态链接库是基于Windows程序设计的一个非常重要的组成部分。

LabVIEW 开发中使用DLL,可以使代码更简洁,内存资源的使用更经济,而且可以便捷地利用仪器厂商或第三方提供的仪器控制子程序加速开发进程。

而windows平台包含有大量的API函数,这些API函数提供了大量在Windows环境下可操作的功能,它们位于Windows系统目录下的多个DLL文件中,因此在LabView中调用API 函数和DLL的方法是一致的。

在LabVIEW中,利用库函数节点可以较容易地实现对DLL的调用,从而提高了程序的开发效率。

使用调用库函数节点,可以调用Windows标准的动态连接库,也可以调用用户自己编制的DLL。

LabView中动态链接库的调用可在程序框图的函数选板中选取“调用库函数节点”来完成,该节点位于:互连接口->库和可执行程序->调用库函数节点。

将选择好的调用库函数节点图标放在程序框图中,然后通过对它的节点图标进行配置,可以指定DLL模块中与LabVIEW数据交换的相应的驱动函数。

在调用DLL时,首先要找到找到头文件(*.h)或者函数原型声明,确定你需要调用的函数,注意函数的参数是否包含了原始数据类型参数比如int,char, double,等等或者是否包含了复杂数据类型比如clusters。

LabVIEW编程中常见问题与解决方法

LabVIEW编程中常见问题与解决方法

LabVIEW编程中常见问题与解决方法LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一款广泛应用于科学与工程领域的视觉化编程环境。

它的独特之处在于,使用者可以通过拖拽和连接图形化编程元素来构建程序,而无需编写传统的文本代码。

然而,由于其特殊的编程方式和复杂的功能,LabVIEW编程过程中常常会遇到各种问题。

本文将介绍LabVIEW编程中常见问题,并提供相应的解决方法。

一、VI无法运行1. 问题描述:当尝试运行一个VI(Virtual Instrument)时,LabVIEW出现错误或者无响应。

解决方法:- 检查是否安装了适当的软件环境(如运行时引擎或特定模块)。

- 检查VI中使用的所有子VI或函数是否被正确地调用或配置。

- 检查是否有硬件设备连接问题或者相关设备驱动是否正确安装。

二、数据处理错误1. 问题描述:LabVIEW在执行数据处理操作时,产生了错误的结果或者没有得到期望的结果。

解决方法:- 检查数据的输入是否正确,并确保正确配置了对应的数据类型。

- 检查数据处理模块的参数设置,例如滤波器的截止频率或者函数的操作参数。

- 使用适当的数据结构和算法,以确保正确的数据处理过程。

- 进行调试,并通过添加数据显示或打印变量值等方式进行验证。

三、界面设计问题1. 问题描述:LabVIEW的用户界面显示效果不如期望的那样美观或者布局混乱。

解决方法:- 使用合适的面板布局工具和控件,确保界面的整洁美观。

- 使用适当的颜色和字体,以提高界面的可读性和用户体验。

- 充分利用丰富的LabVIEW组件库,添加图标、按钮和指示器等交互元素。

- 进行界面的测试和优化,以提高界面的响应速度和用户友好性。

四、性能问题1. 问题描述:LabVIEW程序在运行过程中出现了延迟、卡顿或者响应速度较慢的情况。

解决方法:- 尽量使用并行编程技术,以提高程序的性能和效率。

Labview调用C语言、Matlab脚本节点以及库函数节点的方法

Labview调用C语言、Matlab脚本节点以及库函数节点的方法

Labview调用C语言、Matlab脚本节点以及库函数节点的方法Labview调用C语言的方法CIN(Code InterfaceNode)节点是LabVIEW中用来调用C/C++代码的功能节点。

它与动态链接库的不同之处在于,它能够将代码集成在VI中作为单独的一个VI发布,而不需要多余的文件。

另外,它提供了函数入口,它可以根据用户提供的输入输出自动生成函数入口代码,从而使用户专心关注代码功能而不用为函数声明、定义等语句费心。

因此CIN节点与DLL在不同的场合有不同的优势,但是CIN节点的使用比调用DLL要复杂得多。

由于LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,并且二者完全相同,所以用户可以向CIN传递任意复合的数据结构。

另外,CIN比图形化语言可获得更高的执行效率。

注意:对于完全相同的代码,CIN和DLL的执行效率是完全一样的。

如果要使用CIN节点,你必须安装了C编译器。

在Windows下,CIN支持以下编译器:Microsoft Visual C++Symantec CCIN节点必须调用.lsb文件。

.lsb文件是通过外部编译器与CINTools工具结合将C代码编译生成的。

下面我们通过一个Step byStep的实例来看如何在LabVIEW中实现CIN节点调用,本例所用外部编译器为MicrosoftVisual C++6.0。

第一步:在程序框图放置一个空CIN节点;CIN节点位于FunctionsPalette的Connectivity->Libraries& Executables->Code InterfaceNode。

第二步:创建CIN节点的输入输出端口;初始情况下,CIN只有一对端口:一个输入端口和一个输出端口。

向下拉大节点边框或右击节点端口选择AddParameter,可以为节点增加输入输出端口。

CIN 节点的端口都是成对出现的,因为CIN节点端口传递的是指针,所以该参数既可以作为输入又可以作为输出。

在LabVIEW中调用VC++生成的动态链接库文件DLL

在LabVIEW中调用VC++生成的动态链接库文件DLL

LabVIEW中调用VC++生成的DLL1.// 新建一个空的Win32 Dll 工程,加入新的cpp,写入下面代码_declspec(dllexport) int sum(int a, int b){return a+b;}//Build出一个dll:sum.dll2.// 新建一个新的Win32 Console程序//选择Simple Console Application,修改main函数所在的cpp#include "stdafx.h"#include <iostream>using namespace std;// for base type and LoadLibrary#include <WINDOWS.H>// define function pointer which will point to sum(a, b)typedef int(*Func)(int,int);int main(int argc, char* argv[]){HMODULE dll = ::LoadLibrary("sum.dll");// 加载刚才那个dll,路经要对if(dll){Func f = (Func)GetProcAddress(dll, ?sum@@YAHHH@Z);// 加载那个sum函数if(f)cout<<f(3, 4); // 等价于调用sum(3, 4)elsecout<<"function call error";}elsecout<<"lodad error";}//Build & Execute3.上面一个不便的地方就是GetProcAddress,第二个参数是个很复杂的字符串,需要事先用dumpbin sum.dll /exports得到sum函数的实际名称所以,一般会在最上面写dll时,导出函数前面不仅加上已有的红字表示导出,还要加上extern "C" ,表示以C方式编译,因为C方式编译时,函数名在库中和在程序代码中会保持一致,不像C++生成新的编码后的函数名。

VC调用labview生成的DLL

VC调用labview生成的DLL

VC调用LabVIEW生成的DLL文件刚才介绍了LabVIEW调用DLL文件的方法,使用VC调用LabVIEW生成的DLL 文件也很简单。

还是以之前生成Scale 的DLL文件为例,不同的是采集电压程序使用的是C语言的例程,但和LavVIEW实现的功能相同。

首先将先前生成Scale DLL文件时,路径下所有的文件全部复制粘帖到C语言例程的文件夹下。

打开连续采集程序,点击状态栏的Project——Settings,在Project Settings对话框中加载入Scale.lib的静态链接库。

在程序中键入#include "Scale.h",以便引入该DLL函数。

下面是C程序的代码,功能是有限点采集电压,通过Scale.dll文件实现采样值放大10倍的功能。

加粗部分是因为调用DLL文件所做的改动。

#include <stdio.h>#include "NIDAQmx.h"#include "Scale.h"#define DAQmxErrChk(functionCall)if( DAQmxFailed(error=(functionCall)) ) goto Error; elseint main(void){int32 error=0;TaskHandle taskHandle=0;int32 read;float64 data[1000];char errBuff[2048]={'\0'};int i=0;double x10=0;/*********************************************/// DAQmx Configure Code/*********************************************/DAQmxErrChk (DAQmxCreateTask("",&taskHandle));DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0"/*Config correct device*/,"",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));/ /DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_V al_FiniteSamps,1000));/*********************************************/// DAQmx Start Code/*********************************************/DAQmxErrChk (DAQmxStartTask(taskHandle));/*********************************************/// DAQmx Read Code/*********************************************/DAQmxErrChk(DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,dat a,1000,&read,NULL));printf("Acquired %d points\n",read);for(i=0;i<1000;i++){Scale(data[i], &x10);printf("the %d Value is : %f \n",i,x10);}Error:if( DAQmxFailed(error) )DAQmxGetExtendedErrorInfo(errBuff,2048);if( taskHandle!=0 ) {/*********************************************/// DAQmx Stop Code/*********************************************/DAQmxStopTask(taskHandle);DAQmxClearTask(taskHandle);}if( DAQmxFailed(error) )printf("DAQmx Error: %s\n",errBuff);printf("End of program, press Enter key to quit\n");getchar();return 0;}所以,使用LabVIEW不仅可以方便地调用各种编译软件生成的DLL文件,自己也能生成DLL文件供其他编译软件调用。

Labview调用VC

Labview调用VC

Labview调用VC对初学者来说来个比较详细的包含步骤例子是难得的,我来个简单的小例子,希望对您有用,呵呵!!!1。

建立动态连接库的C 代码调用1.1 建立函数原形1)后面框图程序中,调用CLF 节点;2)配置一个函数原形,设置调用规程为C,其它不变,确定,退出;3)右键CLF 节点,create C file,保存名字为code.cpp,以供VC++编译使用;1.2 编辑源代码文件1)将所需要的labview 头文件复制到code.cpp 所在目录中,包括:extcode.h platdefines.h fundtype.h;2) 打开code.cpp,添加关键词extern c 、_declspec(dllexport)并包装;然后输入函数的功能代码,如果1 个dll 里面需要多个函数,则需要声明多个函数的原形。

2。

VC++中编译产生dll1)建立project ,file&agrave;new-> win32 Dyna,mic Link Library,输入工程名,选择an empty dll project;2)添加code.cpp 到source file,添加extcode.h platdefines.h fundtype.h 到head files 里面;3)设置dll 参数project&agrave;settings&agrave;c/C++中设置参数:category: code generation ;根据函数要求可以选择1Byte4 Byte 8Byte,采用默认就可以;multithread;其余默认可以;自己也可以微调;4)Build&agrave;Build code.dll;5)Ok。

LABVIEW调用VC制作的DLL文件

LABVIEW调用VC制作的DLL文件

LABVIEW调用VC制作的DLL文件
实现求和运算
1、首先用LABVIEW建立一个空VI,
2、选择CALL LIBRARY FUNCTION NODE ,右击点击CONFIGURA TION配置,函数名取SUM,添加两个变量8 字节双精度变量A,B,返回双精度。

建立好之后,函数原型为double sum(double a, double b);
3、建立的程序为
4、
创建一个C文件,保存皆可,将程序打开改为:
#include "extcode.h"
_declspec(dllexport) double sum(double a, double b);
_declspec(dllexport) double sum(double a, double b) {
/* Insert code here */
double sum;
sum=a+b;
return sum;
}皆可。

5、打开VC,建立DLL文件:步骤如下:
将刚才的C文件添加到工程中,同时必须加头文件
C:\Program Files\National Instruments\LabVIEW 2010\cintools中所有的.h文件。

还必须将所有的.h文件考在同一个目录下才可以。

6、双击
选择路径皆可,这时候设计完成,可以运行看一下效果。

如何使用LabVIEW调用C#编写的DLL

如何使用LabVIEW调用C#编写的DLL

如何使用LabVIEW调用c#编写的DLL最近在做一个项目时,需要在Labview中列出可用的磁盘驱动器,我们可以使用互连接口》库与可执行程序》执行系统命令vi,但是在程序运行时会弹出命令提示符窗口,对于计算机菜鸟用户而言,他们或许会以为那是在执行病毒程序,为了增加用户的好感度,本文采用调用DLL的方式来解决问题。

在调用DLL之前,我们先来创建一个DLL,打开VS2008,新建一个类库项目,如下图:点击确定后进入代码编写窗口。

编写好的代码如下图所示:选择VS2008的生成》配置管理器,打开配置管理器,如下图所示:在活动解决方案配置下拉框中选择Release,然后点击关闭。

选择生成》生成DrivesInfoDll,然后生成一个DLL文件。

在项目的的bin\Release目录下面可以找到生成的DLL文件,如下图所示:我们把它复制我要使用它的地方,如下图:现在,打开LabVIEW2012,新建一个VI,切换到程序框图,选择下图的构造器节点到程序框图:此时将自动打开选择.NET构造器:点击浏览按钮,选择要调用的DLL:点击确定后在对象中选择Class1:,如下图所示:点击确定按钮关闭对话框。

选择下图的调用节点到程序框图:将构造器节点的“新引用”输出端与调用节点的“引用”输入端连接起来,然后在调用节点的“方法”上点击,选择我们要使用的方法,这里选择GetDrivesInfo()。

选择下图的关闭引用到程序框图并连接调用节点的“引用输出”输出端到关闭引用的“引用”输入端。

然后创建一个字符串数组,显示GetDrivesInfo方法的执行结果。

完整的程序框图如下:运行后的前面板结果如下:这说明程序是执行成功了的。

Labwindows调用外部DLL文件的问题

Labwindows调用外部DLL文件的问题

1. dll文件的编写(1)打开软件Labwindows/CVI,点击File->New->project新建一个工程*.prj,如图所示。

然后保存为example.prj。

(2)用同样的方式,新建一个*.c文件,然后按照下图所示,在Edit->Insert Construct->Dllmain,然后软件会自动在c文件中添加以下两个函数:int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)这两个函数是DLL动态链接库必须包含的两个函数,函数的具体内容为:#includeint __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){switch (fdwReason){case DLL_PROCESS_ATTACH:if (InitCVIRTE (hinstDLL, 0, 0) == 0)return 0;/* out of memory */break;case DLL_PROCESS_DETACH:CloseCVIRTE ();break;}return 1;}int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){/* Included for compatibility with Borland */return DllMain (hinstDLL, fdwReason, lpvReserved);}然后在上面C源文件中编写相关的函数,然后保存文件为example.c。

Labview调用dll详解(C语言DLL

Labview调用dll详解(C语言DLL

Labview调用dll详解(C语言DLLLabview调用dll详解(C语言DLL)之一labview中提供了两个C接口,一个是CLF,一个是CIN。

本帖子讨论DLL的调用,也就是CLF。

由于C的强大功能,本帖子讨论C创建的DLL的调用。

首先简单解释一下DLL,也就是动态链接库。

DLL 的好处是屏蔽底层的细节,用户不用也不能打开DLL,便于资源代码数据共享,节省内存等。

一般情况下labview是不需要调用DLL的。

DLL分两类,一类是API,一类是自己创建的DLL。

这两者本质都一样,但是调用一般来说是有区别的。

R) {$ f0 x7 @3 B 要调用DLL必须要有DLL,也就是所谓的路径。

这个一般不会出错的,不用解释了。

其次是选择函数,这个也不难。

线程一般选择UI线程,任意线程的DLL和UI线程DLL有颜色上的区别,其次在源代码中也有区别(这个不是DLL调用失败的主因,不用过多纠缠)。

接下来是调用设置:Ccall和standcall。

一般来说,windows API采用的是standcall,自己创建的采用Ccall。

两种调用区别在于参数进入栈的顺序不同。

这里随便说一下,栈由系统自动分配内存,类似C语言的int a都是分配的栈内存;new分配的是堆内存。

栈内存由系统负责回收,堆内存一般程序员负责释放,所以要注意系统的内存泄漏。

labview的初始化数组也会分配内存,所以不宜频繁调用。

8 h. p8 V/ m, J- D4 X 接下来是最重要的参数配置,也是最复杂的参数配置。

首先要知道函数原型,C语言里面叫导出函数类。

一般在include文件下面的头文件里面。

下面是一个典型的函数原型:extern "C" ZLDS10X_DLL_API SENSOR_HANDLE ZLDS10X_DLL_stdcall ZLDS10X_Open(char * portnum , int baud , int timeout , int address); 值得注意的是,很多人会把函数原型看错。

Labview调用DLL时接口类型匹配简介

Labview调用DLL时接口类型匹配简介

调用DLL时接口类型匹配简介1、数值类型Data type:选择数值的类型。

Pass:选择采用传值方式还是传引用方式。

2、布尔类型a. 方法一:使用数值类型作为输入输出。

在连接输入的时候将布尔值转换为数值。

在输出的时候使用判断是否等于0来获取布尔值。

b. 方法二:类型中选择“Adapt to Type”(匹配至类型),数据格式选择“Handles by Value”。

在程序中,直接接入布尔数据,接线端会自动变为布尔类型。

3、字符串类型由于需要为字符串分配内存空间,对于字符串输出,需要为其在输入的一端接入初始字符串。

当初始字符串长度不够时,程序会因为内存内存越界而出错。

4、一维数值数组a. 当生成dll的时候采用“Array Data Pointer”时,参数中会自动增加一个“len”的数值参数:在“Length Input”中会默认设置为此参数值,用以表示数组的长度。

在调用此dll时,对于数组类型,在“Array format”中设置为Array Data Pointer。

同时需要将数组的长度值接至len端上:b. 当生成dll的时候采用“Array Handle Pointer”时,这时输入输出对应的是指向句柄的指针,可执行系统级的操作。

程序可以自动获取数组的长度,所以将不会有“len”参数出现。

在调用此dll时,在“Array format”中选择Array Handle Pointer即可。

在程序中不再需要为数组指定长度。

5、二维数值数组当参数为二维数值数组的时候,在LabVIEW下生成dll时类型只能选择为指向句柄的指针。

调用的方法与4.b类似,只需将“Dimensions”设置为2即可:6、不包含数组的簇数据类型设置为“Adapt to Type”,数据格式设置为“Handles by Value”。

将簇直接接入即可。

7、包含数组的簇、调用方法与调用一维数组类似。

a. 当参数类型为句柄时(一般情况下这种dll是不能使用LabVIEW生成的),在调用dll 的时候,类型设置与不含数组的簇一样:由于需要为这种簇分配内存空间,所以需要将簇的输出接入对应的数据:b. 当参数类型为指向句柄的指针时,将数据格式设置为“Pointers to Handles”。

如何从LabVIEW中调用动态链接库DLL

如何从LabVIEW中调用动态链接库DLL

问题:如何从LabVIEW中调用动态链接库DLL解答:要从LabVIEW中调用动态链接库(DLL),你需要首先确定是哪种类型的DLL。

基本上有两种类型的DLL需要考虑:C/C++ DLL 和Microsoft .NET assembly. C/C++ DLL 用C, C++, 或其他编程语言生成(除了.NET 语言) 比如Java, Fortran, 或Visual Basic 6.0. .NET DLL 也被称为".NET assembly" 或者就是"assembly". 这个术语的区别在于.NET DLL 与其他DLL的工作方式不同. .NET DLL使用Common Language Runtime (CLR) 和.NET Framework "处理" DLL中的函数.如果DLL是C/C++ DLL:1找到头文件(*.h) 或者函数原型声明.2确定你需要调用的function(s) . 注意函数的参数是否包含了原始数据类型参数比如int, char, double, 等等或者是否包含了复杂数据类型比如clusters.3如果函数没有包含复杂数据类型并且你有头文件(*.h), LabVIEW中一个很好的工具可以帮你简单地导入DLL (并且会帮助你创建DLL的整个库). 你可以在Tools?Import?Shared Library (.dll)...中找到该工具; 按照向导进行下去.4如何函数不含有复杂数据类型但是没有头文件(*.h), 首先确定你使用的是C/C++ DLL因为大部分的编程环境将对这种DLL 生成头文件. 如果你确实在处理C/C++ DLL, 找到该函数的相关文档,因为你需要确定那些在DLL中被调用的函数的参数. 一旦参数被确定,使用Call Library Function Node LabVIEW中的函数手动调用该函数。

【LabVIEW】构造器节点调用C#动态链接库dll

【LabVIEW】构造器节点调用C#动态链接库dll

【LabVIEW】构造器节点调⽤C#动态链接库dll
⼀、调⽤C#动态链接库dll
(1)新建VI,后⾯板选择“互连接⼝->.NET->构造器节点”。

(2)双击“构造器节点”图标,找到我们刚刚编译好的dll⽂件,选中相应类名,确定。

(3)选择“互连接⼝->.NET->调⽤节点”。

(4)将⼆者相连,点击调⽤节点选择相应⽅法。

⼆、实现遍历DataTable
互连接⼝-->.net-->构造器节点
在C#中写⼀个函数来实现这个功能,然后再将⼯程⽣成⼀个动态链接库,然后在LabVIEW中就可以调⽤⽣成的dll中所写的这个函数来实现对datatable的读取。

三、常见问题
1、调⽤.net构造器占⽤内存
运⾏不久后提⽰构造器节点内存已满。

问题是在构造了多个引⽤后没有合理的关闭引⽤导致了使⽤引⽤的增加也就导致了内存的增加。

解决⽅法:在使⽤调⽤节点和属性节点时要做到每⼀个节点后都有⼀个对应的关闭引⽤,这样就可以避免由于没有关闭引⽤⽽使内存增加的问题。

注意:如果有for循环,要在循环外关闭引⽤,否则也会产⽣错误的。

2、.NET构造器节点该类不包括任何公共构造器
1、确认已经在类和⽅法上加了Public关键字;
2、把构造函数删掉。

3、报错“Object reference not set to an instance of an object”
某函数调⽤产⽣这个问题。

该部函数传⼊参数有ref,数据类型是数组,删掉这个传⼊参数就不报错了,但其他函数同样传⼊参数⼜不报错...个例先记录下来,原因待查。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于LabVIEW产生的DLL被C调用的问题1 LabVIEW的工作1.1 工程项目从LV8.0开始,想要生成exe、安装程序或DLL就必须首先创建1个工程,然后把所有有关的VI全部添加到工程中,如图1:图1 LV项目为了使目录结构清晰,最好把最后需要输出的VI放置在一起,把子VI放置在一起,如图1中,虚拟目录Top Level Vis用来存放3个输出的VI(可以把它想像成DLL中的函数)、虚拟目录Dynamic Vis存放子VI、虚拟目录Support Files存放支持文件(位图、光标等)。

1.2 VI设置如同在LV中一样,有些VI完全是作为计算模块使用的(调用时不会弹出界面,如图1中的acquire.vi、analyze.vi),而有些是用来显示界面的(调用时弹出对话框,如图1中的present.vi)。

那么如何设置1个输出VI是否显示界面呢?想要产生界面调用的函数,请配置Window Appearance(如图2),然后确保红线圈住的地方必须被选中:图2 VI界面设置1.3 输出配置(Build Specification)右击Build Specification选择New->DLL,弹出DLL输出配置对话框,其有以下对话框需要配置:1.3.1 基本信息(Information)图3∙Build specification name—指定唯一的生成模板名称(出现在项目管理页面中),用以和其他模板相区别∙Target filename—指定输出的DLL名称∙Destination directory—指定生成文件的输出路径∙Build specification description—描述该生成模板的相关信息。

1.3.2 输出源指定(Source Files)图4∙Project Files窗口—显示项目窗口My Computer下列举的项目(如图1),使用图4中的左/右箭头可将My Computer下列举的项目移入/移出Exported VIs和Always Included窗口。

∙Exported Vis窗口—指定DLL的输出函数(VI),至少要指定1个输出VI。

选定移入的VI,Define VI Prototype按钮可使用,并且在点击后弹出如图5所示对话框:图5 接口原型定义对话框该对话框可用于调整对应VI的C++接口。

∙Define Prototype按钮—在选择了输出VI后被激活,该按钮用于启动接口原型定义对话框,用于修改输出VI的接口定义。

∙Always Included—指定DLL中所必需的动态VI和支持文件。

o动态VI:通过VI Server调用的VIo支持文件:非VI文件,比如驱动、文本文件、帮助文件、.NET组件等DLL 使用的文件注意下列对象不可移入Exported VIs窗口、Always Included窗口:Exported VIs∙多态VI(Polymorphic Vis)∙控件(Controls)∙私有数据控件(Private data controls)∙非VI文件(Files that are not VIs, such as text, image, or .mnu files)∙库文件(LabVIEW类、XControls)∙全局变量(Global variables)Always Included∙私有数据控件(Private data controls)若将库文件(LabVIEW类)移入Always Included窗口,LabVIEW将标记库内所有项目。

可将库内的任意一项指定为输出VI。

但是若将XControls移入Always Included窗口,LabVIEW将在生成过程中包含所有与XControls相关联的项目,这些项目都不能成为输出VI。

1.3.3 目标(Destination)图6∙Destinations窗口—指定生成文件存放目录,列表中的第一项就是Information窗口(图3)里的Target filename项目。

∙Add Destination(+按钮)—在Destinations窗口中添加1个自定义目录∙Remove Destination(X按钮)—在Destinations窗口中删除1个选定的项目∙Destination label—指定Destinations窗口所选项目的名称。

在Source File Settings窗口中,这些项目作为Destination下拉菜单的项目。

∙Destination path—Destinations窗口所选项目的指定目录或LLB。

若更改了基本信息里Target Filename对应的路径(图1),则所有子目录都将相应发生改变。

注意:为了避免出错,需保证路径最长不超过255字符∙Destination type—指定目标类型,对于目标项和支持目录,其设置不可修改o Directory—指定目标为路径Preserve disk hierarchy—保存定位到该目标路径的所有文件之前的目录结构o LLB—指定目标为LLB.∙Add files to new project library—是否指定想要添加文件形成新的库文件o Library name—包含指定文件的新库文件1.3.4 源文件设置(Source File Settings)图7∙Project Files—显示项目窗口My Computer下列举的项目(如图1)∙Inclusion Type—显示LabVIEW在生成过程中如何包含所选项目。

这个选项与Source Files窗口中项目所指定的类型有关,比如在Always Included窗口内的项目,其选项= Always Included。

如果选择了1个目录,则目录内所有项目的Inclusion Type属性为:o Service VI—包含项目作为service VIo Always Included—生成时包含项目o Include if referenced—当其他项目引用它是,被包含∙Destination—设置选择项目的目标。

LabVIEW在用户未指定启动VI时开启此功能。

Destination下拉菜单中的项目= Destinations窗口中的Destination label。

默认目标= Same as caller,LabVIEW作为调用者将这些项目放置于相同的目标中∙Sets the destination for the selected item. LabVIEW enables this option if you have not designated the item as a startup VI. The names in the Destination pull-down menu correspond to the options in the Destination label text box on the Destinations page. The default destination is Same as caller and LabVIEW places the item in the same destination as the caller.o Make top level in LLB—Appears when you select a destination that is an LLB.Place a checkmark in the Make top level in LLB checkbox if you wantthe selected VI to be the top level item in the LLB.∙Customize VI Properties—Displays the VI Properties dialog box. Use the dialog box to specify the properties for the selected VI. By default, LabVIEW uses the property settings configured in the VI. Any settings you configure in the VI Properties dialog box override any settings you configured in the Customize Window Appearance dialog box. LabVIEW dims this option for items other than VIs.∙Use default save settings—Saves the VIs using default save settings. The default save setting for the VIs you add to the Exported VIs and Always Included listboxes on the Source Files page is to remove the block diagram.The default for all other VIs is to remove the block diagram and the front panel. Remove the checkmark from this checkbox to change the default settings for each item you select in the Project Files tree.o Remove front panel—Removes the front panel from a VI in the build.Removing the front panel reduces the size of the application or sharedlibrary. If you select yes, LabVIEW removes the front panel, butProperty Nodes or Invoke Nodes that refer to the front panel mightreturn errors that affect the behavior of the source distribution.LabVIEW enables this option if you remove the checkmark from the Usedefault save settings checkbox.o Remove block diagram—Removes the block diagram from a VI in the build.LabVIEW enables this option if you remove the checkmark from theRemove front panel checkbox. If you remove the front panel, you alsoremove the block diagram. As a result, if you place a checkmark inthe Remove front panel checkbox, a checkmark automatically appearsin the Remove block diagram checkbox.∙No password change—Specifies for LabVIEW to not prompt for a password if you use the VI in a build. LabVIEW also does not modify or apply a password you previously applied to the VI.∙Remove password—Removes the password you previously applied to a VI or library. Prior to removing the password, LabVIEW prompts you to enter the current password during the build.∙Apply new password—Applies the password you supply in the text box to a VI or library. Prior to applying the new password, LabVIEW prompts you to enter the current password during the build. Enter the password in the text box below the Apply new password option.∙Rename this file in the build—Appears when you select a file in the Project Files list. Renames the selected file. Enter the new name of the file in the text box.∙Set destination for all contained items—Appears when you select a folder in the Project Files tree. Place a checkmark in the checkbox if you want to set the destination directory for the items in the selected folder.Note LabVIEW places an item set to Same as caller in the directoryof the caller. If you set an item to Same as caller and two differentcallers are in different directories, LabVIEW places the item in thesame directory as the build.∙Set VI properties for all contained items—Appears when you select a folder in the Project Files tree. Place a checkmark in the checkbox if you want to set the VI properties for the items in the selected folder. When you placea checkmark in the checkbox,LabVIEW enables the Customize VI Propertiesbutton.∙Set save settings for all contained items—Appears when you select a folder in the Project Files tree. Place a checkmark in the checkbox if you want to set the save settings for the items in the selected folder.∙Set password for all contained items—Appears when you select a folder in the Project Files tree. Place a checkmark in the checkbox if you want to configure the password for the items in the selected folder.∙Apply prefix to all contained items—Appears when you select a folder in the Project Files tree. Place a checkmark in the checkbox to enter a prefix in the text box and rename all items in the folder by applying the prefix to the existing names.。

相关文档
最新文档