微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XLL UDF 的迁移 Excel 加载项调用在错误时接收 HRESULT 而不是 Error

如何解决XLL UDF 的迁移 Excel 加载项调用在错误时接收 HRESULT 而不是 Error

我正在将 VB6 Excel COM 加载项迁移到 VB.NET。我遇到了一个问题,加载项调用 Excel 来调用我们在 XLL 中实现的 UDF(使用 Excel 2013 SDK 用 C++ 编写),其中 Excel 返回一个包含 0x800A07DF 的 32 位整数(FACILITY_CONTROL,错误 2015)错误

我们的 VB6 Excel COM 插件具有以下功能

' VB6 version of function.
Public Function GetValueFromSheet(ByVal szName As String,_
                            ByRef szValue As String) As Boolean
    Dim Val As Variant
    On Error GoTo GetValueFromSheetHandler

    Val = xlApp.run("XLLUDF",szName)

    ' If the UDF encountered an error,Val will contain an Error.
    If VarType(Val) = vbError Then
        GoTo GetValueFromSheetHandler
    Else
        szValue = Val
    End If

    GetValueFromSheet = True
    Exit Function

GetValueFromSheetHandler:
        GetValueFromSheet = False
        szValue = vbNullString
        Err.Clear
End Function

' VB.NET version of function.
Public Function GetValueFromSheet(ByVal sName As String,ByRef sValue As String) As Boolean
        Dim val As Object
        On Error GoTo GetValueFromSheetHandler

        val = xlApp.Run("XLLUDF",sName)

        ' If the UDF encountered an error,Val will contain an integer 
        ' representing an HRESULT (FACILITY_CONTROL,error 2015),and 
        ' the line below never evaluates to True,breaking the logic.
        If VarType(val) = VariantType.Error Then
            GoTo GetValueFromSheetHandler
        Else                
            sValue = val
        End If

        ' Even though "OURXLLUDF" returned an error,we're returning success. 
        GetValueFromSheet = True
        Exit Function

GetValueFromSheetHandler:
        GetValueFromSheet = False
        sValue = String.Empty
        Err.Clear()
    End Function    

逻辑现在被破坏:函数返回 True,即使 XLL 调用返回错误。出于某种原因,错误被丢弃,取而代之的是 HRESULT。

我们可以做些什么来缓解这种情况,并确定 XLL 调用何时遇到错误

解决方法

此行为是设计使然,如官方文档所述:Marshaling Variant to Object

下表标识了每个变体类型和相应的 传递变体时封送拆收器创建的对象类型 COM 到 .NET 框架。

...

VT_ERROR => System.UInt32

...

因此,您可以使用此特殊错误代码 (-2146826273) 检查结果是否为整数类型(我尚未测试,但从您的评论看来该类型实际上是 System.Int32),或者您更改代码的逻辑并返回您可以测试的另一种类型的 VARIANT。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。