搜档网
当前位置:搜档网 › 如何从DLL中导出带STL实例的类

如何从DLL中导出带STL实例的类

如何从DLL中导出带STL实例的类
如何从DLL中导出带STL实例的类

ZT:

在多个DLL(exe)之间通过指针或者引用传递STL对象时会发现操作失败现象。MSDN 上给出了完整的解决方法。在开发应用程序的过程中需要认真对待。

现象:

在不同的DLL或EXE中通过指针或引用操作另一个DLL或EXE中的STL对象时,会遇到严重的程序错误,包括数据错乱或丢失。

原因:

标准C++库的多数类直接或间接的使用了静态数据成员。由于这些类是通过模板创建实例的,所以每个可执行程序(一般是有DLL或EXE扩展名的)包含了有关类静态数据成员的一份Copy。当STL类中的方法要求操作静态数据成员时,这个类操作的静态数据是此方法代码所在的执行程序中的数据。由于静态成员数据在可执行程序中不能保证同步,所以前面提到的操作会导致读取失败或数据混乱和丢失。

解决方法:

1.在创建STL对象的可执行程序中输出读取的方法(函数)。这些函数包装STL对象要求的功能。这样,STL对象只能在单个可执行程序中被直接读取。例如:假设MyProgram.EXX需要得到MyLibrary.DLL内deque中的下一个元素,MyLibrary.DLL则要输出读取方法:“MyClass*DequeNextItem(/*...*/);”。MyProgram.EXE就可以执行此方法来得到队列的下一个元素了。

2.从一个可执行程序中输出模板实例,在另一个可执行程序中引入此实例。例如:MyLibrary.DLL将vector指针回传给MyProgram.EXE中的一个函数,需要在MyLibrary.DLL中输出MyClass类和vector。在MyProgram.EXE中引入它们后。就可以得到MyLibrary.DLL中静态数据成员的一份Copy了。

例子程序:

//---------------------------------------------------------

//AVEXE.CPP

//Compile options needed:/GX

#pragma warning(disable:4786)

#include

#include

#include

__declspec(dllimport)std::map*GiveMeAMap(int n);

__declspec(dllimport)void ShowMeTheMap(std::map*amap);

__declspec(dllexport)const char*MapItemX(std::map*m,int x) ;

int main(){

//Create the map in the DLL

int x=6;

std::map*p=GiveMeAMap(x);

//Display the contents of the map from the DLL

printf("Showing contents from the DLL\n");

ShowMeTheMap(p);

//Display the contents of the map from the EXE

//using the accessor function from the DLL so we

//aren't directly accessing the map

printf("Showing contents from the EXE using accessor\n");

int i=x;

while(i--){

printf("%d=%s\n",i,MapItemX(p,i));

}

//Access Violation when accessing the map that

//was created in the DLL from the EXE

printf("Showing contents from the EXE directly\n");

while(x--){

printf("%d=%s\n",x,(*p)[x].c_str());

}

return0;

}

//---------------------------------------------------------

//AVDLL.CPP

//Compile options needed/GX

#pragma warning(disable:4786)

#include

#include

#include

//Create the map here in the DLL

__declspec(dllexport)std::map*GiveMeAMap(int n) {

std::map*m=new std::map;

while(n--){

char b[33];

itoa(n,b,2);

(*m)[n]=std::string(b);

}

return m;

如何导入导出3D打印机可打印的stl文件以及模型尺寸的调整方法

如何导入导出3D打印机可打印的stl文件以及模型尺寸的调整方法如果想要让3D打印机进行工作还需要3D三维模型的配合才能完成。如果您从网上下载了一个stl格式的可打印三维模型,就可以放入3D打印机配套软件中进行打印操作了。如果您对下载好的stl格式的三维模型还不甚满意,而且恰好您稍微懂些3D软件的操作,就可以对下载的模型进行更改让其满足您的设计要求,今天乐彩科技就来说一下具体的操作步骤。 首先打开3D max软件,然后点击“文件”——“导入”——“导入外部文件到3D max 中”,就可以将stl格式的文件成功导入到三维模型制作设计软件中了,这个过程会比较长一些,如果stl文件过于大或者stl模型过于复杂化可能会出现打不开的情况。接下来爱玩3D max的你可以自由发挥你的想象力了,设计出好看的三维物体在3D打印机中进行打印操作。 关于导出3D打印机可打印的stl文件格式,只需要我们在三维设计软件如3D max中设计好三维模型,然后执行“文件”——“导出”——“从当前3D max场景导出外部文件格式”——在弹出的提示框中设置文件保存位置,然后为文件进行命名,并设置保存类型为:STL(*.STL)即可。 3d打印机打印的文件格式为.STL,图像模型文件用replicatorG打开。打开后可以看到模型的视图和相应信息。如果想要改变打印的模型尺寸,可以在软件右边的“Scale”按钮边的输入框内输入相应的参数,比如,输入2就放大一倍,写0.5就缩小一倍。当然你也可点击“Scale”按钮,点过之后再将鼠标箭头移动到模型视图区域,按着鼠标左键不放,往右拖动可以放大模型尺寸,往左拖动可以缩小模型。

利用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 混合编程的两种途径。

LabVIEW调用动态链接库dll

/DE9,(:) W ??GOO &/1 ??- &/1 &DOO /LEUDU\ )XQFWLRQ 1RGH ?? ? ?? ?? ) - ) ? ) ? /LEUDU\ QDPH RU SDWK '// <+? "+? '// ??? γ I+? -/ '// ?? ?? ?) -- '// 9, ??p '//? ??p /DE9,(: ? W ??'// 1 6SHFLI\ SDWK RQ GLDJUDP - ? - - -- - /LEUDU QDPH RU SDWK ??? ?v? - # ) &/1 ?? ??? ǎ ? ? '// +? - ?9, ? '// ??p ?- ? ? - '//? ?1J ??p )XQFWLRQ QDPH c ) /DE9,(: 1'//?? . ′ ? ?- γ 7KUHDG ǎ?t ? /- ) ? J? ) ?# /DE9,(: ?? ? W -?? ? &DOOLQJ FRQYHQWLRQ ǎ ) ) ?t -/ ?t VWGFDOO < & FDOO ? ) Z ǎ VWGFDOO ) #** & FDOO ) # - ?? ) $ ? /DE9,(: ? ? t ? ? ) 8 /DE9,(: ) '// ? G? # - ?? ? :LQGRZV $3, ?? . VWGFDOO O& ? ? & FDOO 8 ? ń?BBVWGFDOO - ? p ?? VWGFDOO

?? ? ?? - . ? )? ? ǎ('//?? . ) ? -. ) ?t ?? ? ??? ? 8 (5HVHUYH - - ) ?)? ? ) - '// - ) G ) - ( ? ? ? ?> ? 8 ? ? -- '// ? " ? b) 8QUHVHUYH ? t ) $ERUW ? t 9, ? " ) 8 $ERUW ? 9,?? # ? - ? -/ ) ? '// # ??t ?? ? ? ? 3URWRW\SH IRU WKHVH SURFHGXUHV ? ? 8 ?? '// ( /DE9,(: ?? ? - )

CAD系统输出STL文件方法大全

CAD系统输出STL文件方法大全 Alibre File (文件) -> Export (输出) -> Save As (另存为,选择 .STL) -> 输入文件名 -> Save (保存) AutoCAD 输出模型必须为三维实体,且 XYZ 坐标都为正值。在命令行输入命令 "Faceters" -> 设定 FACETRES 为 1 到 10 之间的一个值 (1 为低精度, 10 为高精度 ) -> 然后在命令行输入命令“STLOUT” -> 选择实体-> 选择 “Y” ,输出二进制文件 -> 选择文件名 CADKey 从 Export (输出)中选择 Stereolithography (立体光刻) I-DEAS File (文件) -> Export (输出) -> Rapid Prototype File (快速成 形文件) -> 选择输出的模型 -> Select Prototype Device (选择原 型设备) -> SLA500.dat -> 设定 absolute facet deviation (面片精度) 为 0.000395 -> 选择 Binary (二进制) Inventor Save Copy As (另存复件为) -> 选择 STL 类型 -> 选择 Options (选 项),设定为 High(高) IronCAD 右键单击要输出的模型 -> Part Properties (零件属性) -> Rendering (渲染) -> 设定 Facet Surface Smoothing (三角面片平滑)为 150 -> File (文件) -> Export (输出) -> 选择 .STL Mechanical Desktop 使用 AMSTLOUT 命令输出 STL 文件。 下面的命令行选项影响 STL 文件的质量,应设定为适当的值,以输出 需要的文件。 1. Angular Tolerance (角度差) ―― 设定相邻面片间的最大角度差 值,默认 15 度,减小可以提高 STL 文件的精度。 2. Aspect Ratio (形状比例) ―― 该参数控制三角面片的高 / 宽比。 1 标志三角面片的高度不超过宽度。默认值为 0 ,忽略。 3. Surface Tolerance (表面精度) ―― 控制三角面片的边与实际模 型的最大误差。设定为 0.0000 ,将忽略该参数。 4. Vertex Spacing (顶点间距) ―― 控制三角面片边的长度。默认 值为 0.0000, 忽略。 ProE 1. File (文件) -> Export (输出) -> Model (模型) 2. 或者选择 File (文件) -> Save a Copy (另存一个复件) -> 选 择 .STL 3. 设定弦高为 0 。然后该值会被系统自动设定为可接受的最小值。 4. 设定 Angle Control (角度控制)为 1 ProE Wildfire 1. File (文件) -> Save a Copy(另存一个复件)-> Model(模型)-> 选 择文件类型为 STL (*.stl) 2.设定弦高为0。然后该值会被系统自动设定为可接受的最小值。 3.设定 Angle Control (角度控制)为 1 Rhino File (文件)-> Save As(另存为 .STL )

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

各种3D软件如何导出STL文件

一、软件:Alibre 1. 文件-File 2. 导出-Export 3. 保存为-Save As > STL 4. 输入文件名-Enter File Name 5. 保存-Save 二、软件:Ashlar-Vellum 1. 文件-导出File > Export… 2. 选择STL导出格式-Select STL Export Type 3. 选择二进制选项并点 OK - Set Export Options to Binary > OK 4. 输入文件名Enter Filename 5. 保存Save 三、软件:AutoCAD 您的设计必须是三维实物,并且坐标值都为正 1. 保证目标是正空间(坐标值为正) 2. 在命令行输入“FACETRES” 3. 输入1到10之间一个数,1表示低分辨率,10表示高分辨率 4. 在命令行输入“STLOUT” 5. 选择目标模型 6. 输入"Y"表示输出二进制 7. 输入文件名-保存 四、软件:Autodesk Inventor 1. 保存为Save Copy As 2. 选STL Select STL 3. 选项选择高Choose Options > Set to High 4. 输入文件名Enter Filename 5. 保存Save 五、软件:CADKey 1. 从Export(输出)中选择Stereolithography(立体光刻) 2. 输入文件名 3. 点OK 六、软件:Catia 1.选择STL命令 2. 最大Sag=0.0125 mm 3. 选择要转化为STL的零件

4. 点击YES, 选择输出(export) 5. 输入文件名输出stl文件 七、软件:I-DEAS 1. 文件File > 输出Export > 快速成型文 件Rapid Prototype File > OK 2. 选择要导出的模型Select the Part to be Prototyped 3. 选择成型设 备Select Prototype Device > SLA500.dat > OK 4. 设置绝对面片精度到 0.000395 Set absolute facet deviation to 0.000395 5. 选择二进制Select Binary > OK 八、软件:IronCAD 1. 右键点击要输出的零件Right Click on the part 2. 零件性质Part Properties > 生成Rendering 3. 设置面片表面光滑到 150 Set Facet Surface Smoothing to 150 4. 文件File > 输出Export 5. 选择STL文件Choose .STL 九、Mechanical Desktop 使用AMSTLOUT命令输出STL文件 1.Angular Tolerance(角度差)-- 设定相邻面片间的最大角度差值,默认15度,减少可以提供STL文件的精度 2.Aspect Ratio(形状比例)--该参数控制三角面片的高度比。1标志三角面片的高度不超过宽度。默认值为0,忽略。 3.Surface Tolerance(表面精度)--控制三角面片的边与实际模型的最大误差。设定为0.0000,将忽略该参数。 4.Vertex Spacing(顶点间距)--控制三角面片边的长度。默认为 0.0000,忽略。 十、软件:ProE / ProEngineer 1. 文件File > 输出Export > 模型(或文件) Model (or File > Save a Copy) 2. 选择STL格式Set type to STL 3. 设置弦高(chord height)为0。然后该值会被系统自动设定为可接受的最小值。 4. 设置角度控制为1 5. 选择文件名 6. OK

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

LABVIEW的DLL与API调用

LABVIEW的DLL与API调用 一.实验目的 1.熟悉LabVIEW调用动态链接库的过程 2.学会编写用LabVIEW调用WINDOWS的API函数 二.实验器材 1.计算机(带有声卡) 2.LABVIEW8.20软件 三.实验原理 在开发自动测量系统时,经常遇到计算机与仪器的通信问题,涉及仪器控制及数据处理问题,LabVIEW语言在这一领域的应用有着独到的优势。为了在LabVIEW中能够充分利用其他编程语言的优势,LabVIEW提供了外部程序接口能力,包括动态链接库(DLL)、C语言接口(CIN)、ActiveX和Matlab等。 动态链接库是基于Windows程序设计的一个非常重要的组成部分。LabVIEW 开发中使用DLL,可以使代码更简洁,内存资源的使用更经济,而且可以便捷地利用仪器厂商或第三方提供的仪器控制子程序加速开发进程。而windows平台包含有大量的API函数,这些API函数提供了大量在Windows环境下可操作的功能,它们位于Windows系统目录下的多个DLL文件中,因此在LabView中调用API 函数和DLL的方法是一致的。 在LabVIEW中,利用库函数节点可以较容易地实现对DLL的调用,从而提高了程序的开发效率。使用调用库函数节点,可以调用Windows标准的动态连接库,也可以调用用户自己编制的DLL。LabView中动态链接库的调用可在程序框图的函数选板中选取“调用库函数节点”来完成,该节点位于:互连接口->库和可执行程序->调用库函数节点。

将选择好的调用库函数节点图标放在程序框图中,然后通过对它的节点图标进行配置,可以指定DLL模块中与LabVIEW数据交换的相应的驱动函数。 在调用DLL时,首先要找到找到头文件(*.h)或者函数原型声明,确定你需要调用的函数,注意函数的参数是否包含了原始数据类型参数比如int,char, double,等等或者是否包含了复杂数据类型比如clusters。如果函数没有包含复杂数据类型并且你有头文件(*.h),该DLL在数据类型的定义上与LabView一致,那么LabVIEW中一个很好的工具可以帮你简单地导入DLL(并且会帮助你创建DLL的整个库)。你可以在工具—>导入—>共享库(.dll)...中找到该工具,按照向导进行下去。 如果函数不含有复杂数据类型但是没有头文件(*.h),或者由于DLL编写不够规范,在数据类型的定义上与LabView并不完全一致,你需要确定那些在DLL 中被调用的函数的参数,一旦参数被确定,使调用库函数节点中的函数手动调用该函数。这是你需要对调用的函数进行手工配置。 在调用DLL库中函数时,必须知道以下信息:函数返回的数据类型、函数调用的方式、函数的参数及类型、DLL库文件的位置等。右键单击调用库函数图标,在弹出的菜单选项中选择配置...选项,可得到下图所示的配置对话框。

点云格式转换

点云格式转换: 在日常工作中,我们所用到的点云一般都为三角化后输出的网格面数据,其格式为标准格式STL格式。另一种为输出的点数据ASCII 格式. ⑴.STL是以一个文件的方式输出.输出的时候有ASCII和 binary两种方法,一般采用二进制(binary)的方法输出, 可以节省空间. ⑵.ASCII是把文件分成许多小的文件包输出的.一般是用输 出的点数来限制文件包的.

其中,STL是最常用的格式,因为它所包含的信息最全面,而且可以被大多数的软件所接受. 但有时因为不同的应用,测量后输出的数据有可能为VTX(顶点文件)、WRL和IV格式,而常用软件CATIA在导入点云时不支持以上两种格式.这时我们可以利用以下方法将VTX、WRL和IV转化为ASC 格式: 以上图中的foot模型为例. ⑴.用写字板将WRL格式文件打开.原文件大小为444KB.

⑵.将文件另存为TXT或DAT格式.此时文件大小为454KB.

⑶.将另存后的DAT文件的后缀名改为ASC格式.但此时文件大 小没有改变.(此时,如遇大型文件不方便存储和拷贝.) ⑷.用Imageware将文件打开,再重新另存为ASCII文件,此时文件 大小为293KB.

2 IV格式的转化同上. VTX格式的转化与上面方法基本相似,只是在写字板中将VTX 文件打开后会同时显示每个点的坐标和I,J,K变量值.需在坐标值与I,J,K变量值之间的空格处用逗号替换后再与以上方法同步即可. 以上方法的优点:1.在没有专用的三维扫描软件的情况下可以进行转换.2.可将大型的VTX、WRL、IV格式文件转换为ASCII文件,以方便存储和拷贝. 缺点:步骤烦硕,不能一步到位.特别是在大型文件的转换时,尽量避免采用VTX格式进行转换. 由于经验有限,以上方法难免有疏漏不正之处,敬请不吝指正.

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

LabVIEW与外部程序间DLL文件的调用

LabVIEW与外部程序间DLL文件的调用 什么是DLL文件 DLL(动态链接库)文件是Dynamic Link Library的缩写形式,是一种允许程序共享执行特殊任务所必需的代码和其他资源的可执行文件。其多数情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名。Windows提供的DLL文件中包含了允许基于Windows 的程序在Windows环境下操作的许多函数和资源。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。这些函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源,多个应用程序可同时访问内存中单DLL副本的内容。总之,DLL是一个包含可由多个程序同时使用的代码和数据的库。动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。 由于向运行于Windows操作系统下的程序提供代码、数据或函数,程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。在Windows操作系统中,DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。而有些DLL文件可以被许多程序共用,因此程序设计人员可以利用DLL文件, 使程序不至于太过巨大。但是当安装的程序越来越多,DLL文件也就会越来越多, 如果当删除程序的时候, 没有用的DLL文件没有被删除的话, 久而久之就造成系统的负担了。 通过使用DLL,程序可以实现模块化,由相对独立的组件组成。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,可能有一个工资计算程序,税率每年都会更改,当这些更改被隔离到DLL中以后,我们无需重新生成或安装整个程序就可以应用更新。 总的来说,使用DLL文件有以下好处:1、多个应用程序可以共享代码和数据。比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态链接库实现的。2、在钩子程序过滤系统消息时必须使用动态链接库。3、动态链接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作,而且各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态链接库中,供其他成员使用。4、实现应用程序的国际化,往往需要使用动态链接库。使用动态链接库可以将针对某一国家、语言的信息存放在其中。例如,在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态链接库实现的。对于不同的版本,使用不同的动态链接库,常用的一些编程软件均可以编写DLL文件。DLL 不是独立运行的程序,而是某个程序的一个部分,它只能由所属的程序调用,用户不能,也不需要打开它。 LabVIEW调用DLL文件

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方式无法实现的时候,推荐使用)

LabVIEW编程调用DLL时遇见的问题

LabVIEW编程调用DLL时遇见的问题 对于使用LabVIEW编程的人来说,都知道LabVIEW功能强大,但也会发现似乎缺少某些功能,而像其他编程语言的DLL、ActiveX组件则能提供。 在使用DLL(动态链接库)时,最大的困难就是把函数参数的数据类型映射为相应的LabVIEW中的数据类型。LabVIEW 提示: 未定义符号可能会造成函数和参数无法被识别。如要解决该问题,检查头文件并确定是否必须添加预定义符号。单击上一步按钮返回至向导的前一页并添加预定义符号(例如,"NIAPI_stdcall = __stdcall"或"NIAPIDefined = 1")在一次进行串口调试软件的编写过程中,要求使用动态链接库(其实使用VISA同样可以实现),使用导入共享库工具以自动生成配置CLN(Call Library Function)节点,工具在“工具—导入—共享库(.dll)”菜单项下,专门用于将DLL 中函数包装成VI。 下一步下一步点击解析头文件后,依然遇见(如下图) extern UINT Recv(UCHAR *pRecvBytes,UINT unRecvLength);(函数原型) 未定义符号可能会造成函数和参数无法被识别。如要解决该问题,检查头文件并确定是否必须添加预定义符号。单击上一步按钮返回至向导的前一页并添加预定义符号(例如,"NIAPI_stdcall = __stdcall"或"NIAPIDefined = 1")

归咎原因就是头文件中的一些类型定义不符合标准C语法,而使解析器无法获得正确的的mPWIN32_COMMAND定义。DLL函数的头文件中可能使用了某个系统定义的数据类型,数据类型的定义在windows.h中,(windows.h是Windows SDK的一个文件,VC等开发环境中常常带有Windows SDK),要正确解析必须得到这些数据类型,也就是找到windows.h 这个头文件,用户须把windows.h文件的全路径加在“包括路径”中。例如Visual C++6.0编译环境中头文件位于安装目录下VC98文件夹下的Include文件中。 而“预处理定义”中,当用户需要写一些宏定义,那么就写在这个位置。 在网络上看到在预处理定义中添加了如下代码 ULONG = unsigned long; VOID = void; LONG = long; UCHAR = unsigned char; PUCHAR = unsigned char*; PULONG = unsigned long*; WINAPI; BOOL = bool; USHORT = unsigned short; PUSHORT = unsigned short*; 点击下一步也不会遇到上述问题,导入工具会帮助你解析出全部导出函数并自动生成VI。

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

STL格式简介

是(立体印刷)的简写,是标准三角片语言。以为后缀的3D模型文件成为3D打印的标准文件,几乎所有的快速成型机都可以接收STL文件格式进行打印。当您保存STL文件之后,您设计的所有表面和曲线都会被转换成网格,网格一般由一系列的三角形组成,代表着您设计原型中的精确几何含义。很多三角形的面可以表现流畅的曲线,这就需要导出高分辨率的STL文件,但如此一来有些三角形会变得相当的小以至于机器无法察觉。这就需要我们将STL文件保存为合适的分辨率。 水密性-3D打印要求STL文件必须是水密的。水密最好的解释就是无漏洞的有体积固体。正如上面所说的原因,即使你的设计的固体已经创建完成了,很有可能在模型中仍存在没有被留意的小孔。 STL错误-有时您要导出STL文件格式时,软件会报告“错误”。这些错误并非发生在浏览阶段,而是真实存在于该文件的对象中。有些软件能帮我们修复STL错误,请留言魔猴网的知识堂,我们会再近期公布一些软件修改STL的办法。 切片-STL文件一旦创建,3d打印软件就会将模型切“片”,存为一系列横截面的文件,并计算出3D打印机的路径和打印量,后面的工作就是3D打印机不断地将横截面层层打印、累积,直到模型完成。 层厚度-3D打印工艺一个重要的指标就是层厚度,一般来讲,层越薄,精度越高,但消耗时间越长。层越厚,切片就越粗糙,有些小于层厚的细节,就有可能被忽略。这是个需要精心调整的一个参数。 3D打印材料-不同的3D打印技术使用不同的打印材料,常见的有:塑料、光敏树脂、石膏粉、蜡等,都可以选择。 支撑材料-每种3D打印技术都需要使用支撑材料来支撑模型的表皮。简单说就是任何打印出来的几何形体,都是一层层累积而来,一层建造再另外一层以上,有些形状,比方说正方体,四周表面都自支撑,上面一面要打印成功,就需要使用支撑材料。

相关主题