• 对COM组件的调用返回了错误"HRESULT E_FAIL”的错误分析(c#与IDL混合编程)转


    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退出的代码为“ENVI_Batch_Exit”,如需要com调用则无需加载该语句,只需最后对com进行destroy即可,否则会导致上面的异常。

    3、调用ENVI的doit类函数

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

     

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

    ;-

    PROmath_doit_record, _extra=extra

    END

    PROCALLINGENVI

    ENVI, /restore_base_save_files

    ENVI_BATCH_INIT

    ;....

    ENVI_DOIT, 'math_doit', $

    ;....

    ;注释这一行

    ;ENVI_BATCH_EXIT

    END

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

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

    PROmath_doit_record, _extra=extra

    END

    PROCALLINGENVI

    COMPILE_OPTidl2

    CATCH, Error_status

    ;判断是否出现错误

    IFError_status NE0THENBEGIN

    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://www.cnblogs.com/RSmountain/
  • 相关阅读:
    软件工程网络1514龚厦彬个人阅读作业2-提出问题
    软件工程网络15个人阅读作业1 201521123115 龚厦彬
    Java课程设计——学生信息系统(团队)
    Java程序设计——学生基本信息管理系统
    201521123115《Java程序设计》第14周学习总结
    201521123115《Java程序设计》第13周学习总结
    201521123115 《Java程序设计》第12周学习总结
    毕设01--第一阶段的内容
    网络15软工个人作业5——软件工程总结
    个人作业4——alpha阶段个人总结
  • 原文地址:https://www.cnblogs.com/RSmountain/p/2960305.html
Copyright © 2020-2023  润新知