VB调用Matlab生成的dll完全攻略(混合编程必备)
MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明
MATLAB2014a生成C++代码,并用VC2010生成dll 供VBA或VB调用使用说明一、过程概述1、使用VC2010生成.dll文件,测试VC程序是否正常2、使用VBA调用VC2010生成的.dll文件,测试.dll文件调用的VBA代码是否正常,这里使用Excel VBA主要是为了以后输入输出数据更方便。
3、使用MATLAB编写脚本程序文件,使用MATLAB CODER功能编译成c++文件。
4、VC2010集成MATLAB生成的c++代码,并编译成.dll文件5、使用步骤1,2验证MATLAB生成的代码二、具体实施过程描述1、使用VC2010生成.dll文件1.1工程建立首先打开VS 2010--> 新建工程 --> Win32 --> Win32项目 --> 输入工程名称(MakeDll),选择好保存工程的路径-->确定。
在弹出的“应用程序设置”--> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)" ---->点击"完成"进入项目工作窗口1.2开始创建DLL第一步:在头"解决方案资源管理器" --> 头文件 --> 右键 -->添加新建项---→选择"头文件(.h)" -->输入文件名称(max) --> 点击“添加(A)”,完成max.h文件的添加。
max.h头文件中的代码为:1. #ifndef _MAX_H2. #define _MAX_H_3. __declspec(dllexport) int __stdcall fmax(int a,int b);4. #endif代码说明:__declspec(dllexport) 的作用是指定导出该函数为DLL函数;__stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用;备注:使用时需要根据实际定义的主函数返回值类型和函数名称修改低3行红色而自体标记部分内容。
VB调用MATLAB步骤
a = Val(Text1.Text)
b = Val(Text2.Text)
Call hh.myadd(1, c, a, b) 'myadd为MATLAB中的函数名,1为输出变量个数,c为输出变量定义为variant型,a,b为输入变量,定义为double型
Y=a+b;
VB程序如下:
Private Sub Command1_Click()
Dim hh As New ABC.ab 'ABC 为COMPONENT NAME,ab为class name
Dim a As Double ‘输入参数
Dim b As Double ‘输入参数
3.matlab会列出所有电脑上所有的编译器,选择Microsoft Visual C/C++ version 6.0
4.The default location for Microsoft Visual C/C++ compilers is C:\Program Files\Microsoft Visual Studio, but that directory does not exist on this machine
Use C:\Program Files\Microsoft Visual Studio anyway [y]/n? 选择n
5.Please enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio] 键入vc++6的安装位置E:\INSTALLBACK\Microsoft Visual Studio vc6.0
五种VB与MATLAB混合编程接口的方法
摘要: 为充分发挥Matlab与VB各自的优势,将二者结合起来进行工程应用软件的开发。
本文介绍了五种VB与MATLAB混合编程接口的方法,并对各方法性能的优劣进行了比较和评价。
关键词: Matlab;Visual Basic;ActiveX;DDE;MatrixVB;DLL;COM1引言Microsoft Visual Basic是由微软公司开发的可视化编程语言之一,由于它简单易学的特点,只要稍有编程基础就可以很快掌握,可视化的用户界面设计功能,把程序设计人员从繁琐复杂的界面设计中解脱出来。
因而很快就风靡全球,是一种十分强大和有生命力的Windows 编程语言。
但是我们知道VB语言也有它的缺点,即对于数值计算方面其能力欠佳。
Matlab是Matlab 擅长处理数值计算和系统模拟仿真,已被广泛应用于数字信号处理、电力系统仿真、图像处理、系统识别等各个领域。
但是Matlab也存在一些缺点: 1、和其他高级程序相比,程序的执行速度较慢,那是因为;2、对于底层硬件操作以及编程界面方面远远比不上VB、VC 等软件。
鉴于二者各自的优势,为了提高工程软件的开发效率和质量,将两种软件结合起来进行工程应用软件的开发便成了实际的需要。
本文主要讨论VB与Matlab混合编程的几种方法。
2Vb和Matlab接口实现方法介绍2.1借助ActiveX技术ActiveX是特点就是使不同的软件对象可以跨进程、跨平台并能在网络上进行交互。
Matlab ActiveX自动化服务的功能主要包括在(1) Execute (Command as String) 方法: 执行本方法将调用MATLAB执行一条Command 字符串决定的Matlab命令,同时返回一条字符串表示命令的执行情况。
任何能在MATLAB命令行窗口执行的命令均可以被包括在Command 字符串中。
(2) GetFullMatrix方法: 该方法用来将Matlab中的一个矩阵变量传送到VB 程序的一个一维数组或二维数组中。
VB与Matlab混合编程
一、准备工作(1)matlab版本2012或以上(2)vb6.0二、适用条件matlab生成的无论是应用程序还是动态连接库或者是COM组件都需要MCR的支持,MCR因用户安装的Matlab版本不同分为32位和64位,所以为了能够将自己编译的M文件能够应用于其他的电脑上,首先要在目标电脑上安装自己电脑中MCR这个应用程序,它的存放位置为Matlab路径\ toolbox\compiler\deploy\win64三、Matlab与VB基于Com组件的实现过程(1)在Matlab中生成M文件的COM组件打开App菜单栏,找到Matlab Complier单击进入应用,会出现上图的界面,在Classes 中可以添加自己要用的类群,所谓的类群就是好比如果你想建立一个专门用于解决非线性方程的类,就可以建立个nonlinear equations solver,在类下可以添加用于解决非线性方程的各种M函数文件。
在这里我建立了fft类,在这个类中我添加了个myfft.M文件,这个M文件实际上使用了Matlab自带的离散傅立叶变换函数fft,这么做的目的是为了说明我们可以调用matlab已经建立好的各种算法,方便的在vb中调用。
添加好所需要的资源,点击build就OK了。
(2)注册生成的COM组件在Build Success后会在你选择生成Com组件的文件地址发现两个文件distrib和src,在distrib文件里你会发现你生成.dll文件,在电脑上注册它就可以在vb上调用。
至于怎么注册,自行脑补。
(3)在VB中调用Com组件在vb中的引用中通过浏览功能引用生成.dll文件,那么现在就可以使用了。
使用步骤:1.Dim xxx as new 工程名.类名xxx可以随意,工程名为你在Matlab中生成COM组件时自己定义的COM 组件名,类名为COM组件下你添加的类名2.通过xxx.函数名(nargout,y1,y2,y3,....,yn,x1,x2,...,xn)函数名为Matlab中定义在此类下的函数名,nargout为输出变量个数,y1,y2,...,yn 为输出变量,x1,x2,....,xn为输入变量。
vs2010调用matlab2014a的dll详细步骤(一)——详述matlab的dll生成
vs2010调⽤matlab2014a的dll详细步骤(⼀)——详述matlab的dll⽣成做⼯程这么多年了,总是索取,没有奉献,这样确实不是我的处世态度,这是我的第⼀篇技术贴,以后在⼯作中如果有好的经验⼀定会记录下来,供⼤家分享,共同进步。
先说我的⼯程环境,win7 64位机,装了matlab2014a和vs2010,⽹上有很多讲vs调⽤matlab的帖⼦,能够成功的完成vs 的调⽤也多亏了这些帖⼦,然⽽没有⼀篇完整的帖⼦讲述整个过程,所以我就把⾃⼰从头到尾的步骤,⾃⼰的困惑和解决⽅法都列出来,供⼤家相互学习。
⾸先,matlab⽣成dll。
我装的是盗版matlab2014a,单位只有⼀个正版的matlab⼀直没⽤,我觉得盗版的舒服,感觉像偷偷占了便宜,例⼦中使⽤的是简单的两数和,⽣成matlab⼦函数。
2014a是个坑,它本⾝编译系统有问题,所以需要⽤该⽹址下载⽂件,/smilebluesky/article/details/42987985,替换原有⽂件。
就会解决刚开始的编译问题。
接下来上图,说明整个编译过程步骤。
1、matlab命令⾏输⼊deploytool2、选择第⼆个“Library Compiler”3、添加⽂件,选择“C++ Shared Library”,点击“+”选择编译的⼦函数⽂件“myAdd.m”4、添加完成后,点击对号“Package”5、编译完成,⽣成dll会弹出⽂件夹6、在⽂件“for_redistribution_files_only”中存在我们需要库⽂件完了。
有⼀点需要说明,当时困惑了我。
现在在例程中我们使⽤的是简单的matlab程序,他没有调⽤matlab的函数和⾃⼰编写的函数,如果有函数调⽤了应该怎么写,需要对所有的⼦函数也进⾏编译码?后来问了度娘,⾃⼰也试了,结论如下:分两种情况,1、调⽤⾃⼰编写的⼦函数,这样编译时需要将所有的函数放在同⼀个⽂件夹下,这样编译时会⾃动将被调⽤的⼦函数,放在库中,在vs调⽤时没有问题;2、调⽤了matlab⾃带的函数,这种⽆所谓,直接编译就可以了,matlab会⾃动按照环境变量的设置去寻找库⾥的⼦函数,但有⼀个特例就是神经⽹络,它是不能被编译的,⼈家matlab公司说了,神经⽹络的算法是不对外公开的,所以不能使⽤,这种情况⼤家就在⽹上找神经⽹络的c语⾔代码吧。
VB调用MATLAB混合编程教程(完整版)
VB与MATLAB混合编程探讨摘要:介绍了VB与MATLAB混合编程的方法,二者结合可以充分利用VB的方便快捷和MATLAB软件工具箱的强大功能。
关键词:VBVC++MATLABDLL编译MATLABAdd-inMATLAB是MathWorks公司开发的科学计算环境,具有强大的计算绘图能力,提供大量的函数库、工具箱,几乎涵盖了所有的工程计算领域,被誉为“演算纸”式的工程计算工具。
但是MATLAB语言是一种解释执行的脚本语言,运算速度较慢是一个比较突出的问题。
VisualBasic作为一门易学易用的编程语言,受到很多工程技术人员的青睐,其执行速度相对较快,界面友好。
因此实现VB与MATLAB混合编程,可以为科研工作和工程应用提供有力的技术支持。
1基本思路及实现方法MATLAB提供了与C++、Fortran的程序接口,并没有提供直接与VB的接口。
目前VB与MATLAB混合编程方面主要使用以下一些方法:(1)在VB中通过调用MATLAB的引擎(Engine)接口,使用Windows的OLE或ActiveX通道与MATLAB通信。
通过Object.Execute MATLAB语句在程序中直接使用MATLAB提供的函数库和图形库。
这种方法可以较快地编写出程序;但在调用引擎时,会在后台启动一个MATLAB进程,影响程序运行速度,占用内存。
(2)通过使用嵌入VB的矩阵函数库MatrixVB的方法。
MatrixVB是由原MathTools公司开发的第三方插件,利用与MATLAB相似的函数、语法嵌入到VB中,可以象使用VB的函数、命令一样使用MATLAB函数。
这种方法语法和函数使用比较简单,编程效率很高,几乎完全融入VB语言,特别对图形的处理非常方便,弥补了其他方法在图形处理上的弱点。
安装后,只需在打开的工程中添加MatrixVB库即可(在工程->引用对话框中选中MMatrix)。
但由于其仍然采用解释执行,执行效率较低,实时运算难以实现。
VisualStudio与Matlab实现混合编程
VisualStudio与Matlab实现混合编程环境:Win10vs2010Matlab2015⾥⾯有很多选做的内容,其中2、3必做1.Matlab环境设置:(选做)我没有做这步,因为打mbuild -setup指令不识别,缺少SDK,但是可以正常调⽤Matlab,这步是其他⽅式调⽤Matlab中的⼀步,使⽤Matlab⽣成DLL⽂件,VS引⽤要建⽴独⽴运⾏的C应⽤程序,系统中需要安装Matlab、Matlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数。
Matlab编译器使⽤mbuild命令可以直接将C/C++源代码编译为独⽴运⾏程序,在这些源代码中可以使⽤Matlab提供的接⼝来调⽤Matlab数学库函数。
虽然⽣成的可执⾏程序可以脱离Matlab环境运⾏,但是它需要Matlab C/C++数学库⽂件或者图形库⽂件的⽀持才能运⾏。
但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调⽤,则不仅可以独⽴与Matlab环境,也不需要那两个库函数的⽀持。
在 Matlab 的Command Window 下输⼊命令。
mbuild – setup操作过程如下图:然后输⼊命令mex – setup以类似的⽅法配置编译器。
Matlab 的配置完成。
2.VS环境设置(必做)(1)设置Include 和Library ⽬录项⽬右键->属性->VC++⽬录->包含⽬录:添加<MATLAB>\R2010b\extern\include\win64 我的是:D:\RUANJIAN\Matlab\extern\include\win64<MATLAB>\R2010b\extern\include\ 我的是:D:\RUANJIAN\Matlab\extern\include项⽬右键->属性->VC++⽬录->库⽬录:添加<MATLAB>\R2010b\extern\lib\win32\microsoft 我的是:D:\RUANJIAN\Matlab\extern\lib\win64\microsoft<MATLAB>\R2010b\extern\lib\win64\microsoft截图::(2)设置⼯程⽬录: ( 我并没有设置)项⽬右键->属性->C/C++->常规->附件包含⽬录:添加<MATLAB>\R2010b\extern\include\win64<MATLAB>\R2010b\extern\include\项⽬右键->属性->链接器->常规:添加<MATLAB>\R2010b\extern\lib\win32\microsoft<MATLAB>\R2010b\extern\lib\win64\microsoft项⽬右键->属性->链接器->输⼊->附件依赖性:添加 (必做)libeng.liblibmat.liblibmex.liblibmx.lib 注:1.lib⽂件包含在<MATLAB>\R2010b\extern\lib\win64\microsoft,可根据需要增减 2.附件依赖性在VS2010前以空格隔开,在VS2010后使⽤;隔开。
【转】在VS2008中联合使用Matlab编程的技巧一
【转】在VS2008中联合使⽤Matlab编程的技巧⼀在VS2008中联合使⽤Matlab编程的技巧⼀在VS中使⽤Matlab来处理矩阵主要有两种⽅法,⼀种是直接是VS中编程打开Matlab引擎,输⼊Matlab语句,另外⼀种就是将Matlab的m.⽂件编译⽣成dll⽂件,在VS中调⽤该dll⽂件。
⼀、在VS中调⽤matlab⽣成的dll⽂件该实例是基于VS2008和matlab2009a所实现的。
1、Matlab中的设置⾸先在Matlab⾥⾯新建⼀个M⽂件,主要代码为:function[M]=gray_model_test_sonar3(a)%function[M]=gray_model_test_sonar3(a1,a2,a3,a4)%a=[a1;a2;a3;a4];a1=[a(1);a(1)+a(2);a(1)+a(2)+a(3);a(1)+a(2)+a(3)+a(4)];B=[-0.5*(a1(1)+a1(2)),1;-0.5*(a1(3)+a1(2)),1;-0.5*(a1(4)+a1(3)),1;];B = double(B);F=[a(2);a(3);a(4)];C=B'*B;D=pinv(C);%求C的伪逆D = double(D);F = double(F);E=D*B'*F;G=(a(1)-E(2)/E(1))*exp(-4*E(1))+E(2)/E(1);T=(a(1)-E(2)/E(1))*exp(-3*E(1))+E(2)/E(1);M=G-T;end该段代码为使⽤灰⾊模型进⾏预测的基础代码,重点在于Matlab程序必须要包含着functiong和end之间。
将m⽂件保存为sonar3.m,保存在D:\test⽂件件中,然后在Matlab的command window中键⼊:cd D:\test ,在Matlab主窗⼝中将当前路径改为D:\test。
然后设置matlab编译库,以便能够⽣成动态dll⽂件供VS调⽤,在Matlab主窗⼝中键⼊:mbuild -setup会出现:Please choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers [y]/n?在这⾥我选择的n,得到显⽰:Select a compiler:[1] Lcc-win32 C 2.4.1[2] Microsoft Visual C++ 6.0[3] Microsoft Visual C++ .NET 2003[4] Microsoft Visual C++ 2005 SP1[5] Microsoft Visual C++ 2008 Express[6] Microsoft Visual C++ 2008 SP1[0] NoneCompiler:The default location for Microsoft Visual C++ 2008 SP1 compilers is C:\Program Files\Microsoft Visual Studio 9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n? yPlease verify your choices:Compiler: Microsoft Visual C++ 2008 SP1Location: C:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n? y****************************************************************************Warning: Applications/components generated using Microsoft Visual Studio2008 require that the Microsoft Visual Studio 2008 run-timelibraries be available on the computer used for deployment.To redistribute your applications/components, be sure that thedeployment machine has these run-time libraries.****************************************************************************Trying to update options file: C:\Users\Vivian\AppData\Roaming\MathWorks\MATLAB\R2009a\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2009a\bin\win32\mbuildopts\msvc90compp.batDone . . .当出现如上说明,就代表编译器设置完成,接下来使⽤.m⽂件⽣成.dll⽂件在Matlab中,.m⽂件⽣成.dll⽂件的指令如下:mcc -W cpplib:myadd -T link:lib add.m -C其中,myadd是需要⽣成的dll的⽂件名,即⽣成的⽂件名为myadd.dll,add.m是指明通过哪个.m⽂件⽣成dll⽂件的,myadd 和add可以不⼀样。
Matlab与VB混合编程
*打开生成的安装包中的
setup.Lst文件,[Bootstrap Files]字段里面只保留 VB6STKIT.DLL和 msvbvm60.dll几个文件, 其余的都删掉,否则在不同 版本的系统上使用可能会 报错。
16 /23
6、应用程序安装 (1)安装VB应用程序。在要安装的计算机上,新建一 个文件夹作为应用程序的安装目录。将打包好的VB程序 中的压缩包(.CAB)解压到安装目录中再进行安装。 ( 2 )安装 Matlab 控件。运行 COM 组件包中的 distrib 文 件夹下的类名.exe文件,运行过程中全部按“y”覆盖原 文件。将安装目录指向VB应用程序安装所在的目录(即 VB应用程序与Matlab控件安装在同一个目录下),否则 dll文件是没有办法注册的,选择后,全部点击Next,至 Matlab Component Runtime安装完成,DOS安装界面也 会随后自动关闭。
,在算法上采用C++语句,所以运行速度较快,可应用于实时运算
。通过这种方法可以发布成脱离MATLAB和VB的安装软件, 在其他没有安装MATLAB和VB软件的计算机上都能运行。
8 /23
实现步骤(一) Matlab7.1 版
1、开发环境: Visual Studio 6.0 Matlab7.1安装路径不能有空格或中文 2、编写m文件 (注:m文件必须为m函数,不能是脚本文件) function plotcur x=0:0.01:2*pi; y=sin(x); set(gcf,'visible','off'); plot(y) print -dmeta; close(gcf);
编译
编译过程
21 /23
4、生成自解压安装包 在本地使用的话,MATLAB会自动注册 COM 组件,无需发布;但如果要在没有安装 MATLAB的计算机上使用,安装包就需添加 MATLAB运行库MCR。点击PackageAdd MCR
MATLAB与VB混合编程方式简易教程
3.1 MATLAB与Visual Basic语言的混合编程方式MATLAB提供了与C/C++、Fortran语言的接口,但没有与Vsiual Basic语言的接口,要想实现MATLAB与Visual Basic的混合编程可以通过以下途径来实现。
1.通过ActiveX方式一是用Visual Basic开发服务器ActiveX组件,MATLAB作为客户端程序使用,事实上无论是用VB还是VC或者其他语言环境开发的ActiveX组件,对于MATLAB来说集成与调用方式是一样的,一般情况下很容易地将不同环境下开发的用途各异的ActiveX对象集成到一个MATLAB应用中来。
其使用方法见第5章关于MATLAB作为ActiveX的客户端使用方法。
二是在VB环境下可以通过ActiveX自动化接口将MATLAB作为Visual Basic语言的一个ActiveX 部件调用。
MATLAB ActiveX自动化服务的功能主要包括在MA TLAB工作空间执行MA TLAB 命令,以及直接从工作空间存取矩阵等,我们在第5章中关于MA TLAB作为服务器组件的部分的例子就是以Visual Basic应用程序,以MATLAB作为服务器客户端的。
2.通过动态链接库方式该种方式是一种间接调用MATLAB命令的方式,借助于C++与MA TLAB的接口,将MATLAB 的程序文件(.M文件)编译为动态链接库(.DLL),VB在代码中与调用其他语言编写的DLL文件一样调用MATLAB中.M 文件生成的动态链接库。
这种方法可以脱离具体的MA TLAB环境,运行效率较高。
3.通过嵌入VB的矩阵函数库MatrixVB的方法MatrixVB是由第三方(mathtools公司)提供的COM组件,包含了大量与MATLAB相似的函数与调用语法,可以加强VB内建数学运算与图形展示功能,在VB程序代码中可以像使用VB自己的函数一样使用MatrixVB的函数,而且可以不依赖于MATLAB的环境在Visual Basic中完成矩阵运算与图形绘制显示等功能,这种方法使用起来简单,编程效率较高。
在VB中调用DLL的方法
在VB中调用DLL的方法方法一:使用Declare语句VB中可以使用Declare语句来声明DLL函数,然后直接调用该函数,具体步骤如下:1.确保DLL文件已经存在,并了解所要调用的DLL函数的名称、参数和返回值类型。
2. 在VB代码的模块级别上,使用Declare语句来声明DLL函数,语法如下:Declare Function functionName Lib "dllFileName" ([参数列表]) As 返回值类型其中,functionName是要调用的DLL函数的名称,dllFileName是DLL文件的名称(带有扩展名),[参数列表]是DLL函数的参数列表,如果没有参数,则可以省略;返回值类型是DLL函数的返回值类型。
3. 在需要调用DLL函数的地方,直接使用函数名进行调用,如:result = functionName([参数])其中,result是接收DLL函数返回值的变量。
4.运行程序,并检查结果是否正确。
方法二:使用COM组件如果DLL文件是使用COM组件进行编写的,可以使用VB的COM互操作性来调用DLL方法,具体步骤如下:1.确保DLL文件已经注册为COM组件,并了解所要调用的DLL方法的名称、参数和返回值类型。
2.在VB项目中添加对DLL文件的引用,方法是在“项目”->“引用”菜单下,选择“添加引用”,然后在“COM”选项卡中找到并选中DLL文件。
3. 创建一个COM对象,可以使用CreateObject或者New关键字,具体语法如下:Dim obj As ObjectSet obj = CreateObject("dllFileName.ClassName")'或者Dim obj As New dllFileName.ClassName其中,dllFileName是DLL文件的名称(不带扩展名),ClassName是DLL内部的类名。
VS调用matlab生成的dll
VS调用matlab生成的dll一、编程环境●VS2010 professional 32位●Matlab2010b 32位二、m atlab程序转dll1.matlab程序简单实例2.转dll步骤●命令行中输入:mbuild–setup,再选择编译的环境;●命令行输入:mcc –W cpplib:libname–T link:libfilename.m;●生成多个文件,有用的文件为libname.lib、libname.c、libname.dll,切记libname.cpp只是参考用的,不要加入到VS项目里面。
三、V S工程建立1、包含库及链接库设置●包含目录中添加:D:\matlab\extern\include;●库目录中添加:D:\matlab\extern\lib\win32\microsoft;●链接器-常规-附加库目录中添加:D:\matlab\extern\lib\win32\microsoft;●链接器-输入-附加依赖项添加libmyadd.lib;mclmcr.lib;libeng.lib;libmat.lib;libmex.lib;libmx.lib;mclmcrrt.lib;切记,一定要把libmyadd.lib加入;2、调用matlab的dll程序实例四、总结1、刚开始用自己的笔记本(环境是win7 64位),matlab生成dll后在VS2010中调用,编译一直提示连接错误,主要是很多内部函数(尾部添加_proxy)链接失败,可能是VS项目设置的WIN32原因,而且matlab/extern/lib里面win32的lib没有mclmcrrt.lib文件,所以给VS更新X64功能,后来没成功,转到单位的32机器上面。
2、在win7 32位机器上面直接编译成功,但是运行会报错,我调试后发现运行到matlab的dll核心程序if (mclcppFeval(inst, name, nargout, (void**)&lhs,(void*)((array_buffer*)rhs)) == MCLCPP_ERR) mwException::raise_error();时报错,通过几个小时的分析,认为没有把libmyadd.lib加入到附加依赖项中,但是加上后会提示发现重定义字符,预算把libmyadd.cpp移除,再编译后成功运行。
vb调用matlab程序步骤-wrl修改
先把VB,VC ,matlab都安装好。
例如建立一个 M函数文件,在matlab下调试好你的m文件,如:function Y=myfunction(a,b)Y=a+b;将myfunction.放入E:根目录下。
一.matlab下做com组件,生成dll文件1. 在matlab的command window里面敲入mex –setup (对matlab编译器配置命令下输入,注意有空格)Please choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers [y]/n? nSelect a compiler:[1] Borland C++ Compiler (free command line tools) 5.5[2] Borland C++Builder 6.0[3] Borland C++Builder 5.0[4] Compaq Visual Fortran 6.1[5] Compaq Visual Fortran 6.6[6] Intel C++ 9.1 (with Microsoft Visual C++ 2005 linker)[7] Intel Visual Fortran 9.1 (with Microsoft Visual C++ 2005 linker)[8] Intel Visual Fortran 9.0 (with Microsoft Visual C++ 2005 linker)[9] Intel Visual Fortran 9.0 (with Microsoft Visual C++ .NET 2003 linker)[10] Lcc-win32 C 2.4.1[11] Microsoft Visual C++ 6.0[12] Microsoft Visual C++ .NET 2003[13] Microsoft Visual C++ 2005[14] Microsoft Visual C++ 2005 Express Edition[15] Open WATCOM C++ 1.3[0] NoneCompiler: 11Your machine has a Microsoft Visual C++ compiler located atC:\Program Files\Microsoft Visual Studio. Do you want to use this compiler [y]/n? y 由于我VC 的安装目录正在C盘,因此我选择yPlease verify your choices:Compiler: Microsoft Visual C++ 6.0Location: C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n): yTrying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2007a\mexopts.batFrom template: C:\PROGRA~1\MA TLAB\R2007a\bin\win32\mexopts\msvc60opts.batDone . . .2.设置matlab编译器,在matlab的command window里面敲入mbuild –setup (对matlab 编译器配置命令下输入,注意有空格)Please choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers [y]/n? nSelect a compiler:[1] Borland C++ Compiler (free command line tools) 5.5[2] Borland C++Builder 6.0[3] Borland C++Builder 5.0[4] Lcc-win32 C 2.4.1[5] Microsoft Visual C++ 6.0[6] Microsoft Visual C++ .NET 2003[7] Microsoft Visual C++ 2005[8] Microsoft Visual C++ 2005 Express Edition[0] NoneCompiler: 5Your machine has a Microsoft Visual C++ compiler located atC:\Program Files\Microsoft Visual Studio. Do you want to use this compiler [y]/n? yPlease verify your choices:Compiler: Microsoft Visual C++ 6.0Location: C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n): yTrying to update options file: C:\Documents and Settings\Administrator\ApplicationData\MathWorks\MATLAB\R2007a\compopts.batFrom template: C:\PROGRA~1\MATLAB\R2007a\bin\win32\mbuildopts\msvc60compp.batDone . . .--> "C:\PROGRA~1\MATLAB\R2007a\bin\win32\mwregsvr C:\PROGRA~1\MATLAB\R2007a\bin\win32\mwcomutil.dll"DllRegisterServer in C:\PROGRA~1\MATLAB\R2007a\bin\win32\mwcomutil.dll succeeded--> "C:\PROGRA~1\MATLAB\R2007a\bin\win32\mwregsvr C:\PROGRA~1\MATLAB\R2007a\bin\win32\mwcommgr.dll"DllRegisterServer in C:\PROGRA~1\MATLAB\R2007a\bin\win32\mwcommgr.dll succeeded2. 开一个dos窗口,进入/bin/win32目录下(matlabroot为你机器上matlab安装的路径),例如,我的安装目录在C盘,在dos下进入:C:\Program Files\MATLAB\R2007a\bin\win32 文件夹,输入:regsvr32 mwcomutil.dll,即对mwcomutil.dll进行注册(这个dll是matlab下作的任何com组件都要用到的dll),下面我们在其他编译器下调用时就可以用了。
VB调用Matlab制作的COM组件实现二者混合编程
4、Matlab中处理返回结果并使用它进行进一步计算或可视化等操作。
四、注意事项
在使用基于COM的VB与Matlab混合编程时,需要注意以下几点:
1、确保VB COM接口和Matlab代码之间的兼容性。这通常需要对两种语言进 行适当的转换和映射。
2、COM接口的创建和实现可能需要耗费大量时间和精力,因此需要仔细规划 和设计。
4.处理异常
在调用Matlab函数时,你可能会遇到各种异常情况,例如参数类型不匹配、 参数数量不匹配等等。为了处理这些异常,你需要在VB代码中使用异常处理机制:
result = myMatlabObject.YourFunctionName(input1, input2)
' Handle the exception here
1、创建Matlab COM组件
首先,我们需要创建一个Matlab COM组件。打开Matlab,编写你希望从VB 调用的函数,例如一个用于图像处理的函数。然后在命令窗口中输入以下命令以 创建COM组件:
这将打开COM工具箱。在“新建项目”窗口中,选择“COM库”,然后输入库 名和位置。接下来,添加你的Matlab函数到库中。
在这个例子中,如果myMatlabObject.YourFunctionName(input1, input2) 抛出一个异常,那么这个异常会被Catch块捕获,并可以进一步处理。
5.在VB中使用返回值 在你的Matlab函数返回值后,你可以在VB中使用它。例如:
在这个例子中,如果result不是Nothing,那么你可以进一步使用这个结果。 6.错误检查和清理
1、创建 MATLAB函数:首先
例如: function obj = MyClass(x) function result = add(obj, y)
【推荐下载】探究vb与matlab混合编程
[键入文字]
探究vb与matlab混合编程
探究vb与matlab混合编程
1 VB和Matlab混合编程的方法和算例由于Matlab本身只提供了Fortran、C语言的接口程序,所以无法直接实现VB对Matlab的调用.故Matlab与VB混合编程中需要解决的关键是如何实现在VB中调用Matlab. Matlab与VB混合编程的方法主要有下面4种.
1 1 ActiveX技术ActiveX技术是以组件对象模型(componentobject model,COM)技术为基础的一种应用程序开发技术和体系结构的总称,它是Microsoft公司提供的一种用于模块集成的新协议,它允许应用程序或组件控制另一个应用程序或组件的运行. Matlab5.
0以上的版本均支持ActiveX的嵌入.因为VB支持ActiveX自动化控制端协议,Matlab 支持ActiveX自动化服务器端协议,所以VB和Matlab的通信有两种:一种是自动化服务器,另一种是自动化控制器.本文重点探讨VB如何通过ActiveX接口将Matlab作为VB 的一个ActiveX部件,实现数值计算和图形显示.要实现这种功能,用户首先必须获得Matlab ActiveX对象在系统注册表中定义的名字─Matlab.Application.在所编写的程序中必须有如下的代码:Dim Matlab as ObjectSet.
1。
Matlab 2016a和VS2013混合Dll编程步骤总结
Matlab 2016a和VS2013混合Dll编程步骤1. 从Matlab导出.m文件为Dll文件;Step1:将Matlab工作路径转为目标.m文件所在文件夹,在控制栏输入“mex –setup”,弹出如下说明:Step2:点击“mex –setup C++”,弹出如下说明,看到“MEX configured to use ‘Microsoft Visual C++ 2013 Professional’ for C++ language compilation”,说明配置好用C++语言进行编译;Step3:继续输入“deploytool”,弹出compile窗口,选择第三个,即Library Compiler;Step4:在弹出窗口中,左上角选择“C++ Shared Library”,右侧添加需要转换的.m文件,下面第一行输入转换后的Dll文件名,最后点击右上角“Package”对号,如果.m文件中包含其他.m文件中的函数,不用一起添加,Matlab会自动检测,然后在窗口下面框中显示出依赖文件;Step5:生成后文件夹如下图所示,第一个文件夹中的exe文件用于程序发布时用,第二个文件夹中包含相当于release下得.h,.lib和.dll文件,第三个文件包含测试用地.h,.lib和.dll文件等文件,是测试需要的;Step6:新建一个Win32控制台应用程序工程,自己命名,比如然后将for_testing文件中的.h,.lib和.dll文件拷到新建应用程序下和.cpp文件放在一起,如下图2. 配置电脑系统环境变量和VS工程属性;Step1:在系统环境变量的Path中添加“Matlab安装目录\bin\win64;”Step2:在项目属性中的包含目录添加“Matlab安装目录\extern\include;”Step3:在项目属性中的库目录添加“Matlab安装目录\extern\include\lib\win64\microsoft;”Step4:在项目属性链接器输入中添加以下库名libmat.liblibmex.libmclmcr.libmclmcrrt.liblibemlrt.liblibeng.liblibfixedpoint.liblibcovrt.libStep5:为项目添加matlab生成的头文件(上面Step6中和cpp文件放一起的那个.h文件)。
在VB开发环境中调用由MATLAB函数转化的DLL
第25卷总第53期 西北民族大学学报(自然科学版)Vol.25,No.2 2004年6月 Journal of N orthw est U niversity for N ationalities(Natural Science)J une,2004在VB开发环境中调用由MA TLAB函数转化的DLL冯 旭(西北民族大学现代教育技术学院,甘肃兰州730030)[摘 要]VB是一个高效快速的软件开发平台,但在进行数值计算需要编写大量的代码,还需要反复调试以保证其可靠性和稳定性1通过编写DLL,只须少量代码,并且MA TLAB的算法是经过商业化的考验,比较可靠,省去了许多软件维护费用1特别是要编写一些复杂的算法,例如,大型稀疏矩阵、大型线形方程组的解法、微分方程及偏微分方程的解法等等,并在此基础上开发更复杂的算法,该方法的优越性将更加明显1[关键词]MA TLAB;MIDEVA;Matcom4;VB;DLL[中图分类号]TP311 [文献标识码]A [文章编号]1009-2102(2004)02-0065-03Matlab是MathWorks公司于1982年推出的一套高性能的数值计算和可视化软件,适合于科学和工程技术人员使用的计算语言,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便、界面友好的用户环境1它还包括了ToolBox(工具箱)的各类问题的求解工具,可用来求解特定学科的问题,其基本元素是一个为数不限的复矩阵,并完成了对矩阵运算效率的优化1MA TLAB采用M-语言进行编程,在程序执行过程中对M-文件进行解释,程序结构完整,但不能脱离其环境运行,因此它不能被用于开发商用软件1Visual Basic开发平台提供了开发Windows应用程序最迅速、最简洁的方法,特别在我国VB拥有非常广泛的用户群体1但VB的数值计算功能并不十分强大,往往一个简单的算法就需要很多代码完成,更何况复杂的矩阵运算,因此很多人由于这方面原因而放弃使用VB,造成不必要的资源浪费1为了使VB,最大限度地发挥MA TLAB功能,同时脱离MA TLAB这一庞大的运行环境,本文将介绍MA TLAB函数即M-文件如何转换到DLL以及如何在VB中调用这一类动态库1本文开发环境为MA TLAB6.0、M IDEVA4.5、Matcom4.2、VB6.011 VB与MA TLAB混合编程方式VB与MA TLAB结合在一起编程的方式主要有以下几种:(1)利用组件对象模型即COM规范,自动化Automation协议,通过引擎(Engine),采用客户机/服务器(Client/Server)模式进行通信1实际应用中,VB作为前端客户机通过引擎调用作为Automation服务器端的MA TLAB1但这种方式需要MA TLAB在后台实时运行,不能生成独立运行的应用软件包,因此,在软件开发中很少使用1(2)利用Matlabvbtrix1Matlabvbtrix是Math Tools公司(已被MathWorks收购)专门为VB开发环境提供的一个COM接口,主要包含MA TLAB中常用的500多个函数,但用户也仅限于使用这些函数,不能随意编写[收稿日期]2004-04-15[作者简介]冯旭(1970—),男,工程师,主要研究方向:计算机网络与工程1——56自己的M文件1而Matlab最重要的特点是易于扩展,因此应用范围也受到限制1(3)通过DLL实现二者的结合1用户不仅可以使用Matlabvbtrix所提供的MA TLAB基本函数,还可以在MA TLAB中随意编写自己的M-文件,对于一个从事特定领域的工程师来说,还可方便地构造出专用的函数,从而大大扩展了Matlab的应用范围1然后通过M IDEVA转化为VB可调用的DLL,就可以开发出独立的应用程序12 M-文件转化为DLL本文将一个M-文件转换成一个VB可调用的DLL,如果利用MA TLAB编译器,操作的过程很繁琐,需要很多设置1利用Math Tools公司产品Mideva可以大大简化这一过程1以前也有文章介绍这方面操作,由于当时Mideva版本较低,生成DLL仍需要大量的设置,Mideva4.5大大简化了这些过程1操作步骤如下:启动运行Mideva,点击菜单File/Compile to dll,选择要转化的M-文件1这里要转化的M -文件必须是能够作为函数被其他开发环境调用的M-文件,假设文件名为mymfile.m如果要编译M -文件是没有输入也没有输出的脚本文件,可以现将其编辑成无输入无输出的函数1事先可以在Mideva的环境下进行设置,即在菜单Configuration中配置编译的参数为Debug模式或Release模式1转换完成后,可以看到在对应的Debug或Release目录下,有许多编译生成的文件1在VB开发环境中需要用的文件有3个:mymfile.dll(DLL文件)、mymfile.bas(在VB中声明DLL的模块文件)、mymfile. cls(类模块文件,调用DLL的接口)1为了在VB中能够调用生成的DLL,需要将mymfile.dll拷贝到System或者System32目录下;将mymfile.bas、mymfile.cls拷贝到VB当前工程目录下13 VB中调用DLLVB中调用DLL实际是调用mymfile.cls接口,然后通过该接口实现调用System目录下的DLL,这是Mideva4.5新增加的功能,以前在要调用DLL,必须通过矩阵句柄进行,很不方便1准备工作很简单,只需将mymfile.bas和mymfile.cls文件加入到VB当前工程,为了能应用强大的矩阵运算功能,客户端还需安装Matlabvbtrix14 实例分析该例子旨在说明如何在Mideva中生成动态链接库,以及如何在VB中调用生成的DLL1问题:求两个矩阵的和与差1)先在MA TLAB编写程序mymfile.m%mymfile.m实现矩阵的和与差function[ADD,ODD]=mymfile(A,B);ADD=A+B;ODD=A-B;2)用Mideva将mymfile.m转化成mymfile.dll,同时生成VB需要的文件mymfile.bas和mymfile. cls3)将mymfile.bas和mymfile.cls加入到VB工程中;并且在VB工程中引入Matlabvbtrix,过程为点击菜单Project,选择Reference,在Reference对话框中复选Mmatrix,O K14)选择一个窗体,加入一个按钮1为按钮编写单击事件函数为: Private Sub Command1-Click() Dim inputnatrix(0To1),E inputnatrix(0)=ones(2,2) inputnatrix(1)=zeros(2,2) E=mymfile(myinput)——66 E(1).Show E(2).Show End Sub注意:所调用函数自变量数组下标界从0开始,而返回矩阵数组下标从1开始15)调试通过,打包整理,完成一个独立运行的应用软件包15 关于工具箱函数为了在VB中充分利用MA TLAB工具箱诸如自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等的强大功能,在编写含有这些工具箱函数的M-文件时,必须将这些函数完全展开,即将实现这些函数的M-文件拷贝到自己要编写的M-文件中,这样在应用时不至于遇到编译错误1作者成功在VB中调用神经网络工具箱函数,由于篇幅所限,不在此详细说明,大家可以根据自己实际需要参照进行16 小结VB是一个高效快速软件开发平台,但在进行数值计算需要编写大量的代码,还需要反复调试以保证其可靠性和稳定性1通过编写DLL,只须少量代码,并且MA TLAB的算法是经过商业化的考验,比较可靠,省去了许多软件维护费用1特别是要编写一些复杂的算法,例如,大型稀疏矩阵、大型线形方程组的解法、微分方程及偏微分方程的解法等等,以及在此基础上开发更复杂的算法,该方法的优越性将更加明显1但以前提供的类似方法都需要很多设置和烦琐的规定,不易上手,本文介绍的方法是目前VB调用M-文件转化来的DLL最简便的1可以看出这是一种时间、效率上的极好的折衷,它使得你可以将更多的时间放在项目关键问题的思考上,对于广大工程技术人员的开发工作是十分有益的1参考文献:[1]李仁厚,张平.精通MA TLAB-综合辅导与指南[M].西安:西安交通大学出版社,1999.[2]王颖,胡宗军.ActiveX:从Visual Basic6.0调用MA TLAB的实现方法[M].机电工程,19991172-174.[3]How do I call a Compiler generated stand-alone DLL from my Visual Basic application in MA TLAB6.0(R12)www./support/solutions/data/28621.shtm1[4]Steven Holzner.Visual Basic6技术内幕[M].北京:机械工业出版社,1999.C alling a MAT LAB-G enerated Dynamic LinkLibrary in Visu al B asic ProgrammingFENG Xu(Modern Education Technology College Northwest Minorities University,Lanzhou G ansu730030,China)[Abstract]This paper compares the means by which Visual Basic programs call MA TLAB function firstly, then accounts for how to compile a MA TLAB function into a stand-alone DLL and how to call the DLL in VB Programming.The method makes use of the advantages of VB and MA TLAB fully,supplys a power2 ful technical support for the exploitation of application software fasty and effectively.[K ey w ords]MA TLAB;M IDEVA;Matcom;VB;DLL——76。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用VB调用Matlab生成的dll
MATLAB 具有强大的运算功能,VB 具有开发界面友好的特点,可以将二者结合,可以开发出脱离MATLAB 环境的VB程序,即利用VB调用Matlab生成的dll。
工具/原料
Microsft Visual Basic 6
Matlab 7.0
步骤/方法
在MA TLAB 系统中的命令输入comtool命令或点击左下角“Start- > MATLAB - > MA TLAB COMBuilder - > MATLAB COM Builder”,启动MATLAB COM Builder。
建立工程,选择菜单“File - > New Project”,设置工程参数。
设置的工程名为COM 组件编译后的文件名称,也可以输入新类,点击“Add”建立新类。
点击菜单“Project - > Add File. . . ”,向工程中加入M或MEX文件。
点击菜单“Build - >COM Object. . . ”,状态窗口出现“Standalone DLL build complete.”说明生成dll成功。
注册生成的myfunc_1_0.dll,在VB中引用MWComUtil.dll和myfunc_1_0.dll,就可以像调用里边的函数了!
插入完成后,Visual Basic中的具体调用方法和命令
此时Matlab中定义的函数:
function daoju_gonge(z,x,m,ha,c,b)
(函数名daoju_gonge)
VB调用
1.先对所有的参数进行定义(关键)
Private z As Double
Private x As Double
Private m As Double
Private ha As Double
Private c As Double
Private b As Double
Private theDaoju As myDaoju.Daoju
(theDaoju 是自己设定的一个VB中的变量,myDaoju 则是由.m文件编译而成的.dll文件文件名,同时也是其中定义的组件名Component name,daoju则是其类名Class name)
2.调用命令
Call theDaoju.Daoju_gonge(z, x, m, ha, c, b)
3.对VB进行初始化
Private Sub Form_Load()
Set theDaoju = New myDaoju.Daoju
End Sub
注意事项以及相应问题解决
1.在编译dll时,需要机器安装有C或C++编译器,比如安装VC++6.0
2.Matlab启动Comtool工具之前,还需要利用mbuild –setup 命令对compiler(转换器) 设
置,将转换器设置成C++/C语言对应的compiler,而不是Matlab自带的compiler。
Ps:前两条如果没有做到的话,在comtool生成界面往往出错,无法生成dll等相应的文件。
3.如果出现有其他一些小问题,尝试重启Visual Basic或Matlab,再或者重启电脑。
疑难点:
如果对文件进行处理,使其能够在其他电脑上同样实现设定的功能。
可选方案一:文件打包。
Visual Basic打包程序或是Matlab打包程序。