您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > VC编译器使用Matlab_Com组件的方法
本文根据作者亲自在VISUALC++6.0编译器环境下,实现了MATLAB中COM组件的开发而写成。此方法的实现是在网上各位前辈的基础上完成的。现在,就具体谈一下怎么把一个M文件或MEX文件,做成可以脱离MATLAB环境的COM组件,并且被VC++调用。1.首先,设置合适的编译器。在MATLAB命令窗口里敲:mbuild–setup和mex–setup,完成编译器的设置。●PleasechooseyourcompilerforbuildingstandaloneMATLABapplications:Wouldyoulikembuildtolocateinstalledcompilers[y]/n?y●Selectacompiler:[1]LccCversion2.4inC:\MATLAB7\sys\lcc[2]MicrosoftVisualC/C++version6.0inC:\ProgramFiles\MicrosoftVisualStudio[0]NoneCompiler:2●Pleaseverifyyourchoices:Compiler:MicrosoftVisualC/C++6.0Location:C:\ProgramFiles\MicrosoftVisualStudioArethesecorrect?([y]/n):y●Trytoupdateoptionsfile:C:\DocumentsandSettings\Administrator\ApplicationData\MathWorks\MATLAB\R14\compopts.batFromtemplate:C:\MATLAB7\BIN\WIN32\mbuildopts\msvc60compp.batDone...--C:\MATLAB7\bin\win32\mwregsvrC:\MATLAB7\bin\win32\mwcomutil.dllDllRegisterServerinC:\MATLAB7\bin\win32\mwcomutil.dllsucceeded--C:\MATLAB7\bin\win32\mwregsvrC:\MATLAB7\bin\win32\mwcommgr.dllDllRegisterServerinC:\MATLAB7\bin\win32\mwcommgr.dllsucceeded●Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?y●Selectacompiler:[1]DigitalVisualFortranversion6.0inC:\ProgramFiles\MicrosoftVisualStudio[2]LccCversion2.4inC:\MATLAB7\sys\lcc[3]MicrosoftVisualC/C++version6.0inC:\ProgramFiles\MicrosoftVisualStudio[0]NoneCompiler:3●Pleaseverifyyourchoices:Compiler:MicrosoftVisualC/C++6.0Location:C:\ProgramFiles\MicrosoftVisualStudioArethesecorrect?([y]/n):yTrytoupdateoptionsfile:C:\DocumentsandSettings\Administrator\ApplicationData\MathWorks\MATLAB\R14\mexopts.batFromtemplate:C:\MATLAB7\BIN\WIN32\mexopts\msvc60opts.batDone...2.设置系统路径。我的电脑-属性-高级-环境变量-系统变量-Path选项,增加以下路径:头文件:C:\MATLAB7\extern\include;库:C:\MATLAB7\extern\lib\win32\microsoft\msvc60;DLL:C:\MATLAB7\bin\win323.做一个简单的M函数(只能是函数不能是文件)。文件名和函数名一致。运行并测试此文件的正确性。functionplot_test(result)plot(result);%画图4.在命令窗口敲comtool,出现com组件builder。选择FILE选项-NewProject选项。出现以下界面。Componentname选项:设置com组件的名称,注意不要和上面添加的m文件重名。Classname选项:设置类名称。一般将鼠标点击空白位置,系统会自动生成类名。Projectversion选项:版本号。系统默认为1.0,将来要修改或添加其他函数时,可以修改此选项为2.0,3.0等。Projectdirectory选项:工程所在目录。Complieroptions选项:编译器配置选项,全部选中。最后单击OK。系统会出现对话框,问你是否创立工程目录,你选YES。5.单击ProjectFiles-plotclass-M-files,然后选中comtool菜单Project-AddFile选项,添加上面写好的plot_testM函数,如下图:当然,你可以添加更多的M或MEX函数。6.单击Build按钮,选中ComObject选项,这时com-builder会帮你自动编译连接该组件,生成所需要的头文件,源文件,接口描述文件,动态连接库文件,等等。在右侧BuildStatus显示框里给出了编译的过程和信息。在菜单Component-ComponentInfo里有关于接口、类、库的信息。在C:\MATLAB7\work\plot文件夹里,出现了两个子文件夹,distrib和src,这是我们VC中需要用到的文件、库、资源、接口等。在src-plot_idl_i.c中,有关于com类和com接口的GUID。其中CLSID(类的GUID)在VC编程中需要用到。7.打开VC++编译器,选择文件-新建-工程-MFC(exe)-命名(plot)-单文档-完成。我们在资源Toolbar里建立两个按钮,一个用于启动COM(OLE),获得接口指针;另一个用于调用绘图(plot_test)命令。用查看-类向导建立,在CplotView类里建立command消息映射。8.再次打开类向导,在AddClass选项内,选中Fromatypedlibrary,进入C:\MATLAB7\work\plot\src文件夹,选中plot_idl.tlb文件,点击打开OK。这时一个COM类便加入进来了,查看一下Iplotclass类。里面有些,我们想要的东东。9.下面就是OLE调用的基本方法了,具体可以参见MSDN。首先在CplotApp类的InitInstance()里添加初始化OLE代码。BOOLsuc=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文件类定义的上面。#includeplot_idl.h#includemath.h#definePI3.1415926535897constCLSIDCLSID_plotclass={0xAED07AAF,0x3190,0x4996,{0xAD,0xD6,0x31,0xF9,0x45,0x41,0xB1,0xC5};再次在构造函数CPlotView()的上面定义类全局对象;Iplotclassplot;然后,OnStart()函数里添加获得COM指针的函数,代码如下:plot.CreateDispatch(CLSID_plotclass,NULL);//创立接口COleDispatchDriver();//连接(此句可以不写)然后,在OnPlot()函数里添加绘图代码,代码如下,这里关于VARIANT变量的用法说明请参照MSDN。constintN=100;//数组大小doublea[N];//数组定义doublef=50;//正弦信号频率doubleTs=0.002;//采样时间//赋值for(inti=0;iN;i++){a[i]=sin(2*PI*f*i*Ts);}//任意变量VARIANTx;VariantInit(&x);//初始化x.vt=VT_ARRAY|VT_R8;//类型(数组,双精度型)SAFEARRAYBOUNDrgsabound[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()里添加释放接口和资源的代码。plot.DetachDispatch();10.测试。先按绿色按钮,初始化OLE和接口,再按红色按钮绘图。注意,开始绿色按扭,比较慢,因为要载入很多DLL,后面红色按钮就快多了,并且第二次执行会更快。现在是不是感到很爽呢?别急,还有最后一步打包发布。还要注意的是,最好再做个程序,防止多次按下绿色按扭,否则会有错误。当关闭窗口时,所有载入的资源会自动释放。11.打包。再次打开,原来的工程文件*.cbl,注意在前面过程中一定要保存。(matlab会有提示)。然后选择Component-PackageComponent,系统就会自己帮你打包了。出现如下图,选中IncludeMCR,点击Create选项。慢慢等吧。打包完毕后,在C:\MATLAB7\work\plot\distrib文件夹下,有plot可执行文件。拷贝C:\MATLAB7\work\plot文件夹下所有文件,在另外一个机器上,双击plot可执行程序,注册com组件,就完成了最后的工作。你的程序,就可以在其他机器上执行了。(这一点,还值得研究,能否自己打包,不用matlab工具呢?plot的执行界面是基于DOS的,很丑)。备注:comtool工具6.5版本后才有,所以那些老版本的朋友们只有望com而心憾了。我的联系方式:gjsdgjsd@sohu.com我的OICQ:53913555
本文标题:VC编译器使用Matlab_Com组件的方法
链接地址:https://www.777doc.com/doc-2854542 .html