2

VisualStudio2008でExtensibilityIDTExtensibility2インターフェイスを使用してExcel用の共有アドインを開発しました。

機能的には非常に基本的です。ワークブックを開くと、開いているワークブックのリストに保存されます。閉じると、アドインは新しいテキストファイルを作成し、ファイルにXMLを書き込みます。次に、このファイルは別のプロセスによって読み取られ、XMLが逆シリアル化されます。 。

アドインは通常の操作で機能します。したがって、ユーザーがファイルを開いたり閉じたりすると、アドインは本来の動作を実行し、開いているワークブックでExcelを終了すると、本来の動作を実行します。

問題は、ユーザーが開いているワークブックでExcelを開いて、ログオフを実行する場合です。OnDisconnectionとOnBeginShutdownの2つのメソッドは、まったく呼び出されていないようです。

私はこれをテストするために2つのことをしました:

  1. これらの2つのメソッドが呼び出されたときにログファイルに書き込むTextWriterTraceListenerを作成しました。Excelが正常に終了すると、それらはヒットし、情報がログファイルに記録されますが、ユーザーがログオフすると、ログファイルには何も記録されません。

  2. File.CreateText(filename)を使用してこれらの両方のメソッド内で、空のファイルを作成しました。ユーザーが通常Excelを終了すると、これらのファイルが作成されますが、再度、ログオフによってExcelを閉じると、これらのファイルは作成されません。

誰かが私がこの問題を回避する方法について何かアイデアを持っていますか?ユーザーがマシンからログオフしているときにExcelが閉じられているときにキャプチャする必要があります...

4

3 に答える 3

1

最終的な解決策は、フックしMicrosoft.Win32.SystemEvents.SessionEndingて、このSystemイベントが発生したときに、手動でOnBeginShutdownメソッドを呼び出すことでした。

于 2011-04-01T13:27:32.937 に答える
0

これは、VB6日間でオブジェクトのメソッド〜失敗エラーを引き起こすために使用されていました。

WorkbookBeforeCloseまたは潜在的にProtectedViewWindowBeforeCloseを試してください。

私が正しく覚えていれば、これらの問題の1つは、イベントがキャンセルされたときにキャプチャできないことです。したがって、これを使用してクリーンアップする場合は、いずれかの作業も行う必要があると思います。ユーザーがクローズアクションをキャンセルした場合にアドインが使用できるように、イベントをアクティブ化またはオープンします。

これが理にかなっていることを願っています。

于 2010-12-07T15:46:31.880 に答える
0

Outlook2010アドインでも同じ問題が発生しました。Outlook2010がシャットダウンしていることをアドインに通知しないという事実と関係があるかもしれません。

具体的には、Outlook [2010]は、高速シャットダウン中にIDTExtensibility2インターフェイスのOnBeginShutdownメソッドとOnDisconnectionメソッドを呼び出さなくなりました。

同様に、Microsoft Visual Studio Tools for Officeで作成されたOutlookアドインは、Outlookのシャットダウン時にThisAddin_Shutdownメソッドを呼び出さなくなりました。

Outlook 2010がシャットダウンしたときに(私が行ったように)アドインに通知を送信したい場合は、以下のコードを使用して、ApplicationApplicationEvents_Event_Quitイベントをラッチする必要があります(シャットダウンコードはOnDisconnectionOnBeginShutdownメソッドの両方で実行する必要があります。とにかく):

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
{
    // As this is an Outlook-only extension, we know the application object will be an Outlook application
    _applicationObject = (Microsoft.Office.Interop.Outlook.Application)application;

    // Make sure we're notified when Outlook 2010 is shutting down
    ((Microsoft.Office.Interop.Outlook.ApplicationClass)_applicationObject).ApplicationEvents_Event_Quit += new ApplicationEvents_QuitEventHandler(Connect_ApplicationEvents_Event_Quit);
}

private void Connect_ApplicationEvents_Event_Quit()
{
    Array emptyCustomArray = new object[] { };
    OnBeginShutdown(ref emptyCustomArray);
}

public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom)
{
    addinShutdown();
}

public void OnBeginShutdown(ref System.Array custom)
{
    addinShutdown();
}

private void addinShutdown()
{
    // Code to run when addin is being unloaded, or Outlook is shutting down, goes here...
}
于 2011-10-04T15:23:30.407 に答える