Matlab如何调用动态连接库DLL文件的函数?

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 = https://www.isolves.com/it/cxkf/bk/2020-08-21/y[length-1];strcpy(status, "ok!");}3、Matlab调用方法对于上面的MyFunc函数 , 在Matlab中调用主要涉及到了几个函数的使用 , 包括loadlibrary/unloadlibrary、libpointer、calllib等函数的使用 , 分别实现加载/卸载动态库、定义指针变量、调用函数等功能 。
其Matlab中的调用代码如下所示:
clc, clear allloadlibrary('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文件的函数?

文章插图
 
可见 , 在Matlab中已经成功调用了dll文件中的MyFunc函数并得到了正确的运行结果 。
4、备注在使用calllib函数运行dll文件中的函数时 , 当参数中传递字符类型的指针变量(char *)时 , 其对应的变量如上例中pStatus的值不会改变 , 必须通过calllib的返回值得到更新后的值 。
本文由编码那些事原创 , 请关注+转发+收藏+点赞 , 带你一起长知识!

【Matlab如何调用动态连接库DLL文件的函数?】


    推荐阅读