📄 matlab builder for.net .txt
字号:
VC++调用Matlab Builder for.NET 的COM组件
作者:卞晓波
1.VC++与Matlab几种常用的集成方法
Matlab与VC++混合编程的具体方式有多种,根据Matlab是否运行可大致分为两类:Matlab在后台运行和可以脱离Matlab环境运行。Matlab 5.0以后版本均自带C/C++编译器,可将其程序文件(M文件)转换为C-MEX或C/C++程序。
第一种方式是Matlab引擎采用客户机/服务器的计算方式,通过Windows的ActivcX通道和Matlab接口。在具体的应用中,VC的程序作为前端客户机,通过调用Matlab引擎在后台与Matlab服务器建立连接,实现动态通信。这种方法实现较为简单,不要求连接整个Matlab,只需要嵌入必要的Matlab引擎库,可大大地节省系统资源,但这种Matlab在后台运行,运行效率低下。
第二种方式是使用Mathtools公司推出的Matlab集成编译开发平台Mideva,它提供了对M文件的解释执行和开发环境支持。经过简单设置后Mideva可以将M源文件转换为C/C++,然后添加到VC++工程中。 也可以先利用Mideva直接生成EXE文件(方法是启动Mideva,在菜单"File->Compile to exe"中, 选出需要转换的M文件),然后在VC++中通过shellexec()或winexec()等外部函数完成Shell调用。这种方法简单方便,但运行时出现一个控制台窗口,而且由于VC和Matlab之间不能交互,通用性差。
第三种方式是通过Mablat编译器将其m文件转换成为C/C++代码文件并生成必要的dll库后再通过VC++编译器生成可独立执行的应用程序,这种方式可以直接调用其中的库函数,生成并发布不必依赖Matlab的可执行文件。
第四种方式是通过Matlab Add-in实现Matlab与VC的混合编程。在Matlab 6.0以后版本对其编译器作了较大的改进,其支持更多的数据类型,更强的优化功能,更为重要的是其Matlab Add-in提供了一个Matlab和VC直接集成的途径。它具有一些新的特征:快速集成M文件到C++工程中,创建独立的 C/C++应用程序或C MEX DLL;通过M文件创建共享库或MEX文件;内含Visual Matrix Viewer,调试过程中可以查看矩阵变量的值; 直接修改M源文件而不是修改生成的C/C++文件;方便快捷地打包应用程序等。但是,这种方式仍然会有部分的Matlab函数库不能使其调用。
最后一种方法也是最新的用Matlab2007a下的Matlab Builder for .NET,这是最方便的也是本文下面将要使用的集成方式。
2.Matlab的COM Builder 使用方法
试验环境:Windows XP SP2, VC6.0++ SP6, Matlab2007a,
参考步骤:
2.1当然是先建立 matlab 的 m 文件。
我们先将一个图片放入F:\matlab2007code\bianxb文件夹下,命名为cat.jp再准备一个测试文件testpic.m,如图2.1:
图2.1
保存为testpic.m
2.2
2.2.1下面来对 matlab 编译环境进行设置。 打开matlab,在命令行状态下键入:
mbuild –setup
然后出现如下提示:
这里我们选择’2’。然后,继续在命令行状态下输入: y
然后出现如下提示:
2.2.2然后,在matlab的workspace下输入deploytool,就可以启动Deployment Tool。如图图2.2
图2.2
点击工具栏上的 菜单下的New Deployment Project新建一个MATLAB Builder for .NET中Generic COM Component,在Name中加入工程名:bian.prj,如图2.3所示:
图2.3
单击OK,如图图2.4
图2.4
2.2.3单击Deployment Tool上的 图标,选择加入的文件testpic.m可得如下图2.5:
图2.5
单击Add如图2.6:
图2.6
2.2.4单击Deployment Tool上的 图标,进行编译设置。如下图2.7:
图2.7
备注:如果要使生成的可执行文件在没有安装matlab的计算机上使用,还必须在目标计算机上安装MCR(matlab组件运行环境).可利zipfile=buildmcr(dirname)来创建一个包含MCR需要的所有文件的zip文件,在deploytool里也有相关选项.一般需要发布的文件有3个:(1)编译得到的可执行文件或dll、lib。(2)CTF文件(组件技术文件)。(3)MCRInstaller.zip.
2.2.5单击Deployment Tool上的 图标
单击Deployment Tool上的 图标,进行编译设置图2.8
图2.8
单击OK。
单击Deployment Tool上的 图标,
2.3 编译完后就会在matlab工作目录下的bian目录下生成两个文件夹:一个是src,里面存放一些中间文件;另一个是distrib,里面就是动态链接库形式的com组件文件等。在这里,编译后distrib\文件夹下生成一个bian_1_0.dll,这就是做好的com组件。
此时,可以在bian\distrib文件夹里看,生成的bian.exe就是打包后的解压程序,双击就会解压出一些文件,再点击解压出来的install.bat就可以实现安装。
3 VC调用com组件的方法
3.1新建一个vc工程
新建一个vc工程bianvc(MFC AppWizard(exe)),基于对话框的工程(其它为VC默认)。在编辑bianvc的对话框资源,添加ID_TEST(调用猫图)和ID_EXIT(关闭猫图)两个按钮,并通过ClassWizard 添加上述两个按钮的消息响应函数,如图3.1所示。
图3.1
3.2对 VC 的编译器环境进行设置。
在Tools|options|directory里面设置include和lib的路径,分别添加一项,指向matlab安装目录中的\extern\include和 \extern\lib (见图3.2和图3.3)
图3.2
图3.3
3.3设置工程bianvc,Project|Setting|C++|Precompiled Headers,选择Automatic use of precompiled headers,并将header设为stdafx.h,如图3.4所示:
图3.4
3.4在bianvcDlg中加入公共变量Ibianclass *sp。
3.5点击VC下的tools->ole/com objectviewer打开oleviewer工具,在oleviewer工具的右边选择type libraries,找到bian 1.0 type library,选中并且右键,选择view,点save按钮,分别保存为bian_1_0.h和bian_1_0.c(也可以存为bian_1_0.idl接口文件),我们就可以根据这两个文件实现对bian_1_0.dll调用。
图3.5
将bian_1_0.h和bian_1_0.c加入工程,并复制一个bian_1_0.dll到工程目录下,由于bian_1_0.dll还要用到mwcomutil.dll,所以将\bianxb\bian\src下的mwcomutil.h和mwcomtypes.h也加入工程中。
3.5示意调用代码如下:
******************************bianvcDlg.h****************************
#include "mwcomutil.h"
#import"D:\Program Files\MATLAB\R2007a\bin\win32\mwcomutil.dll" raw_interfaces_only
#include "bian_1_0.h"
************************bianvcDlg.cpp中部分代码*********************
void CBianvcDlg::OnTest()
{
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("unable to initialize COM");
}
Ibianclass *st=NULL;
HRESULT hr=CoCreateInstance(CLSID_bianclass,NULL,CLSCTX_ALL,IID_Ibianclass,(void**)&st);
if (SUCCEEDED(hr))
{
st->testpic ();
AfxMessageBox("succeed");
st->Release();
}
else
{
AfxMessageBox("unsucceed");
}
}
void CBianvcDlg::OnExit()
{
OnCancel();
CoUninitialize();
}
4.在目标机上的发布
4.1 在目标机上看是否安装了Microsoft.NET Framework2.0,若没有,则先安装Microsoft.NET Framework2.0。
4.2 先找到工程 bianxb\bian\distrib下的bian_pkg.exe,在DOS窗口中输入A,并且回车。按照提示操作即可。
4.3运行工程bianxb\bianvc\Release下的bianvc.exe.即可调用成功。
5 结束语
通过应用编程接口,可以把其他高级语言灵活多变的编程能力和matlab的强大计算能力结合起来。Matlab Builder for .NET工具可以方便地把matlab程序做成com组件,为系统开发人员提供了简单、易用地应用程序接口。和其他接口方法相比,将matlab程序做成com组件,使其他语言工具和matlab的混合编程更加简单。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -