当前位置:文档之家› vc++中调用matlab函数的方法:COM组件

vc++中调用matlab函数的方法:COM组件

在利用vc++编程时,常需要一些特殊的数学函数,因此可以调用matlab中的强大的数学函数,通常使用的方法有引擎和com方法。

下面对此两种方法进行简单介绍。

1。

引擎,如何设置?matlab安装在c:\matlab6p5操作系统:windows2000(1)在vc中把“工具”-〉“选择”菜单中的“目录”选项卡中设置好include(C:\MATLAB6P5\EXTERN\INCLUDE),executable files(c:\matlab6p5\bin\win32)和library(C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60)目录,包括进来上面这两个目录。

(2)在C:\MATLAB6p5\bin\win32\mexopts下双击msvc60opts.bat和msvc60engmatopts.bat(3)在vc中把“工程”-〉“设置”选项卡中的Link的“对象/模块库”中再加上以下内容:libeng.lib libmat.lib libmatlb.lib libmatlbmx.liblibmex.lib libmmfile.lib libmwarpack.lib libmwlapack.liblibmwmcl.lib libmwrefblas.lib libmwservices.lib libmwsglm.liblibmx.lib libut.lib mclcommain.lib sgl.lib(4)最后在编写程序时加入这么一句预编译语句#include<c:\matlab6p5\extern\include\engine.h>2。

com组件首先,设置合适的编译器。

在MATLAB命令窗口里敲:mbuild–setup和mex–setup,完成编译器的设置。

●Please choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers[y]/n?y●Select a compiler:[1]Lcc C version2.4in C:\MATLAB7\sys\lcc[2]Microsoft Visual C/C++version6.0in C:\Program Files\Microsoft Visual Studio[0]NoneCompiler:2●Please verify your choices:Compiler:Microsoft Visual C/C++6.0Location:C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):y●Try to update options file:C:\Documents and Settings\Administrator\ApplicationData\MathWorks\MATLAB\R14\compopts.batFrom template:C:\MATLAB7\BIN\WIN32\mbuildopts\msvc60compp.batDone...-->"C:\MATLAB7\bin\win32\mwregsvr C:\MATLAB7\bin\win32\mwcomutil.dll"DllRegisterServer in C:\MATLAB7\bin\win32\mwcomutil.dll succeeded-->"C:\MATLAB7\bin\win32\mwregsvr C:\MATLAB7\bin\win32\mwcommgr.dll"DllRegisterServer in C:\MATLAB7\bin\win32\mwcommgr.dll succeeded●Please choose your compiler for building external interface(MEX)files:Would you like mex to locate installed compilers[y]/n?y●Select a compiler:[1]Digital Visual Fortran version6.0in C:\Program Files\Microsoft Visual Studio[2]Lcc C version2.4in C:\MATLAB7\sys\lcc[3]Microsoft Visual C/C++version6.0in C:\Program Files\Microsoft Visual Studio[0]NoneCompiler:3●Please verify your choices:Compiler:Microsoft Visual C/C++6.0Location:C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):yTry to update options file:C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R14\mexopts.batFrom template:C:\MATLAB7\BIN\WIN32\mexopts\msvc60opts.batDone...1.设置系统路径。

我的电脑->属性->高级->环境变量->系统变量->Path选项,增加以下路径:头文件:C:\MATLAB7\extern\include;库:C:\MATLAB7\extern\lib\win32\microsoft\msvc60;DLL:C:\MATLAB7\bin\win322.做一个简单的M函数(只能是函数不能是文件)。

文件名和函数名一致。

运行并测试此文件的正确性。

function plot_test(result)plot(result);%画图3.在命令窗口敲comtool,出现com组件builder。

选择FILE选项->New Project选项。

Component name选项:设置com组件的名称,注意不要和上面添加的m文件重名。

Class name选项:设置类名称。

一般将鼠标点击空白位置,系统会自动生成类名。

Project version选项:版本号。

系统默认为1.0,将来要修改或添加其他函数时,可以修改此选项为2.0,3.0等。

Project directory选项:工程所在目录。

Complier options选项:编译器配置选项,全部选中。

最后单击OK。

系统会出现对话框,问你是否创立工程目录,你选YES。

4.单击Project Files->plotclass->M-files,然后选中comtool菜单Project->Add File选项,添加上面写好的plot_test M函数。

5.单击Build按钮,选中Com Object选项,这时com-builder会帮你自动编译连接该组件,生成所需要的头文件,源文件,接口描述文件,动态连接库文件,等等。

在右侧Build Status显示框里给出了编译的过程和信息。

在菜单Component->Component Info里有关于接口、类、库的信息。

在C:\MATLAB7\work\plot文件夹里,出现了两个子文件夹,distrib和src,这是我们VC中需要用到的文件、库、资源、接口等。

在src->plot_idl_i.c中,有关于com 类和com接口的GUID。

其中CLSID(类的GUID)在VC编程中需要用到。

6.打开VC++编译器,选择文件->新建->工程->MFC(exe)->命名(plot)->单文档->完成。

我们在资源Toolbar里建立两个按钮,一个用于启动COM(OLE),获得接口指针;另一个用于调用绘图(plot_test)命令。

用查看->类向导建立,在CplotView类里建立command消息映射。

7.再次打开类向导,在Add Class选项内,选中From a typed library,进入C:\MATLAB7\work\plot\src文件夹,选中plot_idl.tlb文件,点击打开 OK。

这时一个COM类便加入进来了,查看一下Iplotclass类。

里面有些,我们想要的东东。

8.下面就是OLE调用的基本方法了,具体可以参见MSDN。

首先在CplotApp类的InitInstance()里添加初始化OLE代码。

BOOL suc=AfxOleInit();//初始化OLEif(suc==FALSE){::AfxMessageBox("初始化OLE失败!");}其次,在CplotView里包含plot_idl.h,math.h头文件,并定义常量PI;并从C:\MATLAB7\work\plot\src\plot_idl_i.c中拷贝类的GUID并复制到PlotView.h文件类定义的上面。

#include"plot_idl.h"#include"math.h"#define PI3.1415926535897const CLSID CLSID_plotclass= {0xAED07AAF,0x3190,0x4996,{0xAD,0xD6,0x31,0xF9,0x45,0x41,0xB1,0xC5};再次在构造函数CPlotView()的上面定义类全局对象;Iplotclass plot;然后,OnStart()函数里添加获得COM指针的函数,代码如下:plot.CreateDispatch(CLSID_plotclass,NULL);//创立接口COleDispatchDriver();//连接(此句可以不写)然后,在OnPlot()函数里添加绘图代码,代码如下,这里关于VARIANT变量的用法说明请参照MSDN。

const int N=100;//数组大小double a[N];//数组定义double f=50;//正弦信号频率double Ts=0.002;//采样时间//赋值for(int i=0;i<N;i++){a[i]=sin(2*PI*f*i*Ts);}//任意变量VARIANT x;VariantInit(&x);//初始化x.vt=VT_ARRAY|VT_R8;//类型(数组,双精度型)SAFEARRAYBOUND rgsabound[1];rgsabound[0].cElements=N;//数组所含元素数rgsabound[0].lLbound=0;//数组上界//创立数组x.parray=SafeArrayCreate(VT_R8,1,rgsabound);//创立一维数组//锁定数组SafeArrayLock(x.parray);//数组传递数据x.parray->pvData=a;//调用方法plot.plot_test(x);//解锁SafeArrayUnlock(x.parray);最后,在析构函数~CPlotView()里添加释放接口和资源的代码。

相关主题