LearningENVI&IDL分享 http://blog.sciencenet.cn/u/dongyanqing Learning ENVI&IDL

博文

C#调用IDL时传递参数或变量时字符串过长出错的解决方法

已有 1671 次阅读 2012-12-14 17:19 |个人分类:IDL技术|系统分类:科研笔记|关键词:IDL C# 参数传递 中文变量


C#可以直接通过COM组件的方式调用IDL进行一体化编程开发,这样的一体化开发可以充分集中C#IDL优势。IDL提供了两个COM组件,IDLDrawWidgetCOM_IDL_CONNECT。这两个组件在使用上各有侧重点,IDLDrawWidget是带UI的可视组件但函数调用不够完善(如envifx就无法通过这个调用),COM_IDL_CONNECT是不带UI的组件但可以调用所有的函数,这样在使用的时候可以根据需求进行选取。

C#调用IDL的原理或机理是C#可以调用组件的方法实现IDL的命令行的功能,而IDL的命令行下可以通过命令编译运行IDL的代码或sav文件。下面对两个常见问题进行分析,1是代码的调用和执行格式,2是路径过长时的截断问题的解决。

一、调用代码的格式

IDL的命令行中进行代码的编译和金额运行的写法为:

       IDL> ;编译源码”c:\temp\test.pro”

       IDL> .compile  'c:\temp\test.pro'

       IDL> ;运行test pro中其他函数或过程均可以直接调用,因已经编译过了。

       IDL> test

 

C#中调用的格式如下:

      oIDL.ExecuteString(@".compile 'c:\temp\test.pro'");

      oIDL.ExecuteString("test");

 有些时候需要传递参数,IDL下要这么写:

      IDL> .compile  'c:\temp\testfun.pro'

      IDL> ;inFile是文件完整路径,如c:\temp\test.dat

      IDL> r = testfun(inFile)

C#中调用的格式如下:

      oIDL.ExecuteString(@".compile 'c:\temp\testfun.pro'");

      // this.infile是完整文件路径,如c:\temp\test.dat

      oIDL.ExecuteString("r=testfun('"+this.infile.ToString()+"')");

注意的是上面语句中的"r=testfun('"+this.infile.ToString()+"')"写法,应该要保证这句与IDL中的语句r = testfun(inFile)完全一致。

 

二、 源码路径过长或参数过长的问题

在传入的变量如文件名过长或参数过长时,C#调用时会出现自动截断的现象,这样导致程序运行报错,也算是混编调用的一个bug吧。解决是将需要直接传入的变量转换成不直接传入调用,即先调用C#的一段代码:

 

//传入的文件名和输出的文件名变量

string inFile= textBox_inputPath.Text;

string outFileName = textBox_OutputPath.Text +"\\" +fileName1 + "AutoGeo.img";

//文件名处理

int index=inFile.LastIndexOf("\\");

string fileName=inFile.Substring(index+1,inFile.Length-index-1);

//生成IDL下的调用格式

string exeStr = "roidata = auto_geoference('" + inFile + "','" + outFileName+ "')";

//调用自定义函数创建IDL源码pro文件

createProFile("AutoGeo",exeStr);

               

//调用初始化的com_idl_connect对象oENVIobj编译上面创建的IDL源码

oENVIobj.ExecuteString(".compile '" + MainForm.M_Envi_Path + "\\EnviPro.pro'");

//执行AutoGeo功能

oENVIobj.ExecuteString("AutoGeo");

 

 

上面调用的createProFile函数的代码如下:

 

private void createProFile(string moduleName, string exeStr)

{

     Stream dataSetStream = new FileStream( MainForm.M_Envi_Path+"\\EnviPro.pro", FileMode.Create);

     StreamWriter sw = new StreamWriter(dataSetStream, System.Text.Encoding.GetEncoding("GB2312"));

 

     string newStr = "pro " + moduleName + "\n  compile_opt strictarr\n    " + exeStr + "\n  end";

 

     sw.WriteLine(newStr);

     sw.Close();

}

C#中的createProFile执行后生成的pro文件的内容:

 

pro AutoGeo

  compile_opt strictarr

  roidata = auto_geoference('D:\test_data\image.tif','c:\temp\result.img')

end

 

通过这种C#下创建IDL源码的方式,基本解决了C#调用IDL时出现的参数过长传递报错的情况。这种方法也适用于其他语言,如C++basic等调用idl的情况。

 

 



http://blog.sciencenet.cn/blog-344887-642641.html
上一篇:IDL界面和对象参数或数据传递之万能的uValue
下一篇:欢迎大家加入ENVI/IDL开源代码收集 Colibri

1 liyue1992

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...

Archiver|科学网 ( 京ICP备14006957 )

GMT+8, 2014-7-31 21:29

Powered by ScienceNet.cn

Copyright © 2007-2014 中国科学报社