“对COM组件的调用返回了错误HRESULT E_FAIL”的错误分析
2015-12-03 16:49阅读:
C#与ENVI/IDL进行混合编程,通常的技术为IDLDrawWidget和COM_IDL_CONNECT,在具体调用时又经常出现“对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
pan>退出的代码为“ENVI_Batch_Exit”,如需要com调用则无需加载该语句,只需最后对com进行destroy即可,否则会导致上面的异常。
3、
调用ENVI的doit类函数
经过测试和试验,pro中调用math_doit、envi_register_doit、fx_doit等函数时,最后需要调用*
_record函数,见下图。
如遇到该问题需要如下写法
;-
PROmath_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
PROCALLINGENVI
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
http://blog.sciencenet.cn/blog-344887-503969.html
此文来自科学网董彦卿博客,转载请注明出处。