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<
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 调用,还将有必要考虑其他的一些问题。