IDL调用程序.doc_第1页
IDL调用程序.doc_第2页
IDL调用程序.doc_第3页
IDL调用程序.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

准备工作。你需要安装Visual C+,注意要保证设置cl编译器的环境变量,一个简单的检验方法是在MS-Dos中键入cl命令,看是否正常运行。打开IDL,在命令行中输入 IDL help,!make_dll,/structure 我们可以得到: * Structure !MAKE_DLL, 4 tags, length=48, data length=48: COMPILE_DIRECTORY STRING C:Documents and SettingsDave.idlrsicompile_dir-118-idl_6_2-win32-x86-m32-f64 COMPILER_NAME STRING Microsoft Visual C+ 7.0 CC STRING cl %X -D_DLL -DMSWIN -DWIN32 -D_MT /nologo /ID:RSIIDL62externalinclude /c %C /Fo%O LD STRING link /out:%L /nologo /nodefaultlib /dll %O /def:%E D:RSIIDL62binbin.x86idl32.lib msvcrt.lib kernel32.lib %XIDL中的make_dll命令就是利用!make_dll系统变量中的参数来编译c语言文件的。COMPILE_DIRECTORY表示编译生成文件存放的地方,COMPILER_NAME是编译器名称,CC和LD分别是编译命令和编译选项。这是个参数是系统默认值,都可以通过make_dll命令的参数改变。 2. 编写C语言文件,我们选用安装目录下externalcall_externalC中的sum_array.c作为例子,如下 #include #include idl_export.h float sum_array_natural(float *fp, IDL_LONG n) float s = 0.0; while (n-) s += *fp+; return(s); float sum_array(int argc, void *argv) return sum_array_natural(float *) argv0, (IDL_LONG) argv1); 为了方便,我们把sum_array.c放入COMPILE_DIRECTORY目录中。 从程序中我们注意到: a) 需要包含头文件idl_export.h,该文件的目录已经在CC参数中设置,/ID:RSIIDL62externalinclude; b) 定义一个适用于IDL调用的函数float sum_array(int argc, void *argv),该函数的参数必须是int argc和void *argv。该函数以后要被CALL_EXTERNAL调用,通用的形式是return_type example(int argc; void *argv); c) 在sum_array函数中调用自己设计的函数sum_array_natural,有两个参数通过指针数组argv传递,argv0是数组的指针,argv1是长整型变量,关于参数的传递可参考帮助; 3. 利用make_dll命令编译sum_array.c文件, IDL make_dll,sum_array,sum_array_examples,sum_array_natural,sum_array 这时在COMPILE_DIRECTORY目录中生成sum_array_examples.dll文件。这里sum_array是需要编译的c语言文件名,省略扩展名。sum_array_examples为生成dll文件的名称,sum_array_natural,sum_array是需要输出的函数。 4. 下面我们就可以利用CALL_EXTERNAL命令来调用sum_array_examples.dll中的函数了,例如 IDL arr_l=FINDGEN(10) IDL result = CALL_EXTERNAL(C:Documents and SettingsDave.idlrsicompile_dir-118-idl_6_2-win32-x86-m32-f64call_external_examples.dll,sum_array,arr_l, n_elements(arr_l),VALUE=0,1, /F_VALUE, /CDECL) IDL print,result 得到 45.0000 上面CALL_EXTERNAL的参数: a) C:Documents and SettingsDave.idlrsicompile_dir-118-idl_6_2-win32-x86-m32-f64call_external_examples.dll是call_external_examples.dll文件的目录 b) sum_array是需要调用call_external_examples.dll里面的函数; c) Value选项定义参数传递的方式,指针传递用0表示,非0表示值传递; d) /F_VALUE表示函数返回float类型变量; e) /CDECL定义call_external_examples.dll文件传递参数的方式,适用于C语言,详细参考dll文件的生成。IDL 6.4如何生成调用了envi函数的独立运行程序呢我把论坛里的帖子都看了一遍,大伙都用IDL7.0了。可我用的是envi 4.4,所以IDL还是6.4 版。我遇到的问题是,我写了个小程序,调用了envi 函数,如何在IDL6.4中 生成独立运行的程序呢。是否必须安装envi呢?收藏 分享 评分 回复 引用 订阅 TOP 有两种方法: 一、模仿ENVI+IDL的运行方式。 1、先建一个文本文件,命名为protes.run,里面写上程序的名字protest 2、打开idl编辑器把打包程序目录(包含sav文件的目录)修改成Idl工作目录或者是添加到IDL搜索路径 3、建立一个快捷方式。在快捷方式的属性中 目标 加上一下命令idlde路径 -minimized -nodemowarn -noconfirmexit -nosplash run文件路径例如:D:Programenvi44IDL64binbin.x86idlde.exe -minimized -noconfirmexit -nosplash D:protestprotest.run,最好的方式是直接赋值修改ENVI+IDL的快捷方式_ 二、直接保存为sav文件, 1、在程序开始部分加入:compile_opt idl2 加在Pro.End内 2、调试完成后,新开一个IDL编译器,打开程序,编译 3、不使用Resolve_all,使用Save,file=.sav,/routines保存Save文件 注意:如果在编译的时候IDL编译器如提示不能识别ENVI的函数,可在程序开始前使用Forward_function ENVI函数标识出ENVI函数,然后就可以直接双击运行打包后程序了,也可以使用IDLrt.exe运行,前提当然你的系统上要同时安装有ENVI。2# 发表于 2009-8-4 08:48 | 只看该作者 IDL 与 外部语言的几种集成方式(一)connector IDL与外部语言的集成内容包括IDL内调用外部语言和外部语言调用IDL。以下几篇博客简要介绍常用的几种调用方式,希望与大家共同学习和进步。 一、外部语言调用IDL: Connector(连接器):即使用IDL事先做好的ActiveX控件和com控件集成到调用语言中。(本实验环境为VS2005 C#,IDL6.4,ENVI4.4) 1. IDLDrawWidget draw方式(窗口模式): VS工具箱添加com项IDLDrawWidget control 3.0,在form窗口添加该控件,初始化:Code1intn;2this.axIDLDrawWidget1.IdlPath=E:ProgramFilesITTIDL64binbin.x86idl.dll;3n=axIDLDrawWidget1.InitIDL(int)this.Handle);4if(n=0)56MessageBox.Show(IDL控件初始化失败);78axIDLDrawWidget1.SetOutputWnd(int)richTextBox1.Handle);9axIDLDrawWidget1.ExecuteStr(restore,satstretch.sav);/satstretch.sav必须置放于运行目录下10axIDLDrawWidget1.ExecuteStr(satstretch);11 如果pro没有编译成sav,可将pro置放于运行目录下,直接运行axIDLDrawWidget1.ExecuteStr(satstretch); nodraw方式:VS资源管理器添加引用com:IDLDRAW3Lib。初始化:Code1intn;2IDLDrawWidgetidl=newIDLDrawWidgetClass();3idl.IdlPath=E:ProgramFilesITTIDL64binbin.x86idl.dll;4n=idl.InitIDL(int)this.Handle);5if(n=0)67MessageBox.Show(IDL控件初始化失败);89idl.SetOutputWnd(0);/注意:如果IDL中要调用envi函数,加上这句会防止出错10idl.ExecuteStr(restore,satstretch.sav);11idl.ExecuteStr(satstretch); 2. COM_IDL_Connect(nodraw方式) VS资源管理器添加引用com:COM_IDL_ConnectLib,初始化:Code1COM_IDL_connectcom=newCOM_IDL_connectClass();2try34com.CreateObject(0,null,null);5com.ExecuteString(restore,satstretch);6com.ExecuteString(satstretch);78catch(Exceptionex)910/MessageBox.Show(ex+com.GetLastError();11 此调用过程VS会报错,但IDL程序会正常运行,一直不知道什么地方出了问题,我catch了错误没有理会它。有知道的看过后烦请指教一下。 说明: 1. IDLDrawWidget在IDL6.4以后的版本已经被ITT放弃,不再更新,公司以后会朝着COM方向发展。使用Export Bridge Assistant可以将IDL 程序包装成com组件在其他支持com的语言中使用。这个是下篇博客介绍的内容。 2.参数传递问题,参数传入很好解决。参数传出也提供了相应的接口。IDLDrawWidget提供getNameData方法,具体使用如下:Code1stringd=d;2IDLDrawWidgetidl=newIDLDrawWidgetClass();3idl.IdlPath=E:ProgramFilesITTIDL64binbin.x86idl.dll;4intn=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论