ENVI二次开发出现“对COM组件的调用返回了错误HRESULT E_FAIL”

 

C#与ENVI/IDL进行混合编程,通常的技术为IDLDrawWidget和COM_IDL_CONNECT,在具体调用时又经常出现“对COM组件的调用返回了错误HRESULT E_FAIL”的错误。

以COM_IDL_CONNCET为例,对常见错误进行分析。

调用步骤:

1) 新建工程

 

界面中添加一按钮组件

设置名称为CallENVI,显示文字为调用ENVI。

 

添加组件

 

 

组件初始化

//组件com_idl_connect初始化

   COM_IDL_connect oCom = new  COM_IDL_connect();

   oCom.CreateObject(0,0,0);

代码调用

调用IDL的功能形式上有两种,即IDL的pro源码文件和sav文件。二者在调用的时候稍微有些不同。

如果是pro源码文件,需要先compile再调用。如果是sav文件,需要先restore再调用。

编写ENVI二次开发代码,并存储为“c:\temp\CallingENVI.pro”

利用oCom.ExecuteString方法调用时容易出现下面的错误,“对COM组件的调用返回了错误HRESULT E_FAIL”,如下图:

 

1、 确定编译和加载正确;

利用COM组件调用IDL代码或ENVI二次开发代码时,需要编译代码或加载(Restore)sav文件,如果编译或加载失败则后续调用会出现如下问题。

如下面代码:

 

错误原因:目录本应为”c:\temp\CallingEnvi.pro”错写为”c:\emp\CallingEnvi.pro”,编译不成功导致后面调用CallingENVI出错。

2、 ENVI二次开发代码中时不需要ENVI_Batch_Exit

在ENVI二次开发的代码中,ENVI退出的代码为“ENVI_Batch_Exit”,如需要com调用则无需加载该语句,只需最后对com进行destroy即可,否则会导致上面的异常。

 

3、 调用ENVI的doit类函数

经过测试和试验,pro中调用math_doit、envi_register_doit、fx_doit等函数时,最后需要调用* _record函数,见下图。

如遇到该问题需要如下写法

;-

PRO math_doit_record, _extra=extra

END

 

PRO CALLINGENVI

ENVI, /restore_base_save_files

  ENVI_BATCH_INIT

  ;....

  ENVI_DOIT, 'math_doit', $

  ;....

  ;注释这一行

  ;ENVI_BATCH_EXIT

END

 

总结:因混编作为一种比较特殊的编程方式,可以在IDL的pro中打印!ERROR_STATE.MSG查看错误原因进行分析和修正。

如调用math_doit的示例代码如下:

PRO math_doit_record, _extra=extra

END

 

PRO CALLINGENVI

  COMPILE_OPT idl2

  CATCH, Error_status

 

  ;判断是否出现错误

  IF Error_status NE 0 THEN BEGIN

    Void = DIALOG_MESSAGE(!ERROR_STATE.MSG,title ='错误信息!',/error)

    CATCH, /CANCEL

    RETURN

  ENDIF

  ENVI, /restore_base_save_files

  ENVI_BATCH_INIT

 

  ;

  ENVI_DOIT, 'math_doit', $  

  ;

 

  ;....

  ;

  ;ENVI_BATCH_EXIT

  void = DIALOG_MESSAGE(!ERROR_STATE.MSG,/infor,title='错误原因')

END

posted @ 2014-04-16 22:46  刘朝样  阅读(1196)  评论(0)    收藏  举报