搜档网
当前位置:搜档网 › 关于vb,vc调用matlab的m.文件生成的dll.文件

关于vb,vc调用matlab的m.文件生成的dll.文件

关于vb,vc调用matlab的m.文件生成的dll.文件
关于vb,vc调用matlab的m.文件生成的dll.文件

Matlab函数转换为VB可用的DLL

Matlab函数转换为VB可用的DLL

段晓君

摘要:一种利用Matcom将Matlab函数转换为VB中可用的动态链接库的方法,操作简单易行。

关键词:Matlab函数动态链接库DLL M-文件VB语言

1 Matlab简介

Matlab是MathWorks公司开发的一种工程计算语言。它是一个交互系统,在Matlab 中的基本数据元素是一个不要求维数的复矩阵。用Matlab可解决很多工程计算问题,特别是涉及到矩阵和矢量形式的问题。Matlab是一个高度集成的语言环境,在它的界面下可以编写程序、运行程序并可进行跟踪调试。对于广大的工程技术人员和科学研究人员来说,Matlab不失为一种很好的工具。

Matlab也有局限性,一般它不能脱离Matlab集成环境工作;而且编写界面的功能比较弱。

Matcom是一个从Matlab到C++的编译器,它可以节省用户的运算时间和内存要求。MathTools公司利用Matcom技术编写了Mideva工具软件,它可以借用C++编译器将Matlab下的M-文件转换为可被Visual Basic、Excel以及Delphi调用的DLL 动态链接库或者是独立的可执行文件。本文就M-文件到DLL的转换以及在VB中调用这一类DLL 的2个问题做了一些探讨。文中针对Matlab5.0、VC5.0、VB5.0、Matcom4.0或相应的更高版本的软件进行了讨论。

2 M-文件到DLL的转换

要将一个m-文件编译成DLL,需进行如下操作:启动运行Matcom4的Mideva,点

击菜单File/Compile to dll,选择要转换的m-文件(该文件应该是能够作为函数被其它集成环境调用的m-文件,假设文件名为yourfile.m)。值得注意的是,Mideva对M-文件有一定的要求,即该文件必须是1个函数,如果要编译没有输入也没有输出的脚本文件,可以先在Matlab中将它编辑成无输入无输出的函数,再按照上述操作进行转换。

编译之前,还可以在Mideva集成环境的菜单Configuration中配置编译的参数为Debug模式或Release模式。编译完成之后,在对应的Debug或Release目录下,可以看到一些编译生成的文件。在VB集成环境中需要用到的文件有2个:yourfile.dll(DLL 文件)和yourfile.bas(在VB中声明DLL的模块文件)。为了在VB中能够调用这类DLL,要求将yourfile.bas和matlib42.bas加入到你的工程中,并将yourfile.dll以及matlib42.dll拷贝到工程所在的目录下。编译后,在VB中的函数名为yourfile_in_out,其中,in和out分别为函数的输入参数和输出参数的个数,例如c=conv(a,b),编译转换后的函数名为conv_2_1。

3 数据接口

VB中要使用DLL,必须在你的工程中包含DLL的声明文件(即模块文件),同时还要将DLL拷贝到工程文件所在的目录中。事实上,yourfile.dll中的函数并不能直接与集成环境进行数据交换,它只能通过矩阵句柄进行接口。这些句柄与文件句柄类似,它是用一个32位的矩阵整数来表示的,它们可以被创建,也可以被删除,通过它可以对矩阵数据进行操作。这样,集成环境与DLL之间需要1个中间层,MathTools提供了一个单独的C++库文件Matlib42.dll以及相应的模块文件Matlib42.bas。Matlib42.dll相当于VB集成环境与DLL之间的代理,在这一DLL中包含有20多个矩阵句柄操作函数和800多个从Matlab转换而来的矩阵函数。表1列出了Matlib42.dll提供的比较常用的14个矩阵句柄函数。

在编程的时候,必须调用mtInitM来初始化库文件,即请求允许使用转换的DLL,并调用mtExitM来结束这种请求。另外,还要使用其它的矩阵句柄函数来分配、访问和释放矩阵句柄。

4 应用举例

事实上,最简单的例子是直接调用matlib42.dll中提供的inv_2_1来计算矩阵的逆。为了让读者更好地领会这一转换的意义和操作过程,这里给出另外1个例程:在VB中打开1个记录有10种股票的、500多天的收盘价和成交量的Access数据库,并将指定的1列数据传送给Matlab的函数,由该函数完成股票数据的动态显示。

表1 常用的矩阵句柄函数

函数名功能返回值mtInitM() 请求允许使用库无mtExitM() 结束库使用权限无mtCreateDoubleMatrix(rows,Cols,isc) 分配1个大小为[rows cols]的矩阵句柄新的矩阵的句柄mtDestroyMatrix(x) 释放由上1个函数创建的矩阵句柄无mtGetR(x,row,col,y) 将实数矩阵x的元素[row,col]的值赋给y 无mtSetR(x,row,col,y) 将y的值赋给实数矩阵x的元素[row,col] 无mtGetI(x,row,col,y) 将图象矩阵x的元素[row,col]的值赋给y 无mtSetI(x,row,col,y) 将y的值赋给图像矩阵x的元素[row,col] 无mtGetM(x) 取得矩阵x的行数矩阵x的行数mtGetN(x) 取得矩阵x的列数矩阵x的列数mtGetNumberOf Dimensions(x) 取得矩阵x的维数矩阵x的维数mtIschar(x) 判断x 是否为1个字符串矩阵True/False mtIsComplex(x) 判断x是否为复数矩阵True/False mtSetString(x) 将x设置称1个字符串矩阵无

为了打开数据库文件并显示数据库的数据,我们定制了3个窗体:主窗体,是MDI风格的,只有1个打开数据库的菜单项和1个CommonDialog控件;子窗体1,用于显示数据

库的表项结构,包含有ImageList控件和TreeView控件各1个,其中,ImageList用于存放TreeView的图标,TreeView用于显示表项;子窗体2,用于显示选定表项的数据,包含有Data控件、DbGrid控件和CommandButton控件各1个。在通过菜单项选择要打开的数据库后,子窗体1显示数据库的表项结构,鼠标双击某一表项,子窗体2显示该表项中的数据。

由于篇幅的限制,这里不对VB中如何打开数据库文件作过多的描述。下面详细介绍VB中如何调用Matlab函数转换过来的动态链接库。Matlab函数的源程序如下(DynDataPlot.m):

function DynPlotData(Data)

T=length(Data);

TestPlot(T);%初始化动态显示数据的窗口

MaxY=max(Data);

for k=1:T

y=Data(1:K);

x=1:k;

TestPlot(T,x,y,MaxY);%动态绘制数据曲线

end

function TestPlot(DataNum,x,Data,MaxY)

switch nargin

case 1,%只有1个输入参数,初始化动态显示数据的窗口

fhnd=findobj(allchild(0),′flat′,′Tag′,′TMWWaitbar′);

if ~isempty(fhnd)

close(fhnd);

end

fhnd=figure(′Name′,′Show Db Data′,…

′Units′,′points′,′Resize′,′off′,…

′CreateFcn′,″,′NumberTitle′,′off′,…

′IntegerHandle′,′off′,′MenuBar′,′none′,

′T ag′,′TMWWaitbar′);

AxesHnd=axes(′Parent′,fhnd,′XLim′,[0 DataNum],…

′Position′,[.1.1.8.75],′FontSize′,[11],…

′Box′,′on′,′XGrid′,′on′,′YGrid′,′on′);

title(′Plot Dynamic Curve′);

HndList=[AxesHnd];

set(fhnd,′HandleVisibility′,′callback′,′UserData′,HndList);case4,%4个输入参数时,动态绘制数据曲线

fhnd=findobj(allchild(0),′flat′,′Tag′,′TMWWaitbar′);

HndList=get(fhnd,′UserData′);

DataLen=length(Data);

if DataLen==1

set(HndList(1);′YLim′,[0,MaxY*1.2]);

line(′Parent′,HndList(1),′XData′,[0:1],′YData′,

[Data(1)Data(1)],′Color′,[0 0 1],′

EraseMode′,′none′);

end

if DataLen>1

set(HndList(1),′YLim′,[0,MaxY*1.2]);

axes(HndList(1));

line(′Parent′,HndList(1),′XData′,[DataLen-1:

DataLen],′YData′,Data(DataLen-1 DataLen),

′Color′,[0 0 1],EraseMode′,′none′);

end

end %case

return

按照前面描述的步骤,可以将这一函数转换为dyndataplot.dll,同时得到动态链接库的声明模版文件dyndataplot.bas。在VB中添加了该声明文件,将动态链接库拷贝到VB工程文件的当前目录下,并给子窗体2的CommandButton添加如下代码:

Private Sub Command1_Click()

Dim i,n,m As Long

Dim strMSG As String

′请求允许使用Matlab的文件

Call mtInitM

Dim tmp1,tmp2 As Long

′创建矩阵句柄

tmp1=mtCreateDoubleMatrix(1,n,0)

tmp2=mtCreateDoubleMatrix(1,1,0)

′取得数据库表中1列数值

m=DataGrid.datDataCtl.Recordset.Fields.count

DataGrid.datDataCtl.Recordset.MoveFirst

n=DataGrid.datDataCtl.Recordset.RecordCount

For i=1 To n-1

′将指定数据库表项中的第2列有效数据的第

′i个记录的值取出

temp=DataGrid.datDataCtl.Recordset.Fields(2)

′将取得的值附给矩阵句柄tmp1的第i个单元

Call mtSetR(tmp1,1,i,temp)

DataGrid.datDataCtl.Recordset.MoveNext

Next

′调用Matlab的函数

Call DynPlotData_1_1(tmp1,tmp2)

′释放矩阵句柄

Call mtDestroyMatrix(tmp1)

Call mtDestroyMatrix(tmp2)

′终止Matlab函数的调用权限

Call mtExitM

End Sub

这样,在点击“绘制数据曲线”按钮后,就调用转换后的Matlab函数将数据表项中的第2只股票的数据曲线动态地绘制出来。通过这个示例可以看出,将Matlab的函数转换为

VB中可以调用的动态链接库,操作简单、调用方便。并且充分利用了VB的界面开发能力和Matlab的数据处理和绘图功能。

段晓君(长沙国防科技大学七系研究生队410073)

利用DLL技术实现LabVIEW和MATLAB混合编程_彭宇宁

计算机与现代化  2007年第8期 JIS UAN JI YU X IAN DA I HUA 总第144期 文章编号:1006-2475(2007)08-0093-03 收稿日期:2006-08-14 基金项目:广西自然科学基金资助项目(0663022)作者简介:彭宇宁(1959-),女,四川成都人,广西大学电气工程学院高级工程师,研究方向:过程控制工程,网络化控制,虑拟仪器技术。 利用DLL 技术实现Lab V I E W 和MATL AB 混合编程 彭宇宁,朱 后 (广西大学电气工程学院,广西南宁530004) 摘要:介绍了利用DLL 技术实现LabV IE W 和MA TLAB 进行混合编程的基本原理,并详细阐述了使用M ATLA B 插件和使用M ATLA B 引擎两种方法的步骤,最后对两种方法进行了比较,总结了基于DLL 混合编程的技术特点。关键词:动态连接库;Lab V IE W ;MA TLAB ;混合编程中图分类号:TP311.13 文献标识码:A Usi n g DLL Techni q ue to Reali z eM ixed Progra mm ing wit h La bVI E W andMATLAB PE NG Yu -ning ,ZHU H ou (Instit u t e o f E lectrica l Eng i neering ,Guangx i Un i ve rsit y ,N anning 530004,China ) Ab stract :T his paper i n troduces t he keystone o f usi ng D LL to rea lize the m ixed prog ramm i ng w it h Lab V I E W and M ATLA B .A t t he sa m e ti m e ,t he st eps of bo t h m ethods are expa tia t ed :using M ATLA B A dd -i n and i nvoking M ATLA B engine .In the end o f t he ar ticle ,w e co m pa re t hese t wo m ethods ,and s umm arize the advantages o fm i xed progra mm ing v ia DLL .K ey w ords :DLL ;LabV IE W ;MA TLAB ;m i xed progra mm ing 0 引 言 Lab V I E W 作为虚拟仪器的开发软件,具有功能完整、应用灵活、易于理解、编程简单、开发效率高等优点,已成为虚拟仪器开发事实上的工业标准。但其在工程计算、图 形处理、先进控制、系统建模和仿真方面远不及MATL AB 功能强大。而MATL AB 在循环处理、图形界面开发、数据输入、网络通信、硬件控制等方面也不如Lab V I E W 。因此实现两者混合编程,将两者的优势结合互补不足,对于开发功能更为强大的虚拟仪器具有巨大的推动作用。目前Lab V I E W 和MATLAB 的混合编程方法有三种:第一种基于A ctive X 控件技术,包括MATL AB 脚本节点和Active X 函数模板;第二种基于动态数据交换(DDE )技术;第三种基于组件对象模型(C OM )技术。前面两种方法都不能脱离MATL AB 环境独立运行,第三种方法相对独立且执行效率较高,但不能全面支持MATL AB 的应用。本文利用DLL (动态连接库)技术将La bVI E W 、VC 、MATL AB 混合编程有机结合起来,提出一种新的LabVI E W 和MATLAB 进 行数据交换和控制的方法。 1 基本原理 DLL (Dyna m ic -Link Li b r ary )-动态连接库是基于W indo w s 程序设计的一个重要组成部分,它由一系列 封装好的可执行代码组成,其内部函数能被其他程序所共享。DLL 的编制与具体的编程语言及编译器无关,只要遵守DLL 的开发规范和编程策略,并安排正确的接口,不管用何种编程语言编制的DLL 都具有通用性。LabV I E W 通过CLF (Ca ll Librar y Function N ode )实现对DLL 的函数 [1] 。另一方面,MATLAB 通 过MATL AB 编译器和计算引擎为C 语言提供了功能强大的接口,可将与MATLAB 通讯的C 代码编制成DLL 文件供LabV I E W 调用,实现LabV I E W 和MAT -LAB 间接数据交换。下面举一个简单的例子(本例已在LabV I E W 7.1,M icroso ftV isual C ++6.0,MAT -LAB 6.5上通过),介绍利用DLL 实现LabV I E W 和MATL AB 混合编程的两种途径。

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_H 2. #define _MAX_H_ 3. __declspec(dllexport) int __stdcall fmax(int a,int b); 4. #endif 代码说明: __declspec(dllexport) 的作用是指定导出该函数为DLL函数; __stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用; 备注:使用时需要根据实际定义的主函数返回值类型和函数名称修改低3行红色而自体标记部分内容。这里需要修改的是int数据类型,fmax(int a,int b)的函数名称和变量名称和变量的类型,或者直接从第二步的主程序中复制过来。 第二步: 在头"解决方案资源管理器" --> 源文件 --> 右键 -->添加新建项 -->选择"C++文件(.cpp)" -->输入文件名称(max) --> 添加(A) max.c源文件中的代码为:

vb调用vc 的DLL

4.1 新建工程 打开在VC++6.0,new一个Win32-Dynamic-Link Library工程dlltest。 4.2 在工程中添加代码 4.2.1添加lib.h文件: #ifndef _LIB_H_ #define _LIB_H_ extern “C” int __stdcall add(int,int) ; extern “C” int __stdcall sub(int,int) ; /* __stdcall 约定 如果通过VC++ 编写的DLL 欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall 方式, WINAPI 都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall 方式与__cdecl 对函数名 最终生成符号的方式不同 */ #endif 4.2.2添加lib.cpp文件: #include “lib.h” int __stdcall add(int a,int b) { return a+b ; } int __stdcall sub(int a,int b) { return a-b ; } 4.2.3添加lib.def文件: 右击SOURCE FILE目录,添加一个文本文件(不能是word文档,一般是txt 格式的),将文档重命名为lib.def,点击打开该文档。 在文档中输入代码: LILBRARY dlltest EXPORTS add @ 1 sub @ 2 说明:DLL函数的导出有两种方式。

一种是显式导出:在.h文件中在函数声明前加入如下语句: __declspec(dllexport)。使用该方法是不用添加.def文档的。该方法导出的函数,只能被C或C++调用,不能被其他语言调用。 一种是隐式导出:就是在SOURCE FILE目录中添加一个.def文档,在该文档中写入要导出函数的代码。 .def语法规定注释用分号(;),且注释不能与代码共享一行,代码说明如下:LIBRARY dlltest ;该语句说明了相应的DLL工程。 EXPORTS add @ 1 sub @ 2 ;该语句声明了将DLL工程中导出的函数,只要写入 ;函数名称即可,不用说明返回值以及函数参数。其实@ 1 ;和@ 2是为函数编号所使用的 在添加所有的工程文件后,编译生成dll文件后 4.3 用vc调用DLL 在vc中new一个Win32 Console Application 工程test 代码如下: #include #include typedef int (__stdcall *padd)(int,int) ; typedef int (__stdcall *psub)(int,int) ; int main() { HINSTANCE hd ; hd = LoadLibrary(“填入要调用DLL的路径”) ; if(!hd) { printf(“Load DLL err\n”) ; return 0 ; } padd add = (padd)GetProcAddress(hd,“add”) ; if(!add) { printf(“Get add err\n”) ; FreeLibrary(hd) ; return 0 ; }

VB和Matlab传递数据

VB和Matlab传递数据 lb107 VB和Matlab传递数据 请问: 我想将m函数文件编译成dll文件,在VB里面输入数据然后调用这个dll进行计算,这样能够实现吗? 有兄弟有相关的例子没?网上VC调用Matlab的例子挺多的,但没有VB调用Matlab的例子。 谢谢指点。 2006-3-5 20:19 taohe Re:VB和Matlab传递数据 VB调用DLL会不会很复杂?总感觉VB属于高级编程语言,在调用DLL方面不会比VC更难才对。根据网上你发现的VC调用MATLAB产生的DLL的例子,大概了解MATLAB产生的DLL,然后在VB中调用,貌似应该顺理成章。 使用VB的话,一个好的方案可能是使用MATLAB产生的COM组件,而不是普通的DLL。在VB中可以很方便地使用这些COM组件。MATLAB的在线帮助有较详细的例子,不妨看看。 2006-3-5 23:01 bainhome Re:VB和Matlab传递数据 前一段儿看了看书,做过两个简单的,下面这个是其中之一(曾发在别的论坛上,转一下),因最近实在是太忙,没有时间研究,所以比较基础,没有更加复杂的Trick 比如将VBtext中的数组作为COM的input、图形绘制等等,VB代码:[code] Private addn As addn.Add Private Sub Command1_Click() Dim x As Double Dim y As Variant x = CDbl(Text1.Text) Call addn.numadd(1, y, x) Text2.Text = y End Sub Private Sub Command2_Click() End End Sub Private Sub Form_Load() Set addn = New addn.Add Form1.Caption = "VB调用MATLAB示例" Text1.Text = 2 End Sub [/code] [code] function y=numadd(x) y=2*x; [/code] COM组件调用格式: [code]call h.func(numout,arg1,arg2,...)[/code] MATLAB中的函数书写格式: [code][out1,out2,out3]=myfunc(arg1,arg2)[/code] 则VB的调用应该为: [code]call object.myfunc(3,out1inVB,out2inVB,out3inVB,arg1inVB,arg2inVB)[/code] “3”指的是输出变量的数目 另外当多个版本的MATLAB在同一PC上时,VB只认其中一个版本产生的COM,不知道是不是环境变量设置的问题。 2006-3-6 09:41 lb107 Re:VB和Matlab传递数据 谢谢楼上二位的指点!! 我的想法也是利用comtool直接将m文件编译成COM组件,然后在VB中调用实现应该是没有问题,但是在交换数据方面肯呢感有点难度,我只想找几个具体的例子看看其调用的根据体过程 谢谢!! 2006-3-6 19:53 taohe Re:VB和Matlab传递数据 [quote][b]lb107 wrote:[/b] 谢谢楼上二位的指点!! 我的想法也是利用comtool直接将m文件编译成COM组件,然后在VB中调用实现应该是没有问题,但是在交换数据方面肯呢感有点难度,我只想找几个具体的例子看看其调用的根据体过程 谢谢!! [/quote] 如果用comtool也就是使用COM组件的话,事情就更好办了。因为进入COM世界后,所有的数据都是VARIANT,而VB和COM是非常亲近的关系,在VB中使用COM比起其他语言比如C++来说显得更为轻松。还得重复一下,matlab的在线帮助上关于COM组件的应用几乎全部是VB作为应用程序例子,不妨看看。2006-3-6 20:05 lb107Re:VB和Matlab传递数据 我的英语不太好 taohe 老师能给一个具体的链接地址吗?? 谢谢 2006-3-6 20:46 taohe Re:VB和Matlab传递数据 你指什么连接地址?我刚才说的在线帮助是matlab安装文档。 本来matlab的公司MathWorks的网站上有每次最新版的matlab的帮助文档连接。不过现在MathWorks网站上的连接好像已经变成新版matlab R2006a的文档了。所以只好看matlab安装后的在线帮助了。 matlab不知你用那个版本的matlab,不管那个版本,在matlab环境中运行doc,然后在出来的帮助文档中寻找相关的话题。如果是matlab6.5.x的话,应该在matlab com builder,如果是matlab7.x的话应该是matlab builder for com。 里面有例子程序,如果VB好的话,应该没有问题的。别怕英文。 可惜我是VB盲,无法给出具体的帮助。 Good luck! 2006-3-6 22:40 lb107 Re:VB和Matlab传递数据 再次谢谢 2006-3-12 21:35 godzilla2000cn Re:VB和Matlab传递数据 如果matlab中生成的图片怎么传到VB里,也就是在VB中用什么控件来接收matlab的fig??? 2006-11-1 19:46 tian7tian 大家好啊! 我现在是将m文件组成com组件,还没搞定呢,总出现错误! 2006-11-8 19:46 jimin 看了bainhome版主的一个例子后,做了个vb调用matlab时隐藏matlab figure 的例子 Private Sub Command1_Click() Dim objMATLAB As Object Set objMATLAB = CreateObject("matlab.application") Dim strEnter As String Dim strCommand As String strEnter = Chr(13) & Chr(10) strCommand = "figure('visible', 'off', 'Units','points','PaperUnits', 'points');" strCommand = strCommand & strEnter strCommand = strCommand & "surf(peaks(25));" strCommand = strCommand & strEnter strCommand = strCommand & "print -dmeta" strCommand = strCommand & strEnter strCommand = strCommand & "close(gcf)" strCommand = strCommand & strEnter objMATLAB.execute (strCommand) imgDraw.Picture = Clipboard.GetData() imgDraw.Refresh Set objMATLAB = Nothing End Sub 2006-11-12 10:42 WaitingForMe Matlab的代码或者窗口, 用combuilder编译以后, 可以直接在VB里面引用. 如果需要移植到其他计算机上, 需要在目标计算机上安装一个虚拟机, 大概8M大小. 2006-11-12 13:59 bainhome [quote]Matlab的代码或者窗口, 用combuilder编译以后, 可以直接在VB里面引用. 如果需要移植到其他计算机上, 需要在目标计算机上安装一个虚拟机, 大概8M大小.[/quote] 前一句话已经基本实现,后一句话不太明白...什么虚拟机?还是java虚拟机吗(自己感觉不像)?请教一下^_^ 2006-11-29 19:23 tian7tian 关于bainhome写的程序,我问个问题,关于 function y=numadd(x) 其中y定义为variant,x定义为double类型;是不是类型是固定的呢? x可以定义为string类型么? 2006-12-11 14:43 tian7tian 有哪位了解的话,有时间的话,给答复一下,谢谢了!! 2006-12-31 01:24 WaitingForMe [quote]原帖由[i]bainhome[/i] 于2006-11-12 13:59 发表 前一句话已经基本实现,后一句话不太明白...什么虚拟机?还是java虚拟机吗(自己感觉不像)?请教一下^_^ [/quote] Combuilder创建的程序,移植到没有安装Matlab的电脑上的时候,需要安装一个什么包,都忘了,这个是Matlab的帮助,自己看帮助吧 MATLAB COM Builder: Overview: Packaging and Distributing the Component 2007-7-20 15:53 shiwenyaboa

vs2008中c调用matlab生成的dll文件

VS2008中C#调用Matlab生成的DLL文件 1、创建一个简单的.m文件 打开Matlab 2009a,新建一个.m文件,输入如下代码:function result=twice(inputvar); result=2*inputvar; 将代码保存为twice.m文件,如图所示。 2、使用Matlab DeployTool生成.Net组件 在Matlab 2009a的Command Window中输入deploytool 并回车,如图所示。 就可以打开Matlab的DeployTool,如图所示。 在DeployTool窗体中,点击新建按钮,打开新建项目对话框,如图所示。 在左边的列表中选择MATLAB Builder NE,并在右边的列表中选择.NET Component,我们将这个工程命名为twice.prj,并点击OK,则进入项目设置界面,如图所示。

在Twice文件夹中添加我们刚才建好的.m文件,如图所示。 点击编译按钮或使用快捷键Ctrl+B则对该工程进行编译。编译完成后的主窗口如图所示。 3、创建一个测试用的Windows应用程序,将其命名为MatlabTest,如图所示。 4、添加对MWArray.dll的引用 MWArray.dll一般位于[Matlab安装位 置]\R2009a\toolbox\dotnetbuilder\bin\win32\v2.0文件夹中,我们注意到Matlab 2009a对应的MWArray.dll是2.9.0.0版本的。在进行Matlab版本升级的时候,比较头疼的就是这个dll。 因为版本升级意味着之前生成的dll都需要重新生成。关于版本升级的问题,我将在后面的博文中详细介绍。 之所以添加MWArray.dll,是因为在这种混合编程方式下,我们经常要 using https://www.sodocs.net/doc/059427317.html,.Arrays; using https://www.sodocs.net/doc/059427317.html,.Utility; 5、添加对Matlab生成的twice.dll的引用。

Matlab调用MFC应用实例

//MainFunction.cpp #include "stdafx.h" #include "mex.h" #include "MFCDialog.h" voidmexFunction(intnlhs, mxArray *plhs[], intnrhs, constmxArray *prhs[]) { mxArray *pa=NULL; double *x=NULL; double *y=NULL; double *result=NULL; charstrbuf[50]; if(nrhs!=2) { mexErrMsgTxt("You can only input 2 arguements!"); return; } else { x=mxGetPr(prhs[0]); y=mxGetPr(prhs[1]); sprintf(strbuf,"x=%f,y=%f",*x,*y); mexPrintf(strbuf);

plhs[0]=mxCreateDoubleMatrix(1,2,mxREAL); result=mxGetPr(plhs[0]); result[0]=*x; result[1]=*y; mexPrintf("\nStart MFC\n"); MFCDialog *a; a=new MFCDialog(); if(a->DoModal()==IDCANCEL) { mexPrintf("Exit MFC\n"); } mexPrintf("End MFC\n"); } } // MFCDialog.cpp : implementation file // #include "stdafx.h" #include "MFCPlot.h" #include "MFCDialog.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE

遗传算法的VB程序【精品毕业设计】(完整版)

遗传算法的VB程序 最近看了下遗传算法,刚看了一点,就觉得手痒,非要把程序编制出来看看效果(我现在总认为那些理论再高深,无法用计算机实现就是空话,呵呵)。下面是我调试了好久的代码,无赖没有学过数据结构&算法,程序写的很差,单效果还是出来了,高兴,和大家共同分享下成果吧。 还是一样,不想说原理,因为这里想搞个公式上去N麻烦。直接给点实际的东西。具体步骤是参考《MATLAB遗传算法工具箱及应用》(西安电子科技大学出版社)16~22页的相关说明编制的,有兴趣的同学可以去看看这本书。 在程序调试成功的同时,郁闷的是工作的事情,现在好多企业久是指名不要研究生,而我又是一个四不象,本专业是热能工程,可我本专业基本上还是本科水平,大部分时间都去自学一些杂七杂八的东西去了,比如人工智能,PLC,自动控制方面,图像处理啊,可又只是懂个皮毛,现在找工作也不知道怎么给自己定位了。有相关经历的同学可要指点我一二哦。 Option Explicit '程序实现功能:用遗传算法求函数的最大值 '作者: laviewpbt '联系方式: 'QQ:33184777 '版本:Version 1.4.0 '说明:复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议 Dim N2(30) As Long '用来保存2的N次方的数据 Dim Script As Object '调用其Eval函数 Public Enum CrossOver OnePointCrossOver '单点交叉 TwoPointCrossOver '两点交叉 UniformCrossOver '平均交叉 End Enum Public Enum Selection RouletteWheelSelection '轮盘赌选择 StochasticTourament '随机竞争选择 RandomLeagueMatches '随机联赛选择 StochasticUniversalSampleing '随机遍历取样 End Enum Public Enum EnCoding Binary '标准二进制编码

MATLAB调用C++DLL

MATLAB调用C++动态库的方法 声明:本人知识水平有限,文档中难免有错,望谅解! 一、方法步骤 1、首先确定你的动态库正确,并将你的动态库(例如:Demo.dll)和静态链接库 (Demo.lib)和自定义的相关头文件(例如:Demo.h等)拷贝到当前工作目录下,当然也可以将你的动态库拷贝到C盘的windows\system32目录下。 2、写.cpp文件,并用mex命令生成.mexw64或者.mexw32文件(这由你的系统决定), 其实,这个文件起转换作用。也就是说,你用MATLAB调用C++动态库就必须通过 这个文件去调用,而这个文件就是由.cpp文件生成的。 这个.cpp文件中必须包含这个mexFunction函数,格式也必须如下: void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) nlhs:输出参数个数 plhs:输出参数列表 nrhs:输入参数个数 prhs:输入参数列表 不过函数名可以随便取的。在这个函数中你就可以去调用C++动态库的函数了。 记住头文件:”mex.h”…… 注意:保存的文件名就是将来在MATLAB中调用的函数名,而不是这里的函数名。 3、使用mex命令编译XXX.cpp。如:mex xxx.cpp ;那么系统将生成xxx.mexw32或者xxx.mexw64 文件。这个文件的文件名就将是你要调用的函数名; 4、现在就可以写脚本调用这个函数了。 二、案例 1、现在生成了一个C++动态库Demo.dll\Demo.lib,还有头文件Demo.h;里面定义了一个函数 double Demo_Add( double x, double y); //功能:将两个数相加并返回 这些大家都知道,不用我说了吧。 2、在MATLAB中写一个c++文件Test.cpp: #include "mex.h" #include "Demo.h" #pragma comment(lib,"Demo.lib") void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { if( nrhs != 2) //判断输入参数的个数

VB调用动态链接库(DLL)

VB调用动态链接库(DLL) 作为一种简单易用的Windows开发环境,Visual Basic 从一推出就受到了广大编程人员的欢迎。它使程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。但凡事有利必有弊。 VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows 交互的机会。因此,相比而言,VB应用程序的执行效率和功能比C/C++或Delphi生成的程序要差。为了解决这个问题,在一个大型的VB开发应用中,直接调用Windows API函数几乎是不可避免的;同时,还有可能需要程序员自己用 C/C++等开发一些动态连接库,用于在VB中调用。本文主要讨论在32位开发环境Visual Basic 5.0中直接调用Windows 95 API函数或用户生成的32位动态连接库的方法与规则。 Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。尽管动态连接库也能输出数据,但

实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。多个应用程序共享一个动态连接库还能有效地节省系统资源。正因为如此,在Windows系统中,动态连接库得到了大量的使用。 一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、commdlg.dll等。但也有例外,如16位Windows 的核心部件之一GDI.exe其实也是一个动态库。编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。下面只以Visual C++5.0为例,介绍一下开发应用于VisualBasic5.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以VC5为例;所有涉及VisualBasic的地方都以VB5 为例)。 作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题: 1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API

vb调用matlab的四种方法

一、借助ActiveX部件 Microsoft把所有以COM为基础的技术统称为ActiveX技术。自动化是大多数ActiveX技术的基础,它可使解释性的宏语言(如VB)能够在不了解应用程序实现细节的情况下控制自动化对象。Matlab实现了ActiveX自动化服务支持,在VB下通过ActiveX自动化接口可将Matlab作为Visual Basic语言的一个ActiveX部件调用。 Matlab ActiveX自动化服务的功能主要包括在Matlab工作空间执行Matlab命令,以及直接从工作空间存取矩阵等,下面列出了Matlab自动化服务支持的几个主要方法,其参数和返回值的类型采用ActiveX自动化协议所定义的与语言无关的类型描述: ● BSTR Execute([in] BSTR Command); BSTR表示宽字符串类型,它与VB存储字符串所采用的数据格式相同。该方法接收字符串命令并在Matlab中执行,将结果以字符串形式返回。 ● void GetFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in, out] SAFEARRAY(double)* pr,[in, out] SAFEARRAY(double)* pi); 该方法从指定的工作空间检索一个完整的一维或二维的实型或虚mxArray,其实部和虚部被分别存放到两个单独的Double型数组中。 ● void PutFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in] SAFEARRAY(double) pr,[in] SAFEARRAY(double) pi); 该方法将一个mxArray放入指定的工作空间。各参数的含义及调用方法与GetFullMatrix方法类似。 示例代码如下: 1Dim Matlab As Object ’声明对象 2Dim MReal1(5,5) As Double ’声明存放实部的Double型数组 3Dim MImag() As Double ’声明存放虚部的Double型数组 4Set Matlab=CreateObject(“Matlab.Application”) '初始化对象 5Matlab.Execute(“a=hilb(5)”) '执行Matlab命令 6Call Matlab.GetFullMatrix(“a”,“base”,MReal1,MImag) '将结果分别存入实部、虚部数组 复制代码 二、借助DDE技术 DDE(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼此间的通信。应用程序间彼此通信要先建立一个DDE会话,对会话进行初始化的应用程序称为客户端(Client),对Client端作出响应的应用程序称为服务器(Server)。图1描述了Matlab 作为服务器时与其他应用程序的通信机制。

Matlab调用VC生成的dll的具体步骤

Matlab调用C生成的dll的具体步骤一、C生成dll文件(以vs2008为例) 1创建项目: Win32->Win32项目,名称:MyDLL

2新建头文件testdll.h,并编写相关程序 注:一定要注意头文件的写法,此法是支持C的头文件,Matlab调用DLL只支持用C 语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。

具体程序如下 #ifndef MATLABDLLTEST_H #define MATLABDLLTEST_H #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) double add(double x, double y); #ifdef __cplusplus } #endif #endif 3新建源文件testdll.cpp,并编写相关程序

具体程序如下所示: #include "stdafx.h" #include "testdll.h" double add(double x, double y) { return (x+y); } 4新建模块定义文件mydll.def,并编写相关程序

二、Matlab调用生成的dll 1、编译器准备 1)在Matlab的命令窗口输入:mex -setup

2)选择你的编译器,我的是: [2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.0 2、加载DLL:把编译连接之后产生的myDLL.dll和testdll.h文件拷贝到Matlab的当前工作目录下,并编写.m函数 具体程序 clc; clear all; close all; addpath('dll的具体路径即Matlab的当前工作路径')%输入dll文件具体的存储路径 loadlibraryMyDLLtestDLL.h alias lib%加载MyDLL库,并重命名为lib,注意加载时常常需要MyDLL的头文件 libfunctionsview lib %执行此命令后会生成如下窗口

VB如何调用dll函数

VB如何调用dll函数 2008-01-10 17:17 開始習慣孤單 | 分类:VB| 浏览13089次 假如我有个DLL,名为 asdfg.dll 它里面有一个函数 zxc(参数1,参数2) 我要用这个函数,该怎么写? 请高手帮我写出脚本,有时间的话请再加上注释 谢谢!! 2008-01-10 19:50 提问者采纳 1.在工程-引用中将asdfg.dll引用过来 2.dim AAA as asdfg 'asdfg是类模块的名称 Private Sub Form_Load() dim x Set AAA = New asdfg x = AAA.zxc(参数1,参数2)'参数1,2自己写 End Sub 建议你了解一下下面dll的制作方法,理解就更透彻了。下面内容来自百度。 1.新建一个ActiveX Dll,工程名字为vbmytestdll,类模块

名字为mytestdll 2.类模块内容只有一个函数,主要返回DLL的HELLO WORLD Public Function dlltest1() As String dlltest1 = "HELLO WORLD" End Function 3.保存,生成DLL,名字为 vbmytestdll.dll 4.新建一个EXE工程,在菜单: 工程---引用---浏览里找到vbmytestdll.dll,把它引用进来 5.EXE工程代码如下: Option Explicit Dim testdll As mytestdll'类模块名字 Private Sub Form_Load() Set testdll = New mytestdll 'DLL的一个新实例 Me.Caption = testdll.dlltest1 '我的标题=返回DLL的HELLO WORLD

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中完成矩阵运算与图形绘制显示等功能,这种方法使用起来简单,编程效率较高。MatrixVB函数库的功能大致可分为8大类(矩阵运算、运算符重载、图形图像处理、最优化运算、多项式、信号处理、随机与统计分析、控制系统)。 除以上3种方式外,我们还可以通过DDE的方式实现VB与MATLAB的数据通信。 3.2 MatrixVB 环境设置 3.2.1 在VB应用中引入MatrixVB

一步一步教用VC和VB调用C++ DLL

一步一步教你用VC和VB调用C++ DLL 从VC++应用程序调用C++ DLL的函数 Visual Studio 6 使创建包含函数或类的动态连接库(DLL) 变得非常容易.第一步 打开Visual Studio 然后选择File | New菜单项: 选择Win32 Dynamic Link Library, 输入工程名, 敲OK.

选择A DLL that exports some symbols 并单击Finish.在File View里你会看到如下的工程文件: 第二步 在Test.cpp里,你将看到如下代码: // Test.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "Test.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_ call, LPVOID lpReserved)

{ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // This is an example of an exported variable TEST_API int nTest=0; // This is an example of an exported function. TEST_API int fnTest(void) { return 42; } // This is the constructor of a class that has been exported.// see Test.h for the class definition CTest::CTest() { return; } Test.cpp 包含了fnTest 和 CTest::CTest.如果你现在编译Test.dll, 你将会得到一个可以被其他VC++应用程序直接调用的DLL. 允许其他VC++程序调用的关键机制?( key mechanism)就包含在Test.h中: // The following ifdef block is the standard way of creating macros// which make exporting from a DLL simpler. All files within this DLL// are compiled with the TEST_EXPORTS symbol defined on the command line.// This symbol should not be defined on any project that uses this DLL.// This way any other project whose source files include this file see // TEST_API

相关主题