捉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();
}
|