混合编程其实不难,关键是没有一个规范的,真正可以解决设置过程中出现的小问题的方法。我在设置的过程中,遇到了不少问题,花了多半天的时间,终于解决了,顺利地在vc中调用matlab 生成的dll文件中的函数,并返回一个值,探出对话框,显示正确。这种混合编程的方式不能脱离matlab环境,如果需要发布独立的应用程序,需要安装MCR。下面分步骤地讲一下混合编程的设置及其原因:

1 matlab方面的操作

首先先写一个算阶乘的函数,存成test1.m文件,该文件的内容是:

function y = test1(n)
y = 1 ;
for i = 1 : n
y = y * i ;
end
现在有了文件,下一步我们要设置好系统,设置好matlab,然后再把该文件编译成dll文件。

1、在环境变量(我的电脑右键-高级)path中加入<MATLAB71_root>\bin\win32;

2、添加环境变量matlab值设为< MATLAB71_root >即matlab7.1的安装路径;

3、配置mbuild使用的C/C++编译器;

在Matlab命令窗口中输入:

mbuild -setup

按照提示选择VC6.0的编译器,完成后在Matlab命令窗口中输入:

mex -setup

同样选择VC6.0的编译器,就完成编译器的安装和配置。

接下来我们要把.m文件存储的程序编译成dll文件,在matlab命令窗口中输入:

首先设置好工作目录,否则找不到文件

mcc -W lib:test1 -T link:lib test1.m

这个需要等一小段时间,最终,在当前目录下生成了

到此,在操作系统和matlab这一方面的工作就做完了

2 vc++6.0中的操作

在vc中建立一个MFC AppWizard[exe]基本对话框工程,名字叫做test1app.
1 )在 VC 中创建一个 MFC 工程(本人创建的为基于对话框的),环境设置根据如下帖子
: 怎样设置  Visual Studio  与  Matlb Complier 4.0  一起工作   中的指导进行。在
本例子中,只需要在 VC 中进行如下步骤: 
A. Tools->Options->Directories->Show directories for : Include files-><matlab
7root> \Extern\Include ; 
B. Tools->Options->Directories->Show directories for : Library files-><matlab
7root> \Extern\Lib\Win32\Microsoft\msvc60 ; 
C. Project->Setting->C/C++->Category : Code Generation->Use run-time library 
: Debug Multithread DLL ; 
D. Project->Setting->Link->Category : Input->Object/library modules : test1.lib mclmcr.lib libmx.lib libmat.lib libeng.lib

2 )拷贝 MATLAB 当前目录下刚才用 mcc 生成的 test1.h , test1.dll , test1.lib ,以及 test1.ctf 文件到 VC 当前工程目录下,并用 Project->Add to Project->Files… 将 test1.h 加入到当前工程中。 
3 )在当前工程的对话框的头文件和cpp中加入 #include "test1.h" 与 #include "mclmcr.h" ;

工程设置到此就结束了,下面开始写代码:

首先需要在对话框的初始化程序BOOL CTest1appDlg::OnInitDialog()内写

if( !mclInitializeApplication(NULL,0) ) //matlab环境初始化
 {
  AfxMessageBox( "Could not initialize the application.");
  exit(1);
 }

/* Call the library intialization routine and make sure that the
    * library was initialized properly. */
 if (!test1Initialize())              //test1Initialize是test1.h中定义的test1函数的初始化函数
 {
  AfxMessageBox("Could not initialize the library.");
  exit(1);
 }

在对话框的确定按钮的消息响应函数内,调用dll中的阶乘函数,

void CTest1appDlg::OnOK()
{
 // TODO: Add extra validation here

//此处为dll中的函数准备好参数,然后调用
 double  n = 4 ;
    mxArray  * t;   //经过matlab编译完的dll 中的函数只能识别mxArray 类型的参数,所以我们在vc中定义的数值

//都需要转换成该种格式
    t = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);//该函数中的参数1,1定义了 t 这个矩阵的大小
    memcpy(mxGetPr(t), & n, sizeof ( double ));//给 t 赋值为4

mxArray * y;      //准备一个接收返回值的变量
 y = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);
   
 mlfTest1(1,&y,t);   //运行该函数,进行阶乘计算,4的
 double r1 = 0;   //vc中的接收返回值的函数
 memcpy(&r1,mxGetPr(y),sizeof(double));
    mxDestroyArray(t); //销毁废弃内存
    test1Terminate();//中止调用

CString showrslt;
 showrslt.Format("%f",r1); 
 AfxMessageBox(showrslt);//显示阶乘计算的结果
 CDialog::OnOK();
}

matlab与MFC的更多相关文章

  1. Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)

    利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...

  2. WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  3. C++调用matlab函数

    C++与matlab混合编程——C++调用MATLAB函数 笔者最近在从事一个MFC相关的项目,要求将用Matlab实现的算法通过应用MFC制作成一个小应用.其中有一部分内容需要求一个多元函数的最值. ...

  4. PreEssentials与MFC集成使用

    ProEssentials是Gigasoft公司开发的一个功能十分强大的分发免费的工控图表.它提供了几乎所有的曲线显示形式,支持多种开发工具,提供以下接口供开发者调用:.NET(WinForm).AS ...

  5. 编写 Matlab mexFunction (C mex)

    资料一 MATLAB的MEX文件编写和调试 1. MEX的编写格式 写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写. 编写MEX程序的编辑器可以使用M ...

  6. matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)

    matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...

  7. Matlab 2013a 和 VS2010 混合编程

    最近由于项目需求,某项目的算法是基于MATLAB完成的,在短时间内需要去调用算法功能.因此,基于MATLAB生成DLL, C 调用的方式完成. 环境:MATLAB 2013a + VS2010 + w ...

  8. 【转】三种方式在C++中调用matlab

      C/C++调用Matlab 在工程实践中,C/C++调用Matlab 的方法主要有调用Matlab 计算引擎.包含m 文件转 换的C/C++文件,以及调用m文件生成的DLL 文件. 1 利用Mat ...

  9. VC++中的C运行时库浅析(控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的.C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...

随机推荐

  1. Javascript获取当月的天数

    var d = new Date(); var curMonthDays = new Date(d.getFullYear(), (d.getMonth() + 1), 0).getDate(); a ...

  2. linux修改 时间 时区

    linux系统修改系统时间与时区 | 浏览:3486 | 更新:2014-06-18 19:36 1 2 3 4 5 6 7 分步阅读 有装过Linux系统的人,可能都会有这样的经历,就是该机器安装w ...

  3. ant入门程序

    一. ant简单介绍 Ant是apache的一个核心项目, 它的作用是项目自己主动化构建, 由于它内置了Javac.Java.创建文件夹.拷贝文件等功能, 直接执行build.xml文件就能够编译我们 ...

  4. HDUOJ---(4708)Rotation Lock Puzzle

    Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. Lucene使用与优化(转)

    原文链接:http://blog.csdn.net/hongfu_/article/details/1933346 本文所使用的Lucene版本较低,年代久远,许多API可能已经变了. 1 lucen ...

  6. Linux命令-某个用户组下面的所有用户

    groups 查看当前登录用户的组内成员 groups gliethttp 查看gliethttp用户所在的组,以及组内成员whoami 查看当前登录用户名 系统内有关组的信息放在/etc/group ...

  7. DBA_实践指南系列9_Oracle Erp R12应用补丁AutoPatch/AutoControl/AutoConfig(案例)

    2013-12-09 Created By BaoXinjian

  8. Note for video Machine Learning and Data Mining——training vs Testing

    Here is the note for lecture five. There will be several points  1. Training and Testing  Both of th ...

  9. caffe make 编译

    其实嘛,出现这个的原因在于,已经编译过啦,没有任何改动,那还烦劳编译啥呢. 那Linux又是如何知道已经编译过了呢? 那就要看makefile的规则啦.makefile的规则是所想产生的文件需要依赖很 ...

  10. python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解

    推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...