matlab封装DLL混合编程总结
最近做了个项目要用到matlab做些算法处理,然后用.net项目调用这个类,我把这个matlab封装dll总结了下如下:
matlab是商业数学软件,优势是在算法开发上面有很强的功能,提供了很多数学算法巩使用者调用比一般编程语言更容易处理复杂算法问题,而且处理算法有并行处理能力,速度上比一边编程语言也快很多.
基于组件对象模型(Component Object Model,COM)的Matlab与其他语言混合编程方法。它以Matlab中的Matlab COM Builder模块为转换工具,将Matlab的M函数文件转换为COM组件后应用在VB程序中。
1.VB与其他语言混合编程的几种方法
(1) 在Mathworks公司推出Matlab 6.5之前,Matlab与VB的混合编程主要有以下5种“1:(1) 中间文件传递法。用VB编写前端用户交互界面,收集必要的参数信息,并保存在一个中间文件(如temp.tx0中,然后利用异步程序调用方式执行Matlab程序;
(2) ActiveX自动化服务技术。将Matlab作为服务器,接收通过引擎传来的数据和指令信息并进行相应的处理,然后将结果经过引擎返回给发送请求的客户机;
(3) 动态数据交换(DDE)。它是进程之间的通信机制,使用Windows消息和共享的内存,使相互作用的应用程序能够动态地交换数据;
(4) 动态连接库(DLL)。应用MathTools公司的Mideva工具软件,借用C++编译器将MATLAB的M函数文件转换为DLL,在VB中加载该DLL;
(5) MatrixVB。它是Mathworks公司相应于Matlab而开发的COM库,在安装MatrixVB后,开发VB程序时可以直接调用600多条Matlab中的基本函数,从而完成Matlab的矩阵运算和图形显示功能。
在上述5种方法中,前3种方法调用过程较复杂,且无法脱离Matlab环境,这直接影响了所开发软件的独立运行和发布。后两种方法虽然能够脱离Matlab环境,但Mideva和MatrixVB软件已停止发行。
为解决与其它应用程序之间的接口问题,Mathworks公司在其2002年推出的Matlab6.5中新增了MatlabCOMBuilder模块,它提供了一个简单易用的图形化用户界面,帮助用户将Matlab的M函数文件自动、快速地转变为独立的进程内COM组件,它以.DLL(ActiveX DLL)形式被装入到客户的进程空间中,可以在任何支持COM组件的应用中使用,例如Visual Ba sic、c#,Microsoft Excel、C/C++语言等。其优点在于VB访问该COM组件时,没有必要进行环境切换,因此可获得最快的运行速度。
2.开发环境配置(Matlab7.11+vs2010+windows7)
(1) 在Matlab中创建COM组件Matlab COM Builder是Matlab Compiler的扩展,安装Mat1ab7.11时至少需要选择Matlab、MatlabCompiler和MatlabCOMBuilder等选项。
(2) 在使用COMBuilder创建COM组件之前还需要对Matlab Compiler进行必要的配置。方法如下:在Matlab命令窗中键入mbuild -setup,将出现选择编译器的提问,所列出的编译器包括计算机中已安装的各种C/C++编译器,例如Matlab自带的C/C++编译器、BorlandC++Builder4、BoflandC++Builder5、Borland C++Builder 6、Microsoft Visual Studio 5.0、MicrosoftVisualStudi06.0、MicrosoftVisualStudio.NET等,用户可根据需要自行选择其中一种并确认即可。如下图运行界面:
(3) 使用matlab7.11自带工具,命令窗口键入deploytool,回车后出现对话框,选择路径,新建一个COM工程,target选择为”Generic COM component”
3. COM组件的创建
安装和配置完成之后,就可在刚生成的工程中创建COM组件
具体过程如下:
<1> 编写M函数文件。在M函数文件中,给出要求Matlab完成的功能,函数文件能够接收参数,也允许返回参数。另外需注意:M函数文件的文件名必须和函数名一致;且COM Builder并不是支持所有的Matlab函数,如某些工具箱函数,具体限制可参阅 Matlab Compiler users Guide;
<2> 单击“add Class”创建类
<3> 单击“AddFile”按钮,添加已经在Matlab环境下编译通过的M函数文件;
<4> 单击“Build”按钮。待编译完成、生成DLL文件,至此,用户编写的M函数文件已转换为COM组件对象。
<5> 将创建成功的COM组件注册到使用它的目标计算机上,且目标计算机要安装MCR。方法如下: 点击package,点击“ADD MCR”把运行环境打包
4.目标计算机以管理员身份安装上面生成的安装包,默认路径安装。安装过程会自动在目标计算机安装matlab运行环境和注册之前生成的DLL。
5.然后VB工程中就可以添加引用,找到和使用之前生成的COM组件。
6.编写程序代码,调用Matlab中的类和函数
PS:遇到的问题:
1.调用类的时候可以编译但运行的时候出现这个错误“检索 COM 类工厂中 CLSID 为 {8E813545-D35B-4F2B-A27A-C0FFA0430223} 的组件失败,原因是出现以下错误: 80040111 ClassFactory 无法供应请求的类 (异常来自 HRESULT:0x80040111 (CLASS_E_CLASSNOTAVAILABLE))。”,解决办法将matlab 的bin目录拷贝到path环境变量里,然后重启下机器就OK了.
2.出现“未能确定Com引用的依赖项,加载类型库出错”的异常,原因为matlab库中“C:\Program Files\MATLAB\MATLAB Compiler Runtime\v714\runtime\win32\MWComUtil”需要注册.
3.用VS调用函数的时候,如果matlab里面函数需要一个参数,调用的时候就要写三个参数,第一个是空值,第二个是返回值,第三个传进去的值.