资源描述:
《详细讲解基于COM组件的VC和MATLAB混合编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、基于com组件的VC和MATLAB混合编程一、MATLAB下做COM组件由于MATLAB的编译器只能对函数M文件进行编译,所以如果原来的程序是脚本程序应改写成函数形式。同一个M文件还可以包含多个函数,此时将出现在文件中的第一个M函数称为主函数,其余的函数称为子函数,M函数文件的名称一般与主函数的名称保持一致,其它函数都必须按照函数的基本结构来书写,例如建立一个M函数文件function[a]=msadd(x,y)a=x+y;保存文件名为msadd.m在MATLAB命令行中输入deploytool命令启动MATLABComBuilder图形用户界面,在其文件菜单中选择F
2、ile->NewProject点击最左上角新建一个工程:注意:工程保存路径最好在硬盘一级目录下,工程名尽量简单,不要超过8个字母。新建一个M3add的工程在D盘下系统生成一个M3add.prj的文件和一个名为M3add的文件夹工程建好后,系统自动生成一个与工程名相同的类,下图中为M3add的文件夹,这个文件夹经编译后,导入VC就是一个类,注意:这里要把与工程名相同的类删除再增加一个不同名的类,或改名,总之工程名与类名不能相同,否则导入VC后,最后编译时会报错,overload之类的。这里新增加了一个M4add类,在这个类下面增加m函数文件。注意:如果是神经网络,则只能
3、是训练好的神经网络。函数中最好不要用图形显示的语句。图形显示和VC的交互更加复杂,这里暂不讨论。然后编译:编译完成后,关闭Matlab。Matlab的工作到此完成。二、设置VC++1、准备文件:(1)如果未曾对mwcomutil.dll进行过注册,在系统开始->运行中输入cmd,则进入DOS在Dos状态下输入regsvr32mwcomutil.dll对其进行注册,mwcomutil.dll在/bin/win32下。(2)打开VC++编译器,点击:工具→ole/comobjectviewer,在弹出对话框左边列表中找到MATLABCOMBuilder
4、Components并展开,找到“M4add”,这里出现的是类名再点右键,选择ViewTypeInformation,便又弹出一窗口,点工具栏上的save按钮,分别将它保存为M3add_1_0.h和M3add_1_0.c。注意:应保存在默认的目录下,如果默认的目录文件夹路径过于复杂或名称太长有可能不能存这个两文件。(3)新建一个基于对话框的VC工程名为:Vc2add拷贝以下几个文件到Vc2add目录。设置Vc,现在需对PrecompiledHeaders进行设置:工程→设置→c/c++→Y分类中选择PrecompiledHeaders,接着选择M自动使用与补偿页眉,在
5、其中填写stdafx.h,最后确定。并将M3add_1_0.c、M3add_1_0.h和mwcomutil.h添加进工程,Project→AddToProject→Files分别生成_IID、IM4add和IMWUtil三个类,其中M4add类正是要操作的类。在对话框的文件头中加入以下内容://#import"mwcomutil.dll"#import"M3add_1_0.dll"#include"mwcomutil.h"#include"M3add_1_0.h"#include"comutil.h"在按钮单击响应事件中添加代码voidCVc2addDlg::OnBu
6、tton1(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);//更新,把输入框中的值更新到变量中if(FAILED(CoInitialize(NULL)))//初始化调用com{AfxMessageBox("unabletoinitializeCOM");return;}//得到COM对象的CLSIDCLSIDCLSID_M4add;HRESULThr;hr=CLSIDFromProgID(L"m3add.m4add",&CLSID_M4add);//创建一个COM对象的实例IM4a
7、dd*st=NULL;hr=CoCreateInstance(CLSID_M4add,NULL,CLSCTX_ALL,IID_IM4add,(void**)&st);//定义参数,与com件交互只能用VARIANT类型数据VARIANTA,x,y;//初始化,一定要初始化不然报错VariantInit(&A);VariantInit(&x);VariantInit(&y);x.vt=VT_R8;x.dblVal=m_x;y.vt=VT_R8;y.dblVal=m_y;//调用MATLAB中的函数if(st!=NULL){//调用COM组件,第一个参数