0

我正在开发 VSTO 加载项。我有一个自定义功能区,在该功能区上有一个名为TemplateCallButton. 我还有其他几个功能和按钮,其中一个只是打开一个带有模板的文件夹(作为示例包含在内)。如果其他操作之一已完成,TemplateCallButton唯一的工作并添加到模板文件中(似乎无关紧要)。在任何其他操作运行后,它会按预期工作。

更令人沮丧的是,这种行为似乎只发生在我部署的机器上,而不是我正在开发的机器上。这是TemplateCallButton代码:

Public Class InsightLabProcessor
  Dim MainTemplatePath As String = "C:\Insight\Insight.xltm"
  ....
  Private Sub TemplateCallButton_Click(sender As Object, e As RibbonControlEventArgs) Handles TemplateCallButton.Click
    Dim objApp As Excel.Application
    objApp = Marshal.GetActiveObject("Excel.Application")
    objApp.Visible = True
    Dim objWorkbook As Excel.Workbook = objApp.Workbooks.Open(MainTemplatePath)
    objWorkbook.Worksheets(4).Activate()
  End Sub

这是刚刚打开文件夹的按钮的代码:

Private Sub PhaseCodeFolderOpenButton_Click(sender As Object, e As RibbonControlEventArgs) Handles PhaseCodeFolderOpenButton.Click
    Process.Start("explorer.exe", "C:\Insight\Phase Codes")
End Sub

或打开控制表单的一个:

Private Sub ControlPannel_Click(sender As Object, e As RibbonControlEventArgs) Handles ControlPannel.Click
    Dim controlpanel As New ControlPanel
    controlpanel.Show()
    controlpanel = Nothing
End Sub

我觉得我一定错过了一些简单的东西。

谢谢。

4

1 回答 1

0

所以这个问题实际上是这里解决的问题:http: //support.microsoft.com/kb/238610,作为一个加载项处理它似乎非常恶毒。我找到的最好的解决方案(同样不是很优雅)是打开命令行,写下我们正在等待第一个实例加载,在任何人太好奇之前关闭它。我在 4 台机器上进行了尝试,根据经验发现我需要的最长等待时间是 250 毫秒,所以我将它加倍到 500:

    ...
    Shell("C:\Windows\System32\cmd.exe", AppWinStyle.MaximizedFocus)
    System.Threading.Thread.Sleep(10) 'give cmd just a bit to take the line
    SendKeys.Send("Waiting for Excel to register in Running Object Table")
    System.Threading.Thread.Sleep(490)
    Dim Term() As Process = Process.GetProcessesByName("cmd")
    For Each P As Process In Term
        P.Kill() 'user probably doesn't have any other instances of cmd open, if they do they are colaterial damage, may handle that if it becomes an issue
    Next
    Dim objApp As Excel.Application
    objApp = Marshal.GetActiveObject("Excel.Application")
    objApp.Visible = True
    Dim objWorkbook As Excel.Workbook = objApp.Workbooks.Open(MainTemplatePath)
    objWorkbook.Worksheets(4).Activate()

我会再次回来,除了任何更优雅或最终用户可以接受的东西。我真的很想知道是否有办法强制 Excel 注册到 ROT。也许我应该把它变成另一个问题。

于 2013-03-29T03:01:32.000 回答