声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 861|回复: 0

MATLAB与Visual C++接口--COM组件

[复制链接]
发表于 2006-5-23 14:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本文根据作者亲自在VISUAL C++ 6.0编译器环境下,实现了MATLAB中COM组件的开发而写成。此方法的实现是在网上各位前辈的基础上完成的。现在,就具体谈一下怎么把一个M文件或MEX文件,做成可以脱离MATLAB环境的COM组件,并且被VC++调用。<BR><BR>1. 首先,设置合适的编译器。在MATLAB命令窗口里敲:mbuild –setup 和 mex –setup,完成编译器的设置。<BR><BR>● Please choose your compiler for building standalone MATLAB applications: <BR>Would you like mbuild to locate installed compilers [y]/n? y<BR><BR>● Select a compiler: <BR>[1] Lcc C version 2.4 in C:\MATLAB7\sys\lcc <BR>[2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio <BR>[0] None <BR><BR>Compiler: 2<BR><BR>● Please verify your choices: <BR>Compiler: Microsoft Visual C/C++ 6.0 <BR>Location: C:\Program Files\Microsoft Visual Studio <BR>Are these correct?([y]/n): y<BR><BR>● Try to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R14\compopts.bat <BR>From template: C:\MATLAB7\BIN\WIN32\mbuildopts\msvc60compp.bat <BR>Done . . . <BR>--&gt; "C:\MATLAB7\bin\win32\mwregsvr C:\MATLAB7\bin\win32\mwcomutil.dll" <BR>DllRegisterServer in C:\MATLAB7\bin\win32\mwcomutil.dll succeeded <BR>--&gt; "C:\MATLAB7\bin\win32\mwregsvr C:\MATLAB7\bin\win32\mwcommgr.dll" <BR>DllRegisterServer in C:\MATLAB7\bin\win32\mwcommgr.dll succeeded<BR><BR>● Please choose your compiler for building external interface (MEX) files: <BR>Would you like mex to locate installed compilers [y]/n? y<BR><BR>● Select a compiler: <BR>[1] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio <BR>[2] Lcc C version 2.4 in C:\MATLAB7\sys\lcc <BR>[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio <BR>[0] None <BR>Compiler: 3<BR><BR>● Please verify your choices: <BR>Compiler: Microsoft Visual C/C++ 6.0 <BR>Location: C:\Program Files\Microsoft Visual Studio <BR>Are these correct?([y]/n): y<BR><BR>Try to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R14\mexopts.bat <BR>From template: C:\MATLAB7\BIN\WIN32\mexopts\msvc60opts.bat <BR><BR>Done . . .<BR><BR>2. 设置系统路径。我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量-&gt;Path选项,增加以下路径:<BR>头文件:<BR>C:\MATLAB7\extern\include;<BR>库:<BR>C:\MATLAB7\extern\lib\win32\microsoft\msvc60;<BR>DLL:<BR>C:\MATLAB7\bin\win32<BR><BR>3. 做一个简单的M函数(只能是函数不能是文件)。文件名和函数名一致。运行并测试此文件的正确性。<BR>function plot_test(result)<BR>plot(result); %画图<BR><BR>4. 在命令窗口敲comtool,出现com组件builder。选择FILE选项-&gt;New Project选项。出现以下界面。<BR><BR>Component name选项:设置com组件的名称,注意不要和上面添加的m文件重名。<BR>Class name选项:设置类名称。一般将鼠标点击空白位置,系统会自动生成类名。<BR>Project version选项:版本号。系统默认为1.0,将来要修改或添加其他函数时,可以修改此选项为2.0,3.0等。<BR>Project directory选项:工程所在目录。<BR>Complier options选项:编译器配置选项,全部选中。<BR>最后单击OK。系统会出现对话框,问你是否创立工程目录,你选YES。<BR><BR>5. 单击Project Files-&gt;plotclass-&gt;M-files,然后选中comtool菜单Project-&gt;Add File选项,添加上面写好的plot_test M函数,如下图:<BR><BR>当然,你可以添加更多的M或MEX函数。<BR><BR>6. 单击Build按钮,选中Com Object选项,这时com-builder会帮你自动编译连接该组件,生成所需要的头文件,源文件,接口描述文件,动态连接库文件,等等。在右侧Build Status显示框里给出了编译的过程和信息。在菜单Component-&gt;Component Info里有关于接口、类、库的信息。在C:\MATLAB7\work\plot文件夹里,出现了两个子文件夹,distrib和src,这是我们VC中需要用到的文件、库、资源、接口等。在src-&gt; plot_idl_i.c中,有关于com类和com接口的GUID。其中CLSID(类的GUID)在VC编程中需要用到。<BR><BR>7. 打开VC++编译器,选择文件-&gt;新建-&gt;工程-&gt;MFC(exe)-&gt;命名(plot)-&gt;单文档-&gt;完成。我们在资源Toolbar里建立两个按钮,一个用于启动COM(OLE),获得接口指针;另一个用于调用绘图(plot_test)命令。用查看-&gt;类向导建立,在CplotView类里建立command消息映射。<BR><BR>8. 再次打开类向导,在 Add Class选项内,选中From a typed library,进入C:\MATLAB7\work\plot\src文件夹,选中plot_idl.tlb文件,点击打开&#61664;OK。<BR><BR>这时一个COM类便加入进来了,查看一下Iplotclass类。里面有些,我们想要的东东。<BR>9. 下面就是OLE调用的基本方法了,具体可以参见MSDN。<BR>首先在CplotApp类的InitInstance()里添加初始化OLE代码。<BR>BOOL suc=AfxOleInit(); // 初始化OLE<BR>if (suc==FALSE)<BR>{<BR>::AfxMessageBox("初始化OLE失败!");<BR>}<BR><BR>其次,在CplotView里包含plot_idl.h,math.h头文件,并定义常量PI;并从C:\MATLAB7\work\plot\src\plot_idl_i.c中拷贝类的GUID并复制到PlotView.h文件类定义的上面。<BR>#include "plot_idl.h"<BR>#include "math.h"<BR>#define PI 3.1415926535897<BR><BR>const CLSID CLSID_plotclass = {0xAED07AAF,0x3190,0x4996,{0xAD,0xD6,0x31,0xF9,0x45,0x41,0xB1,0xC5};<BR><BR>再次在构造函数CPlotView()的上面定义类全局对象;<BR>Iplotclass plot;<BR><BR>然后,OnStart()函数里添加获得COM指针的函数,代码如下:<BR>plot.CreateDispatch(CLSID_plotclass,NULL); //创立接口<BR>COleDispatchDriver(); //连接(此句可以不写)<BR><BR>然后,在OnPlot()函数里添加绘图代码,代码如下,这里关于VARIANT变量的用法说明请参照MSDN。<BR><BR>const int N=100; //数组大小<BR>double a[N]; //数组定义<BR>double f=50; //正弦信号频率<BR>double Ts=0.002; //采样时间<BR><BR>// 赋值<BR>for (int i=0; i&lt;N; i++)<BR>{<BR>a=sin(2*PI*f*i*Ts);<BR>}<BR><BR>//任意变量<BR>VARIANT x;<BR>VariantInit(&amp;x); //初始化<BR><BR>x.vt=VT_ARRAY|VT_R8; //类型(数组,双精度型)<BR><BR>SAFEARRAYBOUND rgsabound[1]; <BR>rgsabound[0].cElements=N; //数组所含元素数<BR>rgsabound[0].lLbound=0; //数组上界<BR><BR>//创立数组<BR>x.parray=SafeArrayCreate(VT_R8,1,rgsabound); //创立一维数组<BR><BR>//锁定数组<BR>SafeArrayLock(x.parray);<BR><BR>//数组传递数据<BR>x.parray-&gt;pvData=a;<BR><BR><BR>//调用方法<BR>plot.plot_test(x); <BR><BR>//解锁<BR>SafeArrayUnlock(x.parray);<BR><BR>最后,在析构函数~CPlotView()里添加释放接口和资源的代码。<BR>plot.DetachDispatch();<BR><BR>10. 测试。先按绿色按钮,初始化OLE和接口,再按红色按钮绘图。注意,开始绿色按扭,比较慢,因为要载入很多DLL,后面红色按钮就快多了,并且第二次执行会更快。现在是不是感到很爽呢?别急,还有最后一步打包发布。还要注意的是,最好再做个程序,防止多次按下绿色按扭,否则会有错误。当关闭窗口时,所有载入的资源会自动释放。<BR><BR>11. 打包。再次打开,原来的工程文件*.cbl,注意在前面过程中一定要保存。(matlab会有提示)。然后选择Component-&gt;Package Component,系统就会自己帮你打包了。出现如下图,选中Include MCR,点击Create选项。慢慢等吧。<BR><BR>打包完毕后,在C:\MATLAB7\work\plot\distrib文件夹下,有plot可执行文件。拷贝C:\MATLAB7\work\plot文件夹下所有文件,在另外一个机器上,双击plot可执行程序,注册com组件,就完成了最后的工作。你的程序,就可以在其他机器上执行了。(这一点,还值得研究,能否自己打包,不用matlab工具呢?plot的执行界面是基于DOS的,很丑)。<BR><BR>备注:comtool工具6.5版本后才有,所以那些老版本的朋友们只有望com而心憾了。<BR>
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-20 11:43 , Processed in 0.060172 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表