【问题标题】:Excel-DNA calling xll function from another async xll function (Exception from HRESULT: 0x800AC472)Excel-DNA 从另一个异步 xll 函数调用 xll 函数(HRESULT 异常:0x800AC472)
【发布时间】:2016-09-06 23:12:47
【问题描述】:

我正在使用 excel-DNA 制作插件,一个插件处理与 API 的通信,另一个处理输入和路由。第二个插件需要分开,因为其他插件使用它来发布到同一个api,它用于保存有关地址和用户的信息。

在 VBA 中,我使用 Application.Run() 来运行其他文件函数,因此我假设 ExcelDnaUtil.Application.run() 的工作方式与它相同。问题是异步功能,当他们尝试使用 application.run 当用户输入一个单元格或选择多个单元格时,他们得到一个错误 0x800AC472。

我尝试使用此线程HRESULT 800ac472 from set operations in Excel 中的想法通过循环直到函数成功(示例如下)来解决问题,但是当有人打开格式化或函数向导窗口时仍然会出现错误。

Public Shared Function AsyncTest(a As Integer, b As Integer) As Object
    Return ExcelAsyncUtil.Run("AsyncTest", New Object() {a, b}, Function() SyncTest(a, b))
End Function

<MethodImpl(MethodImplOptions.Synchronized)>
Public Shared Function SyncTest(a As Integer, b As Integer) As Object
    Try
        Dim Package = String.Concat({"<Model><a>", a, "</a><b>", b, "</b></Model>"})

        Dim xlApp As Object
        xlApp = ExcelDnaUtil.Application
        Dim failed as boolean = false
        Do
            Try
                Return xlApp.Run("PostToApiXmlToJson", Package, "api/test/add")  

            Catch e As System.Runtime.InteropServices.COMException
                If e.ErrorCode = -2146777998 Then
                    failed = True
                    System.Threading.Thread.Sleep(10)
                End If
                Debug.Write(String.Concat({"ErrorCode: #### ", e.ErrorCode, " #### PostToAPI"}))
            End Try

            count = count + 1

            Loop Until failed = False Or count > 100

        Catch err As Exception
            Return err.Message
        End Try
    End Function

那么有没有从另一个 xll 调用函数的不同方式?

或者有没有办法告诉函数在函数空闲之前不要计算?

或者有没有办法告诉 Excel 这个函数没有计算完再试一次?

是否有人需要更多信息来提供帮助?

任何帮助将不胜感激

【问题讨论】:

    标签: c# vb.net excel excel-dna vba


    【解决方案1】:

    当您运行 AsyncTest 时,SyncTest 将在 ThreadPool 线程上运行(由于 Task.Run)。从那里您正在从 Excel 进行 COM 调用。

    作为一项规则,Excel 插件应该永远从除主计算线程之外的任何线程调用 Excel。 Excel COM 对象模型(基本上)是单线程的,因此所有 COM 调用最终都必须在主线程上执行。来自另一个线程的任何调用都可能会失败,并出现您看到的 COM 错误。

    Excel-DNA 有一个帮助方法,允许您安排委托在 Excel 主线程上运行 - 您调用 ExcelAsyncUtil.QueueAsMacro(...)。这将使委托在 Excel 准备就绪后运行,并且该上下文中的 COM 和 C API 调用都将起作用,因为委托将在宏上下文中的主线程上运行。 ExcelAsyncUtil.QueueAsMacro 可以随时从任何线程调用。

    【讨论】:

    • 感谢它很好地释放了用户的移动,但是当用户打开条件格式窗口或弹出消息时仍然存在问题,宏仍在尝试运行仍在尝试运行,推回错误。
    • 使用这个例子,link,当消息框打开时,函数会在尝试运行时返回错误。
    • 我发现在 .dll 文件中具有功能更容易,插件使用 XML 文件与 api 进行通信,用于地址和凭据,其他插件在功能区中处理.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多