您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2020-08-21 10:46:41  来源:  作者:

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文件的函数?

 

可见,在Matlab中已经成功调用了dll文件中的MyFunc函数并得到了正确的运行结果。

4、备注

在使用calllib函数运行dll文件中的函数时,当参数中传递字符类型的指针变量(char *)时,其对应的变量如上例中pStatus的值不会改变,必须通过calllib的返回值得到更新后的值。

本文由编码那些事原创,请关注+转发+收藏+点赞,带你一起长知识!



Tags:Matlab   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
随着基于模型设计的广泛应用,模型在环仿真也逐渐多了起来,我们今天介绍几种嵌入式常用滤波算法的matlab实现。一、采用数字滤波算法克服随机干扰的误差具有以下优点: 数字滤波...【详细内容】
2021-09-27  Tags: Matlab  点击:(72)  评论:(0)  加入收藏
1、引言最近在开发一个项目时,已经用C语言写好了主要算法部分,并将主要功能实现部分以函数形式封装到了动态连接库DLL文件中,但客户要求提供Matlab调用DLL函数的例子,因此,花了点...【详细内容】
2020-08-21  Tags: Matlab  点击:(4116)  评论:(0)  加入收藏
之前,我们报道过《美国“实体清单”的中国高校》,并为他们点赞。万万没想到,美国还真的对学生下手了。。哈工大、哈工程的老师和学生们最近无法使用 MATLAB 了,这一消息迅速成为...【详细内容】
2020-06-14  Tags: Matlab  点击:(40)  评论:(0)  加入收藏
定向打击,已经成为美国扼制中国科技产业崛起的一把“尖刀”!  昨日(即6月11日),哈工大、哈工程等高校的学生在使用校方购买的正版软件MATLAB 时,发现这个来自美国、理工科必备的...【详细内容】
2020-06-13  Tags: Matlab  点击:(82)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条