VC6.0调用Matlab Dll的方法

本文详细介绍如何在VC++环境中调用由Matlab编写的DLL文件。包括所需环境配置、解决冲突问题及具体调用步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:VC调用Matlab编写的DLL 作者:小木头
一. 基本环境:
1. Microsoft Visual Studio 2008 SP1(VC++);
2. MATLAB Compiler Runtime;
3. OS:Windows XP。
二. 基本方法:
1. 经验说明
<wbr><wbr><wbr><wbr><wbr><wbr> 首先值得说明的是,经过不断的尝试和搜集资料,发现要想在VC++中调用MATLAB编写的DLL,必须至少要有MATLAB Compiler Runtime环境,也就是说得先安装MCRInstaller.exe(约160M),当然,直接安装MATLAB R2009a(约4.0G)也可以。显然,如果您仅仅想用VC++调用MATLAB编写的DLL,安装MCRInstaller.exe 就足够了,安装完之后看一下系统环境变量的Path里是否已经添加了其路径,如果没有需手动添加,一般会有的。<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 此外,值得注意的是,我遇到了这样的情况:起初我只是安装了MCRInstaller.exe,此时VC++可以正常调用MATLAB编写的DLL,之后,我又想装下MATLAB R2009a,安装完之后奇怪的事情出现了,之前正常的调用,居然不行了,在调用libdrawAMResultsInitiali<wbr>ze()【其中:libdrawAMResults是DLL的名称】初始化lib时,返回值永远是false,无法正常调用了。又经过不断的尝试和搜集资料发现,应该是安装MATLAB R2009a的时候和之安装的MCRInstaller.exe 发生了“共享冲突”,之后,我将 MATLAB R2009a卸载了,卸载后一定用系统清理工具清理一下系统,可能是还有残存的注册表信息还是文件,会导致还是无法正常调用MATLAB编写的DLL,清理之后,奇迹再次发生了,又可以正常调用了。<br> 2.调用细节步骤:<br> (1)将MATLAB生成的:*.h、*.lib、*.dll 三个文件拷贝到当前项目的目录下。<br> (2)设置VC++项目的属性:<br> 首先,在“配置属性-&gt;C/C++-&gt;常规”的“附加包含目录”中添加MCR的include目录的路径,我的路径是:<br> C:Program FilesMATLABMATLAB Compiler Runtimev713externinclude<wbr> 。如下图所示:<br><a target="_blank" href="http://photo.blog.sina.com.cn/showpic.html#blogid=5f8b75f60100xb5f&amp;url=http://s16.sinaimg.cn/orignal/7c9517cega0625da7d2ef"><img title="[转载]VC调用Matlab编写的DLL" name="image_operate_6031302246215722" alt="[转载]VC调用Matlab编写的DLL" src="http://s16.sinaimg.cn/bmiddle/7c9517cega0625da7d2ef&amp;690"></a><br><br> 其次,在“配置属性-&gt;链接器-&gt;常规”的“附加库目录”中添加MCR的lib库路径,我的路径是:<br> C:Program FilesMATLABMATLAB Compiler Runtimev713externlibwin3<wbr>2microsoft 。如下图所示:<br><a target="_blank" href="http://photo.blog.sina.com.cn/showpic.html#blogid=5f8b75f60100xb5f&amp;url=http://s2.sinaimg.cn/orignal/7c9517cega0627cecbdf1"><img title="[转载]VC调用Matlab编写的DLL" name="image_operate_67631302246215877" alt="[转载]VC调用Matlab编写的DLL" src="http://s2.sinaimg.cn/bmiddle/7c9517cega0627cecbdf1&amp;690"></a><br><br> 最后,在“配置属性-&gt;链接器-&gt;输入”的“附加依赖项”中添加DLL中和程序中所依赖的lib库名称【被调用的MATLAB DLL的lib也可以包含在这里,当然也可以直接通过“添加-&gt;现有项“到项目资源文件中】。如下图所示:<br><a target="_blank" href="http://photo.blog.sina.com.cn/showpic.html#blogid=5f8b75f60100xb5f&amp;url=http://s16.sinaimg.cn/orignal/7c9517cega0629a8b56ff"><img title="[转载]VC调用Matlab编写的DLL" name="image_operate_25191302246216408" alt="[转载]VC调用Matlab编写的DLL" src="http://s16.sinaimg.cn/bmiddle/7c9517cega0629a8b56ff&amp;690"></a><br><br><a target="_blank" href="http://photo.blog.sina.com.cn/showpic.html#blogid=5f8b75f60100xb5f&amp;url=http://s14.sinaimg.cn/orignal/7c9517cega062c1bc9bcd"><img title="[转载]VC调用Matlab编写的DLL" name="image_operate_83331302246217857" alt="[转载]VC调用Matlab编写的DLL" src="http://s14.sinaimg.cn/middle/7c9517cega062c1bc9bcd&amp;690"></a><br><br> (3)VC++程序中的调用:<br> 首先,包含所使用到的头文件,例如(我的libdrawAMResults DLL):<br> #include "libdrawAMResults.h"<br> #include "mclmcrrt.h"<br> #include "mclcppclass.h"<br> 其次,正式调用:<br><wbr><wbr><wbr> //初始化MCR<br><wbr><wbr><wbr> if(!mclInitializeApplication<wbr>(NULL,0) )<br><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr> MessageBox(_T("Could not initialize MCR!"));<br><wbr><wbr><wbr> }<br><wbr><wbr> //初始化lib<br><wbr><wbr><wbr> if(!libdrawAMResultsInitiali<wbr>ze())<br><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr> MessageBox(_T("Could not initialize libdrawAMResults!"));<br><wbr><wbr><wbr> }<br><wbr><wbr><wbr> try<br><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr> mwArray a(3,3,mxDOUBLE_CLASS);<br><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr> //double ha[9]={0,0.953,-0.544,1.189,0.177,-0.358,0.358,1.811,-0.358};<br><wbr><wbr><wbr><wbr><wbr><wbr> //a.SetData(ha,9);<br><br><wbr><wbr><wbr><wbr><wbr><wbr> a(1,1) = 0;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> a(1,2) = 1.189;<wbr><wbr><wbr><wbr><wbr> a(1,3) = 0.358;<br><wbr><wbr><wbr><wbr><wbr><wbr> a(2,1) = 0.953;<wbr><wbr><wbr><wbr><wbr> a(2,2)=0.177;<wbr><wbr><wbr><wbr><wbr> a(2,3) = 1.811;<br><wbr><wbr><wbr><wbr><wbr><wbr> a(3,1) = -0.544;<wbr><wbr><wbr><wbr> a(3,2)=-0.358;<wbr><wbr><wbr><wbr><wbr><wbr> a(3,3) = -0.358;<br><br><wbr><wbr><wbr><wbr><wbr><wbr> //上面两种方式初始化mwArray,得到的矩阵才是一样。<br><wbr><wbr><wbr> }<br><wbr><wbr><wbr> catch (const mwException&amp; e)<br><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr> MessageBox(_T("mwException!"));<br><wbr><wbr><wbr> }<br> 3.致谢<br><wbr><wbr> 感谢网友们发布的相关方面的经验分享给我的参考、指引和启发。谢谢!<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值