当前位置:首页 > 测试测量 > 测试测量
[导读]1.// 新建一个空的Win32 Dll 工程,加入新的cpp,写入下面代码 _declspec(dllexport) int sum(int a, int b) { return a+b; } //Build出一个dll:sum.dll 2.// 新建一个新的Win32 Console程序 //选择Simple C

1.// 新建一个空的Win32 Dll 工程,加入新的cpp,写入下面代码

_declspec(dllexport) int sum(int a, int b)
{
return a+b;
} //Build出一个dll:sum.dll
2.// 新建一个新的Win32 Console程序
//选择Simple Console Application,修改main函数所在的cpp

#include "stdafx.h"
#include
using namespace std;
// for base type and LoadLibrary
#include
// 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< else
cout<<"function call error";
}
else
cout<<"lodad error";
} //Build & Execute
3.上面一个不便的地方就是GetProcAddress,第二个参数是个很复杂的字符串,需要事先用dumpbin sum.dll /exports得到sum函数的实际名称。所以,一般会在最上面写dll时,导出函数前面不仅加上已有的红字表示导出,还要加上extern "C" ,表示以C方式编译,因为C方式编译时,函数名在库中和在程序代码中会保持一致,不像C++生成新的编码后的函数名。那么,上述的dll函数声明就是
extern "C" _declspec(dllexport) int sum(int a, int b)
而调用程序的GetProcAddress行就改为:
Func f = (Func)GetProcAddress(dll, "sum");
4.编译为dll
5.在labview中用Function->Advance->Call Library Function Node调用。

调用方式为"C",函数原型为long sum(long,long)。运行VI即可得到结果。

===============================================================

labview中dll的调用

通过labview调用dll文件,我们可以进行c、c++代码的复用,减轻编程工作量,便于协同开发,为程序增加新的功能。

我们以求平方根为例。

首先,需要建立求解平方根的dll文件。以VC6.0编译器为例(注意,labview文档中推荐的编译器包括微软的MSC、VC,布包扩BCB)。首先,新建一个project,选择Win32 Dynamic-Link Library类型,我们命名为labSqrt,继续,选择a Simple dll Project,完成。则一个项目建立起来。

注意,上例我们使用的是非MFC的DLL,即不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。

每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在这个示例中,DllMain是一个缺省的入口函数。用这个缺省的入口函数就能使动态连接库被调用时得到正确的初始化。

入口函数已经自动生成了,你可以在文件中加入你所想要输出的函数或变量等等。

应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。这里我们采取第一种方法,并且添加关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。

extern"C" _declspec(dllexport) void getSqrt(double input,double *output);

我们完全可以设定求得的平方根为double型返回值(此处我们用的void类型)。使用两个输入参数的原因是,注意一下,output参数是指针类型,我们用它来得到输出的值。为什么不直接用double型浮点数?呵呵,因为C语言的函数调用属于传值调用,在函数内部不能改变参数的值,因此,如果直接用浮点数,那初始是多少,返回就是多少,无法得到求得的平方根。所以,切记,需要得到参数值时,用指针。(当然,直接设置函数的返回值可以得到,但那样只能有一个返回值。使用参数值,我们可以得到多个哦)

填充函数体,如下所示


// labSqrt.cpp : Defines the entry point for the DLL application.

//

#indlude"stdafx.h"

#include"math.h"

extern"C"_declspec(dllexport)voidgetSqrt(doubleinput,double*output);

BOOL APPIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)

{

returnTRUE;

}

extern"C"_declspec(dllexport)voidgetSqrt(doubleinput,double*output)

{

if(input >= 0)

*output = sqrt(input);

else

*output = 0.0;

}


简单解释一下

添加头文件说明

#include"math.h"

因为我们用到了数学函数sqrt()。

函数体中首先判断输入是否非负,是则将其平方根付给参数output指针指向的元素,否则将0.0赋予。(此程序完全为了说明而用,可以修改使其功能更加强大)

编译通过,生成了labSqrt.dll

创建一个labview的vi,在框图中,右键(Functions)>>Connectivity>>Libraries & Executables>>Call Library Function Node

双击或右键选择Configure,弹出配置对话框。

第一个选项卡是"Function":第一项需要你选中生成的dll选中以后,第二项中就会出来dll中的函数名getSqrt,第三项和第四项不用管,分别是"Run in UI thread"和C(我们使用的是C,不是windowsAPI);

第二个选项卡是"Parameters":在里面配置(添加)函数的各个输入参数。首先为return,返回参数,在下面选择对应的void类型。然后点击“+”号,开始添加函数参数

第一个参数:

名称,随便输入

类型,显然我们的第一个参数为数值型(Numeric),double型的(8字节)

最后一项当然是value,而不是指针

同理,第二个参数也是numeric的8字节double,但是pass一项为point to value

完毕后,下部的phototype显示:

void getSqrt(double num,double *result1);

点击ok。

好了,我们再给配置好的文件添加输入、输出(呵呵,output可以不初始化,输入只连input就行)。运行一下,看看效果吧!

整个的过程就是这样。编写复杂的dll 调用,还将必须考虑其他的一些问题。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

NI提供的软件包经济省时,不仅帮助开发人员节省时间,还为创客提供了新的机遇

关键字: LabVIEW 自动化测试系统

强大的图形化编程工具使整个测试和测量过程的各个方面实现可视化

关键字: LabVIEW 图形化编程工具

摘要:对于每一型新机试飞,或者是重大的研究性试飞和验证试飞,都必须实施遥测监控。现基于TTS(TextToSpeech)语音合成技术,结合飞行试验遥测监控系统的不足,利用TTS引擎在LabVIEW开发环境下设计并实现了遥...

关键字: 飞行试验遥测监控系统 TTS LabVIEW

在科研以及应用软件领域,LabVIEW和MATLAB作为比较常用的2款工具,相信很多人都用过吧。简单的概括一下,LabVIEW侧重测试测量和数据采集,MATLAB侧重科学计算和数据分析。

关键字: LabVIEW matlab 混合编程

摘要:利用单片机和虚拟仪器LabVIEW在PC端设计了温湿度测量及控制系统,用于温湿度数据监测。该系统上位机为PC端监控界面,下位机为单片机,单片机采集温湿度数据,并将采集到的数据通过串口发送给监控界面进行监测和管理。该...

关键字: DHT11 LabVIEW 单片机

摘要:当前闭环步进电机在自动化设备中的应用越来越广泛,故为了进一步满足闭环步进电机的应用需求,采用LabVIEW上位机+运动控制卡+驱动器模块的控制方案进行了多轴运动系统的设计,通过设计的上位机软件实现闭环步进电机的实时...

关键字: 闭环步进电机 精度测试 LabVIEW

摘要:为满足某扭矩检测试验标准要求,基于LabView设计开发了一款扭矩检测装置,该装置能检测某类零部件的断裂力矩,满足试验标准要求,其他零部件的扭矩也可在该装置上检测。类似的扭矩装置可参考该装置进行设计。

关键字: 伺服电机 LabVIEW PLC

在下述的内容中,小编将会对LabVIEW的相关消息予以报道,如果LabVIEW是您想要了解的焦点之一,不妨和小编共同阅读这篇文章哦。

关键字: LabVIEW 测试测量 NI

一直以来,LABVIEW都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来LABVIEW的相关介绍,详细内容请看下文。

关键字: LabVIEW 测试测量 测试仪器

摘 要 :为了实现对患者的远程诊断或监测,设计了相应的硬件模块采集心电、心率、脉搏、血氧饱和度和体温等生理信号,采集到的用户生理参数通过 WiFi 传输至上位机。上位机采用 LabVIEW 实现对用户生理参数的处理与显示...

关键字: 无线传输 生理参数监测 LabVIEW QRS 波形检测 微信小程序 单片机
关闭
关闭