vc++中调用matlab函数的方法:COM组件
- 格式:pdf
- 大小:155.39 KB
- 文档页数:5
MATLAB与VC++混合编程的研究及应用摘要:介绍了三种实用易行的matlab与vc++混合编程方式,即利用matlab的mcc编译器,使用matcom软件转化m文件,使用matlab的com builder工具制作com组件。
针对具体程序分别应用三种方法来实现,对每种方法介绍了详细步骤。
对三种方法进行了分析比较,总结了各自的优缺点,实现了matlab出色的图形处理功能和数值计算能力与vc++强大编程能力的结合。
关键词:matlab;vc++;混合编程中图分类号:tp311 文献标识码:a 文章编号:1009-3044(2013)10-2353-03matlab是适合多学科,多种工作平台的功能强大的大型数值计算和系统分析软件。
matlab将数值分析、矩阵计算、信号处理和图形显示相结合,包含了大量高度集成的函数,为科学研究、工程设计及众多学科领域提供了一种简洁、高效的编程工具,在数值分析、科学计算、算法开发、建模和仿真等方面具有独特优势[1]。
但是matlab使用的是解释性语言,限制了自身的执行速度;程序的执行限制与matlab自身的运行环境,不利于应用程序的开发;gui功能较差。
vc++是强大的windows应用程序开发工具,它提供了高度集成的工具集和可视化集成的编程环境,包括了microsoft的代码优化技术,极大提高了应用程序的设计效率,还提供了复杂的资源编辑器,拥有强大的gui功能[2]。
因此,实现matlab与vc++等可视化程序设计语言的混合编程,提高程序的执行速度,美化应用程序界面,脱离matlab环境,发布独立的应用程序,同时利用matlab在数值分析、矩阵计算、信号处理和图形显示等方面的强大功能,具有重要的意义。
1 matlab与vc++混合编程方法matlab与vc++有多种接口方法,但是一些常见方法难以实现,执行效率低,如matlab engine、直接调用matlab的c/c++数学函数库等。
MATLAB函数的定义和调用方法引言MATLAB作为一种强大的数学软件,广泛应用于科学、工程和技术领域。
而函数的定义和调用是MATLAB中的基本操作之一。
本文将介绍MATLAB函数的定义和调用方法,帮助读者更好地理解和运用这一功能。
一、MATLAB函数的定义1. 函数的基本概念函数是一种将一组输入转换为一组输出的数学关系。
在MATLAB中,函数是一个独立的代码块,可以在程序中多次被调用和重复使用。
通过定义函数,可以将复杂的计算过程封装起来,提高代码的可读性和重用性。
2. 函数的语法在MATLAB中,函数的定义采用以下语法:```function [输出参数1, 输出参数2, ...] = 函数名(输入参数1, 输入参数2, ...)函数体end```其中,方括号内的部分表示可选项,可根据实际需要决定是否需要设置输出参数。
函数名可以是任意合法的MATLAB变量名,输入参数和输出参数也可以是任意数据类型。
3. 函数体函数体是函数定义的核心部分,用于实现具体的计算任务。
在函数体内部可以使用MATLAB提供的各种算法和语法,包括数值计算、矩阵运算、条件判断、循环等。
函数体应该被包含在一个代码块(用于控制函数范围的一对关键字)中,代码块的结束由`end`关键字来指定。
4. 输入参数和输出参数输入参数用于传递数据给函数,输出参数用于将计算结果返回给调用函数的地方。
在函数定义中,可以设置多个输入参数和输出参数,用逗号分隔。
输入参数和输出参数的顺序应该按照实际需求来定义,以便于调用函数时进行有效的数据传递。
二、MATLAB函数的调用1. 函数的调用方式在MATLAB中,函数的调用可以通过下面的语法来实现:```[输出参数1, 输出参数2, ...] = 函数名(输入参数1, 输入参数2, ...)```其中,`[输出参数1, 输出参数2, ...]`是用于接收函数返回结果的变量,可以根据需要定义为不同的数据类型。
C语言环境中调用Matlab程序指南甄梓宁znzhen@Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。
本文就对如何在C程序中调用Matlab程序作说明。
在C程序中调用Matlab程序有两大类方法。
第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。
前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。
关于MCR,请见第四章的说明。
至于两种方法需要在C环境中如何配置请见第五章。
而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。
一、调用Matlab引擎调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。
下面是调用Matlab中的加法程序add.m的例子。
先在Matlab的work目录下创建add.m文件并编写程序如下:function s = add (a, b)s = a+b;在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)Engine *ep = engOpen (NULL);编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。
如何在C/C++语言里调用Matlab引擎(engine)——(上篇)windows下的Visual C++平台Windows下调用Matlab引擎要做好以下三点设置(1)设置头文件目录(2)设置库文件目录,并添加链接库输入项libeng.lib和libmx.lib(3)设置环境变量以下以Visual Studio 2008为例来说明如何设置这三点:1、添加头文件目录依次选择:“工具”->“选项”,调出对话框后再在对话框左边“选择项目和解决方案”->“VC++目录”然后在右边选择“显示以下内容的目录”下的选框选择“包含文件”,再在目录列表的最下边空行处选中添加:matlab安装目录下的\extern\include路径比如我的是:C:\Program Files\MATLAB\R2011a\extern\include如果现在生成项目,链接将不会通过,比如可能会出现:1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxDestroyArray,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxGetPi,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engClose,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engGetVariable,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engOutputBuffer,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engEvalString,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engPutVariable,该符号在函数_WinMain@16 中被引用等链接错误;这就需要设置下面的库文件目录2、添加库文件目录在刚才调出来的对话框中,设置库目录:选择“显示以下内容的目录”下的选框选择“库文件”添加matlab目录下的C:\Program Files\MATLAB\R2011a\extern\lib\win32\microsoft注意:如果是项目要生成的是64位程序那么应该选择的是C:\Program Files\MATLAB\R2011a\extern\lib\win64\microsoft点击确定退出对话框,然后给项目添加链接库输入项:在解决方案资源管理器里选择对应的项目单机右键选择最下面的“属性”弹出属性对话框,在右边依次选择“配置属性”->“链接器”->“输入”,然后在右边“附加依赖项”那一项加上libeng.lib libmx.liblibmat.lib单击确定退出注意:(1)不要删除原有的依赖项(2)依赖项之间用空格隔开做到这一步时生成时就没问题出现了,但是运行程序时会出现“因为计算机中丢失libeng.dll”等类似问题第(3)步就解决这个问题的。
C#与Matlab混合编程的几种方式主要参考资料: 《Matlab C# Book》,我看的是第一版的电子书,网上可以搜到。
说实话,我觉得C#与Matlab混合编程相比VC与Matlab混合编程没有啥优势,基本上还是通过P/V Invoke操作Matlab mcc编译器生成的C语言版本的DLL。
此外,速度上也慢的吓人-_-下面简单写写C#与Matlab混合编程的4种方式(可能还不够全,欢迎补充):1. 通过从Matlab的*.m文件中生成C语言版本的DLL具体过程:1) 在Matlab中写好一个m文件(比如一个简单的加法函数myplus.m);2) 使用Matlab的mbuild -setup选择编译器,我机器上的编译器有两个LCC 和VC2008(注意如果使用做应用的话,建议编译器选VC2008,否则C #中会告诉你DLL找不到Entry Point)3) 在命令行中使用mcc -B csharedlib:mypluslib myplus.m (如果是多个M文件,接着往后写),等待几十秒之后会生成若干文件(*.c, *.h, *.dll等), 其中.h 文件中有导出的函数原型。
4) 建立C#工程,并将前面的dll拷贝到合适路径,使用[ DllImport( "myplusl ib.dll ", CallingConvention = CallingConvention.Cdecl)] 将.h文件中的函数使用C#的语法声明。
一般来说,这些函数中会有**Initialize,**Terminate和M文件中定义的函数(**代表lib名称)。
5) 使用CsharpMatlabCompilerVer4.cs将C#中的数据类型和Matlab中的矩阵等类型进行变换。
该文件定义了MatlabCSharp类,主要是导入了libmx.dll中的一些函数,并封装了一些实用的函数如double2mxArray_scalarReal等。
关于如何使用VC调用matlab engine编程刚开始学使用VC调用matlab engine编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在matlab6.5和vc++6.0环境下完成的,但是现在我用的是matlab2010a,所以会出现很多环境配置的问题,写本文的目的是总结用我在用VC调用matlab engine编程过程中出现的问题和解决办法。
Matlab Engine 采用Client/Server的方式,通过ActivcX通道和Matlab接口来实现在VC编程环境中直接调用matlab中的指令。
调用使用的函数是:engEvalSting。
下面是自己的实践过程:如果是第一次使用,则要设置一下Visual C++6.0 编程环境中的include 和lib的路径指向。
我的matlab2010安装在D盘目录D:\MATLAB 2010一、设置VC相关属性。
(1)Visual C++6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面,在 Show Directories for 下拉列表中选择Include Files,添加路径:D:\MATLAB 2010\extern\include (这是我电脑中Matlab的安装路径);再选择下拉列表中的 Library Files,添加路径:D:\MATLAB 2010\extern\lib\win32\microsoft(我电脑中Matlab 的安装路径,但是在我查看资料的时候看到很多是D:\MATLAB2010\extern\lib\win32\microsoft\msvc60这个路径,但是我用的是MatlabR2010a,msvc60是matlab6.5老版本才有的,10.0版本没有这个文件,所以我们把路径设到D:\MATLAB 2010\extern\lib\win32\microsoft 就可以了)。
本文由wolf1sky贡献doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
Matlab 与 VC 混合编程 1:一、采用 Matcom1、目标1. 测试在 VC 中调用 MatrixC++库,生成矩阵并显示 2. 测试 VC 中调用.m 文件2、步骤2.1 目标 1<1>建立 VC 工程,添加库 v4501v.lib,有两种方法:?向工程中添加文件 v4501v.lib 在 Setting/link 中添加库 v4501v.lib(这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)二者选其一就可以了。
<2> 添加头文件 #include "matlib.h" (这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)建议:最好在工程中把文件 matlib.h 添加进来,方便查看函数详细说明 <3>现在就可以调用 Matrix中的C++函数了,例子如下:// Init matcom initM(MATCOM_VERSION); winaxes(AfxGetMainWnd()->GetSafeHwnd()); Mm a,b; a = (BR(1),2,3,semi,4,5,6,semi,7,8,9); a = transpose(a); b = (BR(1),2,3,semi,4,5,6,semi,7,8,9); m_1.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f %3f %3f \r\n",a.r(1,1),a.r(1,2),a.r(1,3),a.r(2,1),a.r(2,2),a.r(2,3),a.r(3,1),a.r(3,2),a. r(3,3));//m_1 是一个 CEdit 控件 UpdateData(FALSE); exitM();2.2 目标 2<1>首先用 Matlab 调试成功以下两个有依赖关系的.m 文件文件 1:equation.m function y = equation(a,b) y = a * b; 文件 2:CallE.m % function name function [o1,o2] = CallE(x) if (nargin ~= 1) error('arguments must be inputed!'); endif (x == 1) a = reshape(1:9,3,3); elseif (x == 2) a = reshape(11:19,3,3); else error('input error'); end b = magic(3); o1 = equation(a,b); o2 = o1 + 1; <2>将以上两个文件放在同一个目录下,启动 MatCom 编译运行 CallE.m, >> CallE(2) 则在同一目录下生成一个 DEBUG(或者是 Release,在 MatCom 的菜单项 Configuration 中选择)目录下可以找到相应的.cpp 及.h 文件,把它们全部拷贝到 VC 工程目录下,也可以自己建一个文件夹 <3>在 VC 项目中添加这些文件,并在头部添加相应.h 的引用,如下: #include "./matlib/equation.h" #include "./matlib/calle.h" <4>添加调用函数的代码,如下: Mm a,b,c; a = BR(2); 表示输入参数到输出参数的间隔,《MatrixLIB user's 详见calle(a,i_o,b,c); //i_o 是一个间隔符,Guide》m_2.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f \r\n",b.r(1,1),b.r(1,2),b.r(1,3),b.r(2,1),b.r(2,2),b.r(2,3),b.r(3,1),b.r(3,2),b. r(3,3)); %3f %3fUpdateData(FALSE);3、遇到的问题及解决方案<1>当在 VC 工程中添加由 Matcom 转换的 cpp 及 h 文件后,注:如果在编译中出现下列错误:fatal error C1010: unexpected end of file while looking for precompiled headerdirective 解决:进行下列设置:工程->设置-> C/C++ 选择 precompiled headers 选解决:择第一或第二项:自动选择预补偿页眉,如图:<2>使用Matcom 后,生成Debug 版没问题,而生成Release 时链接出错,nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj) 解决:解决:将"Project 属性" -> "C/C++" -> "代码生成(codegeneration)" -> "运行时库(run-time library)" 项下修改应用程序的默认标准库版本,我修改成 Debug Multithreads 就可以了,原因是安装Matcom 时库为调试版<3>在其它机器上运行出错解决:解决:将 ago4501.dll v4501v.dll glu32.dll opengl32.dll 附带发布即可 <4>关闭程序后进程没有退出解决:解决:添加语句winaxes(m_hWnd);参考文献1、何东健等.《数字图像处理》.西安电子科技大学出版社.20032、邓科.浅析 VC 与matlab 接口编程(一). VC 知识库,41 期3、邓科.浅析 VC 与 matlab 接口编程(二). VC 知识库,42 期4、Matcom 参考手册Matlab 与 VC 混合编程 2:二、通过 Matlab 引擎与 VC 混合编程--飞狼编程宝典--明明知道选择你是一个错误,却为何那么地坚持这个错误……基于 Matlab 引擎的混合编程方式无法脱离 Matlab 环境,却为何还要使用它?根据本人的实践,对于一般应用,如矩阵运算,图像操作等,使用 Matcom 就已经足够,而且能够脱离 Matlab 那个巨大的环境而独立运行,但是,对于很多好用的 Matlab 工具箱,我们却无法直接在 VC 中调用。
Visual C++是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。
但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。
Matlab是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。
不过由于Matlab使用的是解释性语言,大大限制了它的执行速度和应用场合。
基于VC和Matlab混合编程是很多熟悉VC++编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用Matlab引擎。
本文以下部分将详细介绍通过VC++6.0调用Matlab6.5引擎来达到VC++与Matlab数据共享编程的方法。
1. 什么是Matlab引擎所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab 的控制。
可以主要功能有:★打开/关闭一个Matlab对话;★向Matlab环境发送命令字符串;★从Matlab环境中读取数据;★向Matlab环境中写入数据。
与其它各种接口相比,引擎所提供的Matlab功能支持是最全面的。
通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何计算和绘图操作。
对所有的数据结构提供100%的支持。
同时,引擎方式打开的Matlab进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。
实际上,通过引擎方式建立的对话,是将Matlab以ActiveX控件方式启动的。
在Matlab初次安装时,会自动执行一次:matlab /regserver将自己在系统的控件库中注册。
如果因为特殊原因,无法打开Matlab引擎,可以在Dos命令提示符后执行上述命令,重新注册。
matlab函数定义与调用
Matlab函数定义与调用
MATLAB(Matrix Laboratory)函数是指在MATLAB编程环境中定义或
编写的可以重复使用的一组代码片段。
它既能利用现成的工具(例如Mathworks公司提供的Libraries),也能从头开始编写自己的函数。
定义和调用MATLAB函数的常用方法如下:
1、定义MATLAB函数:
定义MATLAB函数需要按照以下步骤:
(1)新建一个函数:
在MATLAB中,可以通过在MATLAB命令行输入“edit functionname.m”的命令来新建一个函数。
(2)编写函数代码:
在函数顶端,注明函数名称、函数参数格式,函数语句及函数返回值
类型。
(3)保存函数代码:
使用“save functionname.m”命令将函数代码保存为*.m文件,并保
证该函数文件已放置在MATLAB搜索路径中。
2、调用MATLAB函数:
在MATLAB中,若要调用自定义函数(包括自定义和现有函数库中的函数),只需输入“functionname(input1,...,inputN)”的命令即可,
并且可以给函数传递不定数量的参数,以满足不同需求。
此外,在调
用函数之前,也可以先设置函数参数以指定函数行为,这样可以实现
函数可配置性。
总之,MATLAB函数定义与调用是MATLAB编程中常用的两种方式,
它们具有灵活性和可重用性,并且可以让程序编写变得更加简单。
MATLAB的函数定义和调用的步骤既可以来自于现有的函数库,也可以
从零开始自定义,以满足多种不同的编程需求。
在利用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()里添加释放接口和资源的代码。