MFC、C解决dll调用的问题

MFC、C解决dll调用的问题
MFC、C解决dll调用的问题

1,在MFC的Dialog中调用了由C创建的Dll文件

先给出Win32 Dynamic Link Library的代码:

#include

#include

__declspec(dllexport) int say_hello(char* name);

BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {

return TRUE;

}

__declspec(dllexport) int say_hello(char* name)

{

printf( "hello %s\n ", name);

return 1;

}

一个入口函数,一个自定义的函数

下面是MFC中对dll的引用

void CTestMyDllMFCDlg::OnImportDllbtn()

{

// TODO: 在此添加控件通知处理程序代码

HINSTANCE hInstance=LoadLibrary(_T( "EmptyTestDll.dll"));//加载DLL

//调用DisplayDialog函数

if(hInstance)

{

// 加载成功

// 定义待访问函数原型

// 获取函数地址

int m=0;

typedef int ( *say_hello)(CString);

/*

这里是个重要的点:int ( *say_hello)(CString);

在MFC中的dll文件需要告知函数是由c或C++写成的,所以需要在函数名之前

告诉编译器这个是一个C函数。

typedef void (WINAPI *LPFUN)(void);

typedef void (__stdcall *LPFUN)(void);

typedef void (FAR PASCAL *LPFUN) (void);

像上面这样定义就OK了,

如果用的是VC++,那么直接用第一种定义就ok了。

注意,上面是使用MFC (DLL)的做法。

如果是WIN32 DLL,得相应的去掉WINAPI ,__stdcall ,FAR PASCAL 这几个参数。因为WIN32 DLL 默认的入栈方式为__cedcall方式,不是__stdcall方式。

我们这里是创建的Win32 Dll文件,所以什么都不加,去掉了WINAPI,所以下面直接就可以操作成功了撒,下面的程序中我们再通过MFC创建的Dll进行dll引用。

*/

say_hello fun = NULL;

fun=(say_hello)GetProcAddress(hInstance, "say_hello");

if(NULL!=fun)

{

// 成功

AfxMessageBox(TEXT("T"));

CWnd* pwnd=GetDlgItem(IDC_STATIC1);

pwnd->SetWindowText(LPCTSTR("123"));

CString aa;

aa.Format("%s","sss");

m=fun(aa);

if(m==1)

{

AfxMessageBox(TEXT("Oh yeah"));

}

}

FreeLibrary(hInstance); //释放DLL

}

else

{

AfxMessageBox(TEXT("Error"));

}

}

2,介绍了MFC调用dll文件,我们再看c++中怎么调用MFC创建的dll文件以下是MFC共享dll的函数

extern "C" __declspec(dllexport) void ShowDlg(void)

{

CDllDialog dllDialog;

dllDialog.DoModal();

}

以下是c中调用了MFC的规则dll

#include "windows.h "

int main(int argc, char* argv[])

{

//printf("Hello World!\n");

HINSTANCE hDllInst = LoadLibrary("RegularDll.dll");

if(hDllInst)

{

typedef void (WINAPI *ShowDlg)(void);

ShowDlg pShow = NULL;

// youFuntionNameAlias 函数别名

pShow = (ShowDlg)GetProcAddress(hDllInst,"ShowDlg");

// youFuntionName 在DLL中声明的函数名

if(pShow)

{

pShow();

}

FreeLibrary(hDllInst);

/*

显式(静态)调用:LIB + DLL + .H,注意.H中dllexport改为dllimport

隐式(动态)调用:DLL + 函数原型声明,先LoadLibrary,

再GetProcAddress(即找到DLL中函数的地址),不用后FreeLibrary */

}

return 0;

}

以下两个就很简单了,呵呵

3,在MFC的Dialog中调用了由MFC创建的Dll文件

4,在c中调用了由C创建的Dll文件

利用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源文件中的代码为:

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

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) //判断输入参数的个数

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 %执行此命令后会生成如下窗口

matlab生成dll方法的心得体会

将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调用Matlab生成的dll完全攻略(混合编程必备)

用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打包程序。

CSharp使用DLL进行调用MatLab混编

CSharp使用DLL进行调用MatLab混编 Lanix Beavis 2013/1/27 Beijing Normal University, 978109939@https://www.360docs.net/doc/5214207092.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.360docs.net/doc/5214207092.html,.Arrays; //用于数据转换 using https://www.360docs.net/doc/5214207092.html,.Utility; //用于绘图 using M2CTEST; //自己生成的DLL库,调用Matlab函数 2. 调用实例

Matlab调用DLL以及matlab指针参数传递

Matlab调用DLL 本来想把算法写成一个DLL的形式,这样既可以在控制软件中方便调用,又可以在Matlab中通过调用外部DLL的形式对算法进行仿真分析,所以需要了解Matlab调用外部DLL的方法,但是后来发现Matlab调用DLL只支持用C语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。这里把Matlab调用DLL 的过程记录一下吧,以后有用到的时候再说。 在Matlab的Help中搜索"Calling Functions in Shared Libraries"即可看到关于此内容的帮助文档。 下面以一个简单的小例子演示Matlab调用DLL的过程: 1、编译器准备 在Matlab的命令窗口输入:mex -setup 选择你的编译器,我的是: [2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.0 2、编写你自己的DLL 在Visual Studio 2008中新建一个Win32的Dll工程,不妨设名字为MatlabDllTest,编辑MatlabDllTest.cpp: #include "MatlabDllTest.h" double add(double x, double y) { return (x+y); } 编辑MatlabDllTest.h: #ifndef MATLABDLLTEST_H #define MATLABDLLTEST_H #ifdef __cplusplus extern"C" { #endif

VB6.0调用matlab生成的dll文件

环境:win7 64位,matlab2010b,Vb6.0 一、设置环境变量 右键计算机——属性——高级系统设置——环境变量,在用户变量和系统变量中均添加如下路径:路径名为path 值为”C:\Program Files\MATLAB\R2010b\bin\win64”(matlab安装路径),重启计算机。 二、编写m文件,注意以function开头 三、在matlab中设置编译环境 1.在matlab命令窗口中输入mex –setup,选择n,然后在弹出的众多编译器中选择一个,最好选择VC++系列(在进行这一步时,现在电脑上安装VC的编译器,如VC++6.0、Visual Studio,注意要安装英文版),接下来一直选择y,直至看见Done……,证明这一步成功了; 2.接下来输入么build –setup,接下来步骤与1相似,直至看见Done……。 四、进行编译,生成dll文件 1.在matlab窗口中输入deploytool,在弹出的窗口中,name随便填,location选择默认即可,Target选择倒数第二项:Generic COM Component,单击OK; 2.选择Add class,填写class name,单击Add files,选择所需编译的m文件,然后单击 build按钮,等待编译结束,这是会看到生成的文件夹中含 distrib这个文件夹,所需的dll文件即在里面。 五、注册dll 开一个dos窗口(在开始里输入运行即可),在dos窗口中输入:cd/d /runtime/win64,回车,接着输入mwregsvr mwcomutil.dll,即对mwcomutil.dll 进行注册(这个dll是matlab下作的任何com组件都要用到的dll)。 六、在vb6.0中调用生成的dll文件 1.打开vb6.0,点击工程——引用——浏览,找到放置dll文件处,选择,点击确定; 2.vb6.0命令行处应写: Dim myplot As plot.plot1 Set myplot = New plot.plot1 …… Call myplot.plot1(str, strname, xx5, yy2, y) (说明:其中myplot为自己取的名字,plot为matlab编译dll文件时的class name,plot1为源文件m文件的名字)

vc调用matlab工具箱实例

本文详述了在Vc环境下如何利用Matlab工具箱进行数字信号处理,全文以Matlab工具箱中功率谱密度分析函数为例,介绍了通过Matlab自带的引擎、Matlab自身的编译器以及利用MathTools公司的Matcom进行对工具箱函数的调用。 关键词:Matlab M-文件引擎编译器Matcom Vc++ Matlab的信号处理工具箱是信号算法文件的集合,它处理的基本对象是信号与系统,信号处理工具箱位于目录、Toolbox\Signal下,利用工具箱中的文件可以实现信号的变换、滤波、谱估计、滤波器设计等。在其它的环境如Vc下如果能调用Matlab工具箱中的文件,会大大地加快一些算法的实现,同时其可靠性也很高。 1. 利用 Matlab引擎 Matlab引擎采用客户和服务器计算方式,在运用中,Vc的C 语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息,它提供了下列几个函数:engOpen, engGetArray, engPutArray, engEvaString, engOutputBuffer ,engClose与客户机进行交互。

下面例程是在Vc下建一个基于对话框的应用程序,在对话框中设置一个Button控件OnMatlabEngine.,在对话框.cpp文件中加入”engine.h”和“math.h”头文件,下面给出部分程序清单。 Void CtestmatlabDlg::OnMatlabEngine(){ Engine *ep; mxArray* T=NULL,*result=NULL,*mFs=NULL,*mnfft= NULL; double datax[1024]; char buffer[1024]; for(int j=0;j<1024;j++)//注:如通过采集卡采集数据可将采集的数据放在datax[]数组中,此循环就不需要 { double samt=(double)(1.0/1024);

在matlab中调用c程序(32位与64位matlab)#(优选.)

1.Maltab 编译Mex文件(不可调试) (1)hello word 在matlab命令行中输入:mex -setup选择合适编译器,完成设置。 新建一个文件,输入: #include void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) { mexPrintf("Hello word!"); } 把上面程序保存为一个C文件,如hello.c 在command window下运行 >> mex hello.c >> 结束之后在current folder 窗口里会有一个hello.mexw32文件。 在command window下运行 >> hello() Hello word! (2)如果是多维数组并不能用Arr[i][j]的格式寻址,在参数在C里只是一维数组, 一维数组按列排列,C语言是按行排列的, 如[a b c d;e f g h]C语言在内存中是按a b c d e f g h排列,而matlab是按 a e b f c g d h排列的。 如果要变成C语言可Arr[i][j]索引的格式,可用for循环转化 打印函数: mexPrintf()相当于matlab的disp函数, mexPrintf函数里需要打印的部分必须用""而不能用'' 子函数的问题: 子函数有两种方式,一种采用return值得方式返回值 另一种方式为利用参数返回值,把需要return的值直接赋给形参。 多个.c文件的编译: 多个.c文件中只能存在一个mexFunction函数 可用mex ('a.c','b.c','d.c')的格式编译 2.在VS中调试mex (1)在vs中建立dll工程,建立project.cpp文件,输入 #include "project.h" #include void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) {

C++通过matlab生成的dll来链接matlab的具体步骤

VC++通过matlab生成的dll来调用matlab函数一matlab生成dll 众所周知Matlab的强大运算能力让各种工程软件望而却步,而VC程序的友好界面又让人爱不释手,如果能够让两者的优势结合起来的话,势必能让程序员欢欣鼓舞。还好MathWorks已经为我们想到了,基本上现在市面上主流的Matlab版本都可以支持VC和Matlab的混合编程。但是目前网上资料基本上都是基于Matlab 6.0和VC 6.0的,和新版本的实现方法有所不同,因此笔者通过不断的尝试和研究,终于调试通了基于VS2008和Matlab R2011b的混合编程。 1 编写.m函数 为了更加直观的说明如何实现混合编程,笔者写了一个简单的程序作为测试。先在Matlab 里面写一个M文件,代码如下: function b = MyFunc(a) b = a.*a; 将M文件保存为MyFunc.m,保存在F:/test文件夹中。然后在Matlab主窗口中将当前文件夹改为F:/test: cd F:/test; 2 设置Matlab编译库 为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL 的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码: mbuild –setup(注意‘–’前面是有空格的) 然后出现 Please choose your compiler for buildingstandalone MATLAB applications: Would you like mbuild to locate installedcompilers [y]/n? 键入y后回车,出现 Select a compiler: [1] Lcc-win32 C 2.4.1 inD:\PROGRA~1\MATLAB\R2010b\sys\lcc [2] Microsoft Visual C++ 2008 SP1 inD:\Program Files\Microsoft Visual Studio 9.0 [0] None Compiler:

将matlab函数编译成dll供Cpp调用

作者曾经实现过将matlab函数编译成dll供Cpp调用,这篇文章的目的是对新增的面向对象的的扩展mwArray进行讲解,matlab很容易和C/C++联合起来使用。 以前做过matlab7与c++的混合编程:将matlab函数编译成dll给C++调用,从而加快开发的进度。但是今天在matlab2008b下面又做了一遍,发现matlab又改了很多东西,诸如增加了面向对象的的扩展mwArray,于是做笔记如下。 (一)总体概念 matlab提供了丰富的程序接口,除了matlab最初的版本是用fortran写的之外,后来的版本都是用C写的,因此matlab很容易和C/C++联合起来使用。 matlab有着丰富的库函数,将这些库函数直接编译成dll(windows下是dll,linux下是类似于dll的另外一个东西),给C调用,可以加快工程进度。 步骤如下: 1. 设置matlab的编译器,使用外部的VC或者gcc等编译器。 2. 编译m文件成dll 3. 设置VC等的继承环境,设置C需要用到的静态库和动态库 4. 编写C调用dll 下面以一个很简单的加法函数为例,说明在VC6和matlab2008b下,怎么做混合编程(二)设置matlab编译器 过程如下: 1. 在matlab的command window里面敲入mex –setup,matlab会列出所有电脑上所有的编译器。 2. 选择编译器,这里选择2,即VC6 3.完成之后,敲入mbuild –setup,选择build工具,matlab会列出所有的build工具,同

样选择VC6 (三)编译m文件 首先,写出matlab函数,一个很简单的加法函数,如下: function [c] = MyAdd(a, b); c = a + b; 保存为MyAdd.m 然后,进行编译,命令如下: mcc -W cpplib:libMyAdd -T link:lib MyAdd 其中,mcc是matlab提供的编译命令(可以理解为gcc),对于这一点,matlab的帮助说明如下: -W lib:string link:lib 其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。 运行完之后,你的目录下面,将会出现以下一些文件: libMyAdd.cpp libMyAdd.exp libMyAdd.dll libMyAdd.exports libMyAdd.h libMyAdd.prj libMyAdd_mcc_component_data.c mccExcludedFiles.log readme.txt 具体每一个文件的意思,请查帮助,这里只说其中很有用的几个: libMyAdd.dll是编译好的动态库,MyAdd这个函数封装在里面,libMyAdd.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件,在这个头文件的最后,你可以看到下面的内容:

(完整版)matlab和c++调用DLL方法

Matlab和C++调用DLL方法 Matlab可以调用外部DLL,如用C或C++写的DLL。本文分三个部分介绍Matlab和C++调用DLL方法。 一、C++写dll方法 二、C++调用dll 三、Matlab调用dll 一、C++写DLL方法 在CPP文件中和普通CPP没什么区别,在H文件中加上需要导出的函数名,格式如下: extern "C" int __declspec(dllexport)add(int x, int y); 蓝色部分是函数返回的类型,红色部分是要导出的函数,就这么简单。下面是两个整数相加的代码: main.h: extern "C" int __declspec(dllexport)add(int x, int y); main.cpp: #include "main.h"

int add(int x, int y) { return x + y; } 编译即可得到dll文件,我的工程名叫mydll,因此得到的是mydll.dll 二、C++调用DLL方法 将DLL文件拷入到源文件夹中,在CPP代码中引入windows.h文件,否则有些方法找不到,用指针来接受参数。装载DLL,用函数名,卸载DLL。代码如下: #include #include using namespace std; int main(void) { typedef double(*padd)(double a,double b); double r; HINSTANCE hDLL;

padd add; hDLL=LoadLibrary("mydll.dll"); add=(padd)GetProcAddress(hDLL,"add"); r=add(5.3,8.6); cout<> loadlibrary('mydll.dll','main.h') >> libfunctions('mydll') 会得到如下信息: Functions in library mydll: add 接着输入: >> calllib('mydll','add',3,5)

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;”

如何在MATLAB平台下调用EPANET的DLL

以下是代码,但注意INP未给出,运行时,只需将INP,有此内容的M文件以及EPANET源文件中.h和.dll放入即可。 我的MATLAB版本是2012的。 .m文件的内容 %计算压力影响系数矩阵 clc; clear all; close all; pressure_new=[]; P_impactmatrix=[]; basedemand_new=[]; errcode=loadlibrary('epanet2.dll','epanet2.h');%加载EPANET文件 errcode=calllib('epanet2','ENopen','fengxian.inp','fengxian.rpt','');%打开inp文件 nodenum=0;%nodenum是总节点数目,可以赋予任意值,可以赋予任意值 [errcode,nodenum]=calllib('epanet2','ENgetcount',0,nodenum);%获取总节点数目,注意获取数值的方式,两边要有相同的参数nodenum,也可以不同 %0代表获取总节点数目的代码,左边的nodenum为返回值的存储变量,右边nodenum为初始值。 tanknum=0;%tanknum是水源节点数目,可以赋予任意值,但要获取水源节点数目必须初始化[errcode,tanknum]=calllib('epanet2','ENgetcount',1,tanknum);%获取水源点数目,方式与上面的相同,1代表获取水源节点数目的代码 junctionnum=nodenum - tanknum;%junctionnum是连接节点数目,注意连接节点数目等于总节点数减去水源节点数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% errcode=calllib('epanet2','ENopenH');%打开水力分析系统 errcode=calllib('epanet2','ENinitH',0);%初始化贮水池水位,管道状态和设置以及模拟时间,0表示不存储二进制水力结果 time=0;%初始化工况时间,可以是任意值 number=0;%number为水力步长进行到的阶段数 pressure=0; tstep=1;%初始化水力分析的步数,可以是任意非零值 while (tstep && ~errcode) [errcode,time]=calllib('epanet2','ENrunH',time);%执行在time时刻的水力分析 number=time/3600; if (number==11)%获取第11步水力分析的水力数据 for i=1:junctionnum [errcode,pressure]=calllib('epanet2','ENgetnodevalue',i,11,pressure); pressurevalue(i,1)=pressure; end end [errcode,tstep]=calllib('epanet2','ENnextH',tstep); end errcode=calllib('epanet2','ENcloseH');%关闭水力分析系统,释放内存 pressurevalue; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

相关主题
相关文档
最新文档