将Matlab函数转换为VB可用的DLL
《电脑与信息技术》2000年第1期
将Matlab函数转换为VB可用的DLL
段晓君杜小勇易东云
(国防科技大学系统工程与数学系长沙410073)
摘要
Matlab是一种很受广大工程技术人员喜爱的数学工具软件,为我们提供了强大的矩阵处理和绘图
功能。由于它的界面功能比较弱,给我们开发界面友好的应用或演示系统带来不便。文章介绍了
一种用Matcom将Matlab函数转换为VB中可用的动态链接库的方法,操作简单易行。
关键词
Matcom Matlab函数VB动态链接库
0引言
Matlab是MathWorks公司开发的一种工程计算语言。用这个交互系统可以解决很多工程计算问题,
特别当涉及到矩阵和矢量形式的问题时,Matlab提供了强大的矩阵处理和绘图功能,而用C语言或
Fortran语言来解决相应的问题则编程量比较大。Matcom是一个从Matlab到C++的编译器,它可以
节省用户的运算时间和内存要求。Math-Tools公司利用Matcom技术编写了Mideva工具软件,它可
以借用C++编译器将Matlab下的M文件转换为可被VisualBasic、Exe-cl以及Dephi调用的DLL(动态
链接库),亦可编译成独立的标准可执行文件,不需装载任何附加产品。本文就M文件到DLL 的转换
以及在VB中调用这一类DLL两个问题做了一些探讨。文中,我们是基于Mat-lab5.0、VC5.0、VB5.0、
Matcom4.0或相应的更高版本的软件进行讨论的。
1M文件到DLL的转换
将Matlab的数值计算和绘图功能内嵌到VB中,需要用到Matcom工具。可在网上下载MIDEV A及Matcom,
网址为:https://www.wendangku.net/doc/da538597.html,。
安装Matcom4.0可按照如下步骤:
step1在目录下找到Mat4vc.exe,运行直至完成;
step2在Windows98或95的Dos环境下,运行Mc4reg.exe,并按提示的要求输入使用日期(开始至结束
区间:date\month\year—date\month\year),并由此产生密码;
step3启动软件MIDEV A。第一次启动时,要输入step2中生成的密码,并按要求输入Matlab 和VC所在
的目录。
要详细了解使用方法,可利用AcrobatReader3.0阅读文件Matcom40\doc\usr-guide.pdf。要将一个m
文件编译成DLL,可进行如下操作:启动运行Matcom4的Mideva,点击菜单File/Compiletodll,选择需
要转换的m文件(该文件是你希望它能够作为函数被其他集成环境调用的m文件,假设文件名为
yourfile.m)。值得注意的是,Mideva对M文件有一定的要求,即该文件必须是一个函数,否则需先在
Matlab中将它编辑成无输入无输出的函数,再按照上述操作进行转换。编译之前,还可以在Mideva
集成环境的菜单Configuration中配置编译的参数为Debug模式或Release模式。编译完成之后,在对
应的Debug或Release目录下,可看到一些编译生成的文件。在VB集成环境中需要用到的文件有两个
:yourfile.dll(DLL文件)和yourfile.bas(在VB中声明DLL的模块文件)。为在VB中能调用这类DLL,
要求将yourfile.bas和matlib42.bas加入到你的工程中,并将yourfile.dll以及matlib42.dll拷贝到工程所在的目录下。编译后,我们在VB中的函数名为yourfileinout,其中,in和out分别为函数的
输入参数和输出参数的个数,例如c=conv(a,b),编译转换后的函数名为conv21。我们可以在VB下直
接调用相应的DLL使用计算功能,不需再到Matlab下进行编译执行。虽然要用到VC,但Matcom不要求
用户编写C++的转换源代码,只需直接在VB下调用模板即可。这样,用户不需了解较底层的编程语言,
只要基于Matlab和VB,加上Matcom转换工具即可做出涵括数值计算、图形显示、数据库处理及智能
交互界面等的软件。
2数据接口
VB中要使用DLL,你的工程中需包含DLL的声明文件即模块文件,还要将DLL拷贝到工程文件所在的目
录中。事实上,Y ourfile.dll中的函数并不能直接与集成环境进行数据交换,它只能通过与文件句
柄类似的矩阵句柄进行接口。句柄用一个32位的矩阵整数表示,它们可被创建,也可被删除,通过它
们可以对矩阵数据进行操作,故而集成环境与DLL之间需要一个媒介。Math-Tools提供了一个单独
的C++库文件Matlib42.dll以及相应的模块文件Matlib42.bas,它相当于VB集成环境与DLL 之间的代
理,在这一DLL中包含有20多个矩阵句柄操作函数和800多个从Mat-lab转换而来的矩阵函数。这里
列出了Matlib42.dll提供的比较常用的14个矩阵句柄函数:
函数名功能返回值
mtInitM() 请求允许使用库无
mtExitM() 结束库使用权限无
MtCreateDoubleMatrix(rows,Cols,isc) 分配一个大小为[rows,cols]的矩阵句柄新矩阵的句柄MtDestroyMatrix(x) 释放由上一函数创建的矩阵句柄无
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的列数
MtGetNumberOfDimensions(x) 取得矩阵x的维数矩阵x的维数
mtIsChar(x) 判断x是否为一个字符串矩阵 True/False
MtIsComplex(x) 判断x是否为复数矩阵 True/False
MtSetString(x) 将x设置成一个字符串矩阵无
编程时必须调用mtInitM来初始化库文件,即请求允许使用转换的DLL,并调用mtExitM来结
束这种请
求。另外,还要使用其它的矩阵句柄函数来分配、访问和释放矩阵句柄。
3应用举例
事实上,最简单的例子是直接调用matlib42.dll中提供的inv21来计算矩阵的逆。为了让读者更好地
领会这一转换的意义和操作过程,我们给出另外一个例子:在VB中打开一个记录有十种股票五百多
天的收盘价及成交量的Acess数据库,并将指定的一列数据传送给Matlab的函数,由该函数完成股票
数据的动态数据曲线绘制。
为了打开数据库文件并显示数据库的数据,我们定制了三个窗体——MDI风格的主窗体,只有一个打
开数据库的菜单项和一个CommonDialog控件;子窗体1,用于显示数据库的表项结构,包含有ImageList
控件和TreeView控件各一个,其中,ImageList用于存放TreeView的图标,TreeV iew用于显示表项;
子窗体2,用于显示选定表项的数据,包含有Data控件、DbGrid控件和Com-mandButton控件各一个。
在通过菜单项选择要打开的数据库后,子窗体1显示数据库的表项结构,鼠标双击某一表项,子窗体2
显示该表项中的数据。图1就是运行VB中程序打开数据库文件后的画面。
下面我们详细介绍一下VB中如何调用Matlab函数转换过来的动态链接库。
Matlab函数的源程序为DynDataPlot.m,输入参数和输出参数各一。源程序如下:
function DynPlotData(Data)
T=length(Data);
TestPlot(T);%初始化动态显示数据的窗口
MaxY=max(Data);
fork=1∶T
y=Data(1∶k);
x=1∶k;
TestPlot(T,x,y,MaxY);%动态绘制数据曲线
end
function TestPlot(DataNum,x,Data,MaxY)
switch nargin
case1,%只有一个输入参数,初始化动态显示数据的窗口
fhnd=findobj(allchild(0),′flat′,′Tag′,′TMWWaitbar′);
if~isempty(fhnd)
close(fhnd);
end
fhnd=figure(′Name′,′ShowDbData′,…′Units′,′points′,′Resize′,′off′,…′CreateFcn′,",′NumberTitle′,′off′,…
′IntegerHandle′,′off′,′MenuBar′,′none′,′Tag′,′TMWWaitbar′);
AxesHnd=axes(′Parent′,fhnd,′XLim′,[0DataNum],…′Position′, [.1.1.8.75],′FontSize′,[11],…′Box′,′on′,′XGrid′,′on′,
′YGrid′,′on′);
title(′PlotDynamicCurve′);
HndList=[AxesHnd];
set(fhnd,′HandleVisibility′,′callback′,′UserDa-ta′,Hn dList);
case4,%四个输入参数时,动态绘制数据曲线
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′,[001],
′EraseMode′,′none′);
end
if DataLen>1
set(HndList(1),′YLim′,[0,MaxY*1.2]);
axes(HndList(1));
line(′Parent′,HndList(1),′XData′,[DataLe n-1ataLen], ′YData′,…Data(DataLen-1ataLen),′Color′,[001],
′EraseMode′,′none′);
end
end%case
return
按照前面描述的步骤,我们可以将这一函数转换为dyndataplot.dll,同时得到动态链接库的声明
模板文件dyndataplot.bas。在VB中添加了该声明文件,将动态链接库拷贝到VB工程文件的当前目
录下,并给子窗体2的CommandButton添加如下代码:
Private Sub Command1Click()
Dim i,n,m As Long '注:概念性错误,i,n为V ariant
Dim strMSG As String’请求允许使用Matlab的文件
Call mtInitM
Dim tmp1,tmp2 As Long′创建矩阵句柄
tmp1=mtCreateDoubleMatrix(1,n,0)
tmp2=mtCreateDoubleMatrix(1,1,0)’取得数据库表中一列数值
m=DataGrid.datDataCtl.Recordset.Fields.count
DataGrid.datDataCtl.Recordset.MoveFirst
n=DataGrid.datDataCtl.Recordset.RecordCount
Fori=1 To n-1
’将指定数据库表项中的第二列有效数据的第I个记录的值取出temp=DataGrid.datDataCtl.Recordset.Fields(2)
’将取得的值附给矩阵句柄tmp1的第I个单元
Call mtSetR(tmp1,1,i,temp)
DataGrid.datDataCtl.Recordset.MoveNext
Next
′调用Matlab的函数
Call DynPlotData11(tmp1,tmp2)
′释放矩阵句柄
Call mtDestroyMatrix(tmp1)
Call mtDestroyMatrix(tmp2)
’终止Matlab函数的调用权限
Call mtExitM
EndSub
这样在点击“绘制数据曲线”的按钮后,就可调用转换后Matlab的函数将数据表项中的第二支
股票的数据曲线动态地绘制出来。其实,此技术的真正优势在于可充分利用Matlab的强大
矩阵
计算功能,例如可对股票趋势预测模型进行实时处理和估计,图2给出了股票预测的相关趋势走
向图形。
通过这一例子,不难看出将Matlab的函数转换为VB中可以调用的动态链接库的操作简单且调用
方便。能够充分集成VB的界面开发的能力和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 混合编程的两种途径。
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源文件中的代码为:
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
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.wendangku.net/doc/da538597.html,.Arrays; using https://www.wendangku.net/doc/da538597.html,.Utility; 5、添加对Matlab生成的twice.dll的引用。
//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
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) 作为一种简单易用的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
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函数 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
一步一步教你用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
将MATLAB函数编译成dll 供VC调用的方法 1简介 1.1 MATLAB简介 MATLAB名字是由MATrix和LABoratory两词的前三个字母组合而成。是美国新墨西哥大学计算机科学系主任的Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。 经几年的校际流传,在Little的推动下,由Little、Moler、Steve Bangert合作,于1984年成立了MathWorks公司,并把MATLAB正式推向市场。 目前,MATLAB己经成为应用最广泛的科学工程计算软件,它广泛的应用于自动控制、数学运算、信号分析、图象处理、财务分析等各行各业。用MATLAB 编写的数学运算及图像处理等程序十分简单,在MATLAB里有大量的MATLAB 库函数,包括初等数学函数、线形代数函数、矩阵操作函数、数值计算函数、特殊数学函数、插值函数等等,还可以利用MATLAB的编译工具将m文件方便的转化为C\C++语言、可执行程序(exe)、动态连接库文件(dll)、COM组件等等,并可直接供C\C++语言调用。 为什么要用VC与MATLAB接口? 既然MATLAB拥有强大的数值计算功能,利用VC与MATLAB接口可以充分发挥它的数值计算功能,并且可以不依赖MATLAB软件运行,在VC下做出漂亮的界面,把复杂的数据处理交给MATLAB去做。 1.2 MATLAB函数编译为dll与VC之间的通讯方式 1、使用自带的MATLAB Compiler 2、使用MATcom工具 3、在MATLAB下做com组件,在VC中调用com组件(出现了点问题,目前还没找到解决方法,这种方法在m文件较大、用matcom、调用math library 或使用mcc方式无法实现的时候,推荐使用)
怎样用VB编写DLL文件??? 你先打开VB,然后先中“ActiveX Dll”工程,然后开始编辑。编完后,保存一般是以“.cls”和“.vbw”保存。这时你选择“文件”菜单,弹出下拉框,选中“生成.dll”选项,它就会在上面弹出一个进度条“正在生成.dll文件”。生成以后是一个有好象齿轮状的图标。 如果你要引用,就开一个“标准EXE”工程,然后在“工程”选项中,单击“引用”,找到你刚才的“.dll”的文件名,在前面的复选框中打勾,就可以引用你刚才在那里面写的方法等。 在vb6里建新工程时选用建立dll 做好后用vb的引用就可以了 VB中创建的DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。其实MS 非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。 VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句: Sub Main If MsgBox("哈哈", vbOKCancel) = vbOK Then Shell "link2.exe " & Command$ End If End Sub 然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。这样在VB调用Link.EXE时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷贝出来了。然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd: Public Function mathadd(ByVal a As Long, ByVal b As Long) As Long mathadd = a + b End Function 编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是: Link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS 注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要: Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long
用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打包程序。
1制作好DLL之后,就可以用VB调用它,实现VB调用C程序。VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。 语句格式为:Declare Sub过程名Lib[Alias"别名]([ByVal参数AS类型]),或为Declare Function函数名Lib[Alias"别名]([ByVal参数AS类型])AS类型在声明中首先用Declare 关键字表示声明DLL中的函数。在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。 例如上面的ADD.DLL在VB中就可以声明为: Declare Function ADD Lib“c:\ADD.dll”(ByVal X AS Integer,ByVal Y AS Integer,ByVal filein asstring)AS Integer 通过此声明语句将函数ADD声明到VB中,便可直接调用。 2、dll文件中的函数好像是C语言写的, //函数名:int__stdcall GetMacNo(int*MacNo) //功能:获取卡机的卡机号(单机时) //参数:MacNo[0]-被读出的卡机号 //返回值:0-成功, //2-PC接收超时, //3-应答错误 dll的文件名是COMM232.dll 函数的形参int*MacNo是指针吗? 在VB中应该怎么声明和调用该函数? VB里也可以定义指针吗? 问题补充:vb调用dll文件中的函数我是会的,但这儿的形参有一个星号才不知是怎么一回事, 我是这样声明的对吗? Public Declare Function GetMacNo Lib"COMM232.dll"(ByVal MacNo As Integer)As Integer 又应该怎么调用呢?要先定义一个指针的变量再传给*MacNo还是要怎么做? 都说了MacNo是被读出的卡机号,那么就是传址的了。 dim l as integer dim m as integer l=GetMacNo(m) if l=0then label1.caption="卡机号:"&m elseif l=2then msgbox"PC接收超时" elseif l=3then msgbox"应答错误" end if
CSharp使用DLL进行调用MatLab混编 Lanix Beavis 2013/1/27 Beijing Normal University, 978109939@https://www.wendangku.net/doc/da538597.html, 软件配置 (2) 一、生成DLL库 (2) 1. 函数准备 (2) 2. 环境预设 (2) 3. DeploymentTool生成DLL (3) 二、CSharp调用DLL (6) 1. 添加引用 (6) 2. 调用实例 (6) 3. 加载错误 (7)
软件配置 MATLAB:Version 7.11.0.584(R2010b),64-bit(win64) CSharp:Visual Studio 2010专业版,4.0.30318 RMRel,64-bit(win64) 一、生成DLL库 1. 函数准备 2. 环境预设
3. DeploymentTool生成DLL 点击Desktop->Deployment Tool,点击“here”或->New Project生成新项,此处为M2CTEST.prj 。点击[Add class]生成指定名称的类,点击[Add files]添加M方法文件作为该类下的方法。添加类及方法后,点击打包文件,生成的dll文件在M2CTEST\src目录下。
二、CSharp调用DLL 1. 添加引用 启动Visual Stidio新建新项目,此处项目为控制台应用程序ConsoleApplication2。 在ConsoleApplication2中添加项目引用,右键单击“引用”,点击“添加引用”,包括自己生成的DLL和Matlab环境DLL: M2CTEST\src\M2CTEST.dll Program Files\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win64\v2.0\MWArray.dll 在Program.cs中添加类引用: using https://www.wendangku.net/doc/da538597.html,.Arrays; //用于数据转换 using https://www.wendangku.net/doc/da538597.html,.Utility; //用于绘图 using M2CTEST; //自己生成的DLL库,调用Matlab函数 2. 调用实例
M函数文件编译成DLL文件问题请教 编译环境:MATLAB 7 R14 有如下函数 function y = sample (x) y = x +1; 保存为sample.m文件,然后执行如下命令编译:(有一个警告信息出现?!) >> m cc -W lib:sample -T link:lib sample To get started, select MATLAB Help or Demos from the Help menu. Warning: No m atching builtin function available for C:\MATLAB7\toolbox\simulink\simulink\set_param.bi 编译后得到如下一批文件: sam ple.ctf,sam ple.exports,sample.m,sample.dll,sample.h, sam ple_m cc_com ponent_data.c ,sam ple.c,sam ple.exp,sample.lib 其中*.dll文件可以在其他语言(我现在是用Python)中成功调入,当时不能执行函数运算。我查遍GOOGLE的信息,猜测可能的原因是经编译后DLL文件中的函数名不在是原来的函数名(Functions m ay be exported with [b]mangled names[/b])。然后利用软件工具“Dependency Walker ”打开sample.dll则可以看到里面好像有五个函数: _mlfSample _mlxSample _sampleInitialize _sampleInitializeWithHandlers _sampleTerminate [b][color=red]问题请教:[/color][/b] (1)编译时如何控制输出的DLL文件中的函数名? (2)编译时的警告信息为何意? 非常感谢! 回复:M函数文件编译成DLL文件问题请教 我是用-l 参数进行编译的,生成的dll种的函数名都没有下划线。 回复:回复: M函数文件编译成DLL文件问题请教