matlab如何生成dll文件(Matlab如何调用动态连接库DLL文件的函数)
matlab如何生成dll文件(Matlab如何调用动态连接库DLL文件的函数)可见,在Matlab中已经成功调用了dll文件中的MyFunc函数并得到了正确的运行结果。运行结果如下图所示:/*------------------------------------------------------------------------------- * 产生等间隔的数据向量并返回数据向量的最后一个值和状态信息 * 输入: x0--起始值 * deltx--数据间隔 * length--数据长度 * 输出: y--产生的向量 * lastData--y数组的最后一个值 * status--状态信息 ------------------------------------------------------------------------------- */ void MyFunc(double x0 double deltx i
1、引言最近在开发一个项目时,已经用C语言写好了主要算法部分,并将主要功能实现部分以函数形式封装到了动态连接库dll文件中,但客户要求提供Matlab调用DLL函数的例子,因此,花了点时间研究了下Matlab语言中调用DLL函数的方法。
为简单起见,下面以DLL文件中的一个简单的函数调用为例进行说明(当然是虚构的一个函数了,但也涉及到了常用参数类型如指针、字符串等的传递)。
2、DLL文件中函数原型说明本例调用C语言编写的DLL文件“MyDll.dll”里的函数“MyFunc”,这个函数原型声明如下:
#define EXPORT extern "C" __declspec(dllexport)
void MyFunc(double x0 double deltx int length double *y double &lastData char* status);
该函数产生一个初始值为x0、间隔为deltx、长度为length的一维数组y,并给出该数组的最后一个值lastData和函数的运行状态信息status。从函数的声明中可以看出,该函数中参数数据类型涉及到了“double”类型、“int”类型和“char”类型(字符串类型),在参数传递中也涉及到了值传递(x0、deltx、length)和指针(y、lastData、status)传递方式,较为复杂。为便于理解,下面给出该该函数的C语言实现代码。
/*-------------------------------------------------------------------------------
* 产生等间隔的数据向量并返回数据向量的最后一个值和状态信息
* 输入: x0--起始值
* deltx--数据间隔
* length--数据长度
* 输出: y--产生的向量
* lastData--y数组的最后一个值
* status--状态信息
------------------------------------------------------------------------------- */
void MyFunc(double x0 double deltx int length double *y double &lastData char* status)
{
for (int i=0; i<length; i )
{
y[i] = x0 i * deltx;
}
lastData = y[length-1];
strcpy(status "ok!");
}
3、Matlab调用方法
对于上面的MyFunc函数,在Matlab中调用主要涉及到了几个函数的使用,包括loadlibrary/unloadlibrary、libpointer、calllib等函数的使用,分别实现加载/卸载动态库、定义指针变量、调用函数等功能。
其Matlab中的调用代码如下所示:
clc clear all
loadlibrary('MyDll.dll' 'MyDll.h');
libfunctions MyDll -full;
x0 = 0;
deltx = 1.1;
length = 10;
pY = libpointer('doublePtr' zeros(1 length));
pLastData = libpointer('doublePtr' 1.0);
pStatus = libpointer('cstring' '');
[~ ~ status] = calllib('MyDll' 'MyFunc' x0 deltx length pY pLastData pStatus);
disp(['y: [' num2str(pY.value) ']']);
disp(['lastData: ' num2str(pLastData.value)])
disp(['status: ' status])
unloadlibrary MyDll
其中,通过代码“libfunctions MyDll -full;”可以显示dll文件中所有的函数信息。
运行结果如下图所示:
可见,在Matlab中已经成功调用了dll文件中的MyFunc函数并得到了正确的运行结果。
4、备注在使用calllib函数运行dll文件中的函数时,当参数中传递字符类型的指针变量(char *)时,其对应的变量如上例中pStatus的值不会改变,必须通过calllib的返回值得到更新后的值。
本文由编码那些事原创,请关注 转发 收藏 点赞,带你一起长知识!