2024年1月16日发(作者:)
matlab调用dll实例
% 用loadlibrary函数, 根据epanet2.h中的函数定义,加载
loadlibrary('c:','c:epanet2.h');
% 查看支持的函数接口
libfunctions epanet2 -full
% [int32, string, string, string] ENopen(string, string, string)
% int32 ENsolveH
% [int32, singlePtr] ENgetnodevalue(int32, int32, singlePtr)
a1='';
a2='';
a3='';
a_1=libpointer('stringPtr',a1);
a_2=libpointer('stringPtr',a2);
a_3=libpointer('stringPtr',a3);
[d,a_1,a_2,a_3]=calllib('epanet2','ENopen',a1,a2,a3);
calllib('epanet2','ENsolveH');
c1=12;
c2=11;
demand=0;
c3=demand;
c_3=libpointer('singlePtr',c3);
[t,c_3]=calllib('epanet2','ENgetnodevalue',c1,c2,c_3)
calllib('epanet2','ENclose')
unloadlibrary('epanet2')
ENopen是打开文件函数,ENsolveH是水力计算函数,ENgetnodevalue是得到某个节点的value值。
epanet是管网水力计算的一个软件。
问得很好,我最近也在做这个,不过我这个难度更高,要用VC生产lib文件,并用Matlab调用。目前还没有找到实现办法,倒是发现了用VC生成dll文件,并用Matlab调用的方法。
VC-new-win32 dynamic link library,然后写好c文件和h文件,编译后既可以生成dll文件。
在matlab里写一个M文件(函数或脚本都可以),然后用loadlibrary('','xxx.h');把dll读进maltab。dll文件和h文件要放在matlab能找到的目录,再用calllib来调用dll里面的函数。
谢谢分享!我刚才也实现了一个matlab调用VC++6生成的dll,费了好长时间终于成功。
期间遇到的问题就是loadlibrary成功了,但是里面想调用的函数没有加载上。分析了一下,发现是C++的问题。大概是matlab支持C而非C++,所以在VC++6中将要调用的函数声明为extern “C”, 然后重新生成dll,再用楼主的方法调用,终于成功了。
我用matlab写了个界面,然后用VC++6写了dll函数,用.m文件读取界面上的参数,调用dll计算,再把计算结果送到matlab的界面上显示。貌似麻烦了点,但是事实证明是行得通的,而且界面很漂亮,个人认为相当满意,庆祝一下


发布评论