0

私はVSTOアドインに取り組んでいます。カスタマイズしたリボンがあり、そのリボンには というボタンがありますTemplateCallButton。他にもいくつかの機能とボタンがあり、そのうちの 1 つはテンプレートを含むフォルダーを開くだけです (例として含まれています)。他のTemplateCallButtonアクションの1つが完了した場合にのみ機能し、テンプレートファイルに追加します(一見、どちらでもかまいません)。他のアクションが実行された後、期待どおりに機能します。

さらにイライラするのは、この動作が展開しているマシンでのみ発生し、開発中のマシンでは発生しないように見えることです。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 ミリ秒だったので、これを 2 倍にして 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 に答える