【混合编程】VC调用Matlab生成的DLL


初衷:

捕捉Matlab生成的对话框,嵌入到VC的对话框里。本文是第一步,做到在VC里,调
用Matlab,弹出对话框。

参考资料:深入浅出 MATLAB 7.X 混合编程 董维国 2005年 (章节号 7.4.1)

问题:

该书较早,采取的平台较老。

我的平台:

Win7 32位 旗舰版
Matlab R2010b(7.11)
Vs2005

遇见的问题:

内存错误。如图:


原因:

经过网上查找,可能的原因如下:
a. 配置属性——常规——公共语言运行库支持——clr    没有效果
b. #include "mclcppclass.h"                              还是不行
c. 将dll 文件 加入到工程(增加——现有项)             没有效果。这个本来就没道理
d. 在调用函数前加上 xxxInitialize();                     !!!!有效

最后,经过测试,第四条,需要将引用的库初始化,是解决问题的关键。

========================================================================

以下是详细的过程:

一、 Matlab的设定

1. 设定Matlab的编译器

mex -setup
mbuild -setup

根据Matlab的提示,选择合适的编译器。这里选择Vs2005 的编译器。

2. 将.m文件编译生成所需的 .dll .lib .h文件

mcc -W cpplib:YouLibName -T link:lib YourMatlabFile.m

  参数含义:可以 help mcc 进行查看

生成后的文件包括:

由于只用到 .dll .lib .h文件,所以有这三个即可。有的教程里会提到.ctl文件,如果没有也不必担心。

是Matlab不同版本的原因。


二、 VS的设定

Vs的设定比较简单,与调用任何第三方(动态)库一样,需要加上两个目录:

1. 包含头文件目录 && 包含lib库目录
项目——属性——配置属性——C/C++——常规——附加包含目录

"D:\Program Files\MATLAB\R2010b\extern\lib";
"D:\Program Files\MATLAB\R2010b\extern\include"

这一步也可以在 工具——选项——项目和解决方案——VC++目录 里设置。这样对所
有的工程有效,不必每次都设置搜索目录。

2. 指定要调用的第三方库(即Matlab编译生成的dll 与 lib 文件)
项目——属性——配置属性——链接器——输入——附加依赖项

mclmcrrt.lib libEnd.lib(生成的.lib文件)

  若是较早的Matlab版本,可能会需要加入别的库。

三、 编写代码。

此处以 基于对话框的程序(bookTest)为例。

1. 将生成的 .lib .dll .h 文件拷贝到新建工程的源代码目录,并将.h文件添加进
工程。

2. 在bookTestDlg.h里包含动态库的头文件

#include "libEnd.h"

  

3. 在CbookTestDlg::OnInitDialog()里,对MCR及生成的库进行初始化

// TODO: 在此添加额外的初始化代码
if (!mclInitializeApplication(NULL,0))
{
MessageBox(_T("Initilize error!"));
return TRUE;
}
libEndInitialize();

  

4.为对话框添加按钮,在按钮的响应函数里添加代码:

void CbookTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
xxx();// 生成的库里的函数
}

  

5. 在退出时,释放调用的库。

void CbookTestDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
libEndTerminate();
mclTerminateApplication();
CDialog::OnClose();
}

  四、 运行效果

参考文献:

1. 《深入浅出 MATLAB 7.X 混合编程 董维国 2005年 》7.4节

2. http://wenku.baidu.com/view/03be8cbc960590c69ec37691.html

3. http://blog.csdn.net/scut1135/article/details/6246368


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM