【VC++开源代码栏目提醒】:网学会员为需要VC++开源代码的朋友们搜集整理了基于COM组件的Matlab7_x与VC_6_0接口技术及实际应用 - 技术总结相关资料,希望对各位网友有所帮助!
第26卷第2期 计算机应用与软件Vol126No.22009年2月 ComputerApplicationsandSoftwareFeb.2009基于COM组件的Matlab7.x与
VC6.0接口技术及实际应用李 芳 徐 丽长安大学信息工程学院 陕西西安710064收稿日期:2007-08-22。
李芳讲师主研领域:数据库应用技术人机交互技术操作系统应用技术。
摘 要 介绍了MATLAB7.x与
VC6.0四种接口方法分析比较了各种方法的优缺点。
在此基础上着重研究了基于COM组件的接口技术详细阐述了利用COM组件进行接口的配置、步骤和方法。
使用此接口技术完成了某数值仿真平台的实例开发较好地实现了Matlab7.x强大的计算功能与
VC6.0卓越的可视化功能的高效结合大大提高了数值仿真软件的开发效率。
关键词 MATLAB
VC6.0 COM 接口ONTECHNOLOGYOFINTERFACEBETWEENMALTAB7.XANDVC6.0BASEDONCOMANDITSACTUALAPPLICATIONLiFang XuLiSchoolofInformationChang’anUniversityXi’an710064ShaanxiChinaAbstract FourmethodsfortheinterfacebetweenMATLAB7.xandVC6.0areintroducedandtheiradvantagesanddisadvantagesareanalyzed.TheinterfacetechnologybasedonCOMisstudiedspeciallyandtheapproachesofconfigurationandproceduresforthisinterfacearepresentedindetail.Certainnumericalsimulationsoftwareisdevelopedwiththisinterfacetechnology.Theresearchresultsshowthatthepower2fulcalculationabilityofMATLAB7.xandexcellentvisualfunctionofVC6.0canbeperfectlycombinedtodevelopefficientlythesimula2tionsoftwarewiththisinterfacetechnology.Keywords MATLAB
VC6.0 COM Interface0 引 言Matlab是美国Mathworks公司开发和发行的一个软件产品。
它是一个交互式的开发系统在矩阵运算、二维和三维图形的绘制、数值拟合等方面具有极强的功能它提供了全面的工具箱函数以及相关专业的函数集合可以让开发者大大缩短仿真周期。
但是Matlab的M
代码是解释性执行的程序执行效率低不利于大规模的数值计算和分析。
另外其执行不能脱离Matlab运行环境因此不适于开发大型软件。
VC是微软公司开发的一个功能强大的开发平台它采用面向对象的编程技术与其他开发工具相结合已经形成一个无所不包的开发工具套件。
但在数据分析处理和算法工具方面使用
VC远没有使用Matlab方便。
因此将
VC与Matlab结合充分发挥各自的优势可以大大改善应用系统本身的性能提高开发效率缩短开发周期。
1 Matlab与
VC接口方式分析Matlab提供了多种与
VC的接口方式其主要有:1利用Matlab引擎。
Matlab引擎采用客户/服务器计算方式在运行中将C或C语言的程序作为前端客户机向Matlab引擎传递命令和数据信息并从Matlab引擎接收数据信息Matlab作为服务器在后台完成复杂矩阵运算和工具箱所支持的模块。
它提供了engOpen、engGetArray、engPutArray、engEva2String、engOutBuffer及engClose等函数与客户机进行交互。
但这种接口方式脱离不了Matlab的运行环境。
2利用Matlab自身的编译器mcc生成可编译的C或C源
代码。
这样可以完全脱离Matlab的运行环境。
但Matlab自带的mcc编译器存在很多不足之处如转换的
代码可读性不太好不支持图形函数而且编译器只能编译一个独立的M文件即这个M文件不依赖与其它的M文件。
3利用Matcom调用工具箱中的函数。
Matcom是Math2Tools公司开发的为Matlab中的M文件进行高效解释和调试的集成开发环境。
相对于Matlab自带的编译器用Matcom转化
代码要简单和方便得多并且它支持图形函数支持文件编译过程中的文件嵌套情况。
但Matcom对图形函数的支持并不完善部分绘图语句无法实现尤其是三维图形。
4利用Matlab中的Comtool编译器生成Com组件。
组件对象模型简称COM是Windows对象的二进制标准为Win2dows提供了统一的、面向对象的、可扩充的通信协议即使编写对象的语言不同对象之间也可以利用COM标准进行通信。
Matlab的COM编译器是从MATLAB6.5开始提供的在MAT2LAB7.x中得到了完善。
它几乎支持Matlab的所有函数特别是对图形图像的支持相当完善。
利用这种接口方式程序可以脱离Matlab运行环境能够在没有安装Matlab的机器上运行。
通过以上分析比较可以看出利用COM组件进行接口能够 132 计算机应用与软件2009年充分发挥
VC与Matlab各自的优势适合软件的开发应用。
2 基于COM组件的接口技术2.1 MatlabCOM编译器的安装及配置MatlabCOM编译器是个独立的产品。
它既可和Matlab同时安装也可以分开安装。
由于MatlabCOM编译器需要借助Matlab编译器把M程序转换成C/C
代码同时还需要外部的C/C编译器所以在使用MatlabCOM编译器之前必须确保已经安装了Matlab编译器和C/C编译器。
只有相应的编译器都已安装及配置成功MatlabCOM编译器才可使用而不需要特别的设置。
2.2 使用MatlabCOM编译器创建COM组件MatlabCOM编译器是Matlab编译器的一个扩展它只能在Matlab命令环境中使用相应的命令是comtool它是一个图形界面Matlab工具。
使用comtool编译COM组件的过程包括四个步骤下面结合某仿真平台开发为例进行说明:1创建工程。
点击File-NewProject创建一个新的工程设置Componentname本例设置为pelsimula移除默认的Classname可将其设置为ejection在Projectversion文本框设置组件的版本号默认组件版本号为1.0不变Projectdirectory指定在编译和打包模型时工程和相关文件存放的位置本例设置路径为D:MATLAB71、work、pelsimula。
设置完成后点击OK按钮。
2向工程添加M文件。
选择ProjectFiles文件夹点击AddFile命令添加M文件。
根据需要可以逐个添加多个M文件如本例分别添加了loadpellet.m、qinche.m等文件。
3编译工程。
选择Build-COMObject命令编译当前工程编译过程产生的信息将会被显示在comtool界面右边的文本信息窗口中。
这个步骤不仅编译了COM组件同时也在计算机上注册了该组件这样它就可以和普通的COM组件一样在其它程序中使用。
4打包和发布COM组件。
编译结束后产生的COM组件只能在当前计算机上使用COM组件不同于普通的DLL文件必须经过注册后才能在计算机上使用。
选择Component-Pack2agecomponent命令单击Create按钮进行打包comtool会把发布该组件所需的所有文件打包到一个和工程同名的可执行文件中。
MATLAB7.x产生的COM组件必须运行在MCR环境中因此打包组件的时候最好选择包含MCR这样在打包文件中就会包含MCR安装文件。
此例中打包结果将产生名为pelsimula.exe的可执行文件将此文件复制到目标计算机上运行便会运行MCRInstaller.exe来安装MCR并且在系统中注册该组件。
2.3 在
VC中调用COM组件本例建立了一个基于Dialog的工程Simula编程环境为
VC6.0。
其为一个数字仿真平台主要功能是实现在工程Simula中输入数据交由COM组件运算然后将结果返回给Simula其中包含大量的二维、三维数据曲线图像。
在工程Sim2ula中调用COM组件可分为以下步骤:1找到2.2节Projectdirectory路径下的SCR文件夹将mwcomtypes.h、pelsimula_idl.h、pelsimula_idl_i.c文件复制到工程Simula所在目录下。
2在工程Simula中选择命令Project-AddToProject-Files选择工程Simula目录下的mwcomtypes.h、pelsimula_idl.h、pelsimula_idl_i.c三个文件单击OK按钮将此三个文件添加到工程中去。
添加成功后在ClassView中多出了很多结构体和类如类Iejection。
此时COM组件的各种信息便被包含到工程Simula中。
3加入头文件。
以工程中的子块CDlgTerminal为例将mwcomtypes.h、pelsimula_idl.h、pelsimula_idl_i.c三个文件分别包含在头文件中:includestdafx.hincludeSimula.hincludeDlgTerminal.hincludemwcomtypes.hincludepelsimula_idl_i.cincludepelsimula_idl.hincludeDataconvert.h4编写调用
代码。
为响应“运行”按钮调用COM组件进行计算其响应函数为OnTerrun将此函数的关键
代码整理如下:voidCDlgTerminal::OnTerrun //TODO:Addcontrolnotificationhandlercodehere …… ifFAILEDCoInitializeNULL //COM初始化 MessageBoxCOM初始化失败Iejection3myIejectionNULLHRESULThrltCoCreateInstanceCLSID_ejectionNULLCLSCTX_ALLIID_Iejectionvoid33myIejectionifSUCCEEDEDhrlt longintu7 VARIANTm_outvlast1m_outlastim_outblast m_outslastm_outlastxqianm_outlastyqian m_outmaxym_vinllom_vinmm_vinE m_vinp0m_vinTm_vinr0m_vinz0m_vinzz m_vinlom_vinvm_vinIm_vinbchu m_vinschum_vinrr0m_vinrr //定义输入输出参数类型为结构体VARIANT VariantInitm_outvlast1 //初始化输出结构体参数 …… m_outvlast1.vtVT_R8 //定义输出结构体参数中的数据类型为double型 m_outvlast1.dblVal0 …… VariantInitm_vinllo //初始化输入结构体参数 …… m_vinllo.vtVT_R8 m_vinllo.dblValm_inllo …… HRESULThrlt1myIejection-qincheu m_outvlast1m_outlastim_outblast m_outslastm_outlastxqianm_outlastyqian m_outmaxym_vinllom_vinmm_vinE m_vinp0m_vinTm_vinr0m_vinz0m_vinzz 第2期 李芳等:基于COM组件的Matlab7.x与
VC6.0接口技术及实际应用133 m_vinlom_vinvm_vinIm_vinbchum_vinschu m_vinrr0m_vinrr//函数调用 ifSUCCEEDEDhrlt1 Invalidate MessageBox请输入正确数据 return //函数调用失败 ifSUCCEEDEDhrlt1 m_vlast1m_outvlast1.dblVal //将输出参数由VARIANT结构体形式转换到为 double变量m_vlast1中 …… VariantClearm_outvlast1 ……else MessageBoxCOM组件调用失败提示MB_ICONHAND exit0//COM组件调用失败 myIejection-Release ifmyIejectionNULL myIejectionNULL CoUninitialize//结束COM UpdateDataFALSE Invalidate由类Iejection可以看出它包含了五个接口函数gailv、loadpellet、luodian、pssudu、qinche。
各函数的第一个参数为输出参数的个数参数的数据类型为long型。
接下来数据结构类型为VARIANT3的参数为输出参数数据结构类型为VARIANT的参数为输入参数。
由于MATLAB程序中默认的数据类型均为double类型因此在函数调用过程中必须将参数作一个转化。
首先看VARIANT结构体:typedefstructtagVARIANT VARTYPEvt …… union unsignedcharbVal//VT_UI1 shortiVal//VT_I2 longlVal//VT_I4 floatfltVal//VT_R4 doubledblVal//VT_R8 …… SAFEARRAYFAR3parray//VT_ARRAY3 …… VAIRIANT结构体中的vt控制着union的数据类型在函数OnTerrun中它为VT_R8类型即82byte实数与double类型一致。
根据vt的设置union结构中其对应的参数dblVal。
若结构体对象作为输出参数dblVal可以不作设置若为输入参数dblVal设置为输入值。
以上为单个数据传递设置。
若传递的参数为数组或矩阵则可将vt设置为VT_ARRAYVT_R8在union结构中其对应参数为pparray它为SAFEAR2RAYFAR3类型。
则对应的
代码可作如下调整:……VariantInitm_outvlast1//初始化输出结构体参数SAFEARRAYBOUNDsfarybound1sfarybound1.lLbound0sfarybound1.cElements100//定义输出数组元素个数m_outvlast1.vtVT_R8VT_ARRAYm_outvlast1.parraySafeArrayCreateVT_R81sfarybound1……VariantInitm_vinllo//初始化输出结构体参数SAFEARRAYBOUNDsfarybound2sfarybound2.lLbound0sfarybound2.cElements100//定义输入数组元素个数m_vinllo.vtVT_R8VT_ARRAYm_vinllo.parraySafeArrayCreateVT_R81sfarybound2m_vinllo.parray-pvDatam_inllo//将初始数组m_inllo的值传递给结构体m_vinllo……ifSUCCEEDEDhrlt1 memmovem_vlast1 m_outvlast1.parray-pvData783sizeofdouble //将VARIANT型结果数据复制到double型 m_vlast1中 ……这里参数m_inllo为一维数组元素个数为100将其赋给结构体对象m_vinllo作为输入参数。
在Matlab程序中函数的返回值也是元素个数为100的一维数组。
在Simula工程中定义了数组m_vlast1通过memmove函数将COM组件返回的数据结果复制到此数组中并在文本窗口显示出来。
函数SafeAr2rayCreate共有三个参数第一个参数定义了vt的类型为VT_R8第二个参数定义了数组的维数这里是一维数组值就为1第三个参数为一个指针类型为SAFEARRRAYBOUNDFAR3函数返回值是指向SAFEARRAY结构体的描述符。
5设置预编译头文件。
选择Project-Settings命令弹出ProjectSettings对话框选择C/C页在组合框Category中选择PrecompiledHeaders项选定Automaticuseofprecompiledheaders单选按钮可顺利进行编译。
2.4 运行结果本例的数字仿真平台分为四个部分。
在菜单项中选择一个部分弹出对话框可在其中的文本框中输入初始参数点击“运行”按钮调用COM组件进行运算计算完成后返回结果数据和参数曲线图如图1所示。
数据的计算在COM组件中完成后返回给Simula工程在
VC中可以进一步对数据结果进行处理例如可将其应用到视景仿真上面在
VC环境下运用OpenGL编程将研究对象的运动数据与三维动画结合起来模 134 计算机应用与软件2009年拟实际运动情况。
图1 数字仿真平台界面及图形显示窗口通过以上方法可以实现在没有安装Matlab的计算机上使用Matlab语言编写的程序。
只需将可执行文件pelsimula.exe与程序Simula.exe一起复制到目标计算机上运行pelsimula.exe进行安装和注册COM组件后程序便可以执行。
pelsimula.exe的大小不足百兆所以这在软件的开发和应用方面相当方便。
3 结束语实现Matlab与
VC接口的方法较多但大都存在着局限性特别是对于发挥Matlab的功能和应用
VC开发实用软件方面。
自从Matlab7.x推出以后增加了很多新的功能大大提高了编译器的性能。
应用Matlab的COM组件生成器可实现Matlab与
VC比较完美的结合。
它一方面利用了
VC开发实用软件的良好性能另一方面充分利用了Matlab强大的计算能力与数据可视化功能。
从文章的分析比较及实例应用可以得出基于COM组件Matlab与
VC的混合编程有如下特点:1可脱离Matlab运行环境。
2充分利用了Matlab的各项功能。
3程序可移植性强。
当然也存在不足首先是COM组件初始化时间较长其次它对Matlab图形图像的支持能力不是非常完善部分功能还无法实现例如对返回图像的编辑能力没有在Matlab环境下全面。
参考文献1董维国.深入浅出MATLAB7.x混合编程M.北京:机械工业出版社2005.2飞思科技产品研发中心.MATLAB7基础与提高M.北京:电子工业出版社2005.3陈永超李汉强.MATLAB7.0与
VC6.0的接口技术J.电脑知识与技术20061:129130.上接第106页图4 Web服务器的MBean部署图图5 数据库服务器的MBean部署图3.3 Gateway层Gateway层使用了MUWS技术WSDMManagerUsingWebServices。
设计Gateway层使得SOAM系统更具有通用性。
无论底层被管理资源是否使用JMX技术实现的都可以经过Gateway层转换成通用的WSDM类型的资源。
3.4 Manager层Manager层使用了CIMOMCIMObjectManager技术它是建立目标系统这里是指五台服务器的物理模型实现对Gateway层SOAP消息的解析。
同时Manager层为管理者提供操作界面。
CIM指通用信息管理模型。
3.5 SOAM系统的性能分析通过测试这个系统发现对于CPU的使用率、主存的使用率、当前访问数、平均响应时间、当前连接数等五个属性值订阅合适的高、低阈值就能很好地监控服务。
使用该管理系统对原有提供搜书的服务系统增加的额外负载很低。
图6显示了服务启动时CPU的使用率的变化。
正常情况下CPU的使用率约为35。
图6 cpu的使用率变化图IBM、HP等公司都推出Web服务管理工具支持WSDM标准。
本文提出的SOAM系统的三种架构实现对服务器和服务同时进行监控管理。
采用的是
开源的JMX技术提供被管理资源的信息非常适合中小企业开发管理系统开发成本低廉并且上层提供通用的WSDM接口具有较好的可移植性和扩展性。
4 结束语本文给出了一种基于JMX技术实现SOAM系统的三层模型架构和实现方法采用这种架构可以提供对服务器和服务的有效管理。
参 考 文 献1吴家菊刘刚席传裕.基于Web服务的面向服务SOA架构研究.现代电子技术200514.2BenjamingSullins.JMXINACTION.2003:218.3HPDevResourceCentral.DesignPatternsforJMXandApplicationManageability.2004.4ChrisPeltz.http://www.fawcette.com/javapro/2005_01/magazine/features/cpeltz/.5http://www.itisedu.com/phrase/200604261751455.html.6http://tag.csdn.net/Article/409114e92b94224eff2b63d2c0fd1fe41db1.ht2ml.
上一篇:
基于开源平台的地籍管理信息系统及其实现
下一篇:
致享和威驰哪个好点?冲着安全和空间 推荐致享