Excel アドイン - OnDisconnection/OnBeginShutdown がログオフ時に呼び出されない
-
09-10-2019 - |
質問
Visual Studio 2008 の拡張機能 IDTExtensibility2 インターフェイスを使用して Excel 用の共有アドインを開発しました。
機能的には非常に基本的なものです。ワークブックが開かれると、開いているワークブックのリストに保存されます。ワークブックが閉じると、アドインは新しいテキスト ファイルを作成し、そのファイルに XML を書き込みます。このファイルは別のプロセスによって読み取られ、XML が逆シリアル化されます。 。
アドインは通常の操作で動作します。そのため、ユーザーがファイルを開いたり閉じたりすると、アドインは本来の動作を行い、ユーザーがブックを開いた状態で Excel を終了した場合、アドインは本来の動作を行います。
問題は、ユーザーがブックを開いた状態で Excel を開いてログオフした場合です。2 つの方法:OnDisconnection と OnBeginShutdown はまったく呼び出されないようです。
これをテストするために 2 つのことを行いました。
これら 2 つのメソッドが呼び出されたときにログ ファイルに書き込む TextWriterTraceListener を作成しました。Excel が通常どおり終了すると、ヒットして情報がログ ファイルに記録されますが、ユーザーがログオフすると、ログ ファイルには何も記録されません。
これら両方のメソッド内で File.CreateText(filename) を使用して空のファイルを作成しました。通常、ユーザーが Excel を終了するとこれらのファイルが作成されますが、ログオフによって Excel を閉じると、これらのファイルは作成されません。
この問題を回避する方法を知っている人はいますか?ユーザーがマシンからログオフしているときに Excel が閉じられるときをキャプチャする必要があります...
解決
最終的な解決策は、 Microsoft.Win32.SystemEvents.SessionEnding
そして、この System イベントが発生したときに、手動で OnBeginShutdown
方法。
他のヒント
これにより、VB6 時代にはオブジェクト ~ のメソッドが失敗しましたというエラーが発生していました。
WorkbookBeforeClose または場合によっては ProtectedViewWindowBeforeClose を試してください。
私の記憶が正しければ、これらで発生する可能性のある問題の 1 つは、イベントがキャンセルされた場合にいつキャプチャできないかということです。そのため、これをクリーンアップに使用している場合は、いずれかの作業も行う必要があると思います。ユーザーが終了アクションをキャンセルした場合にアドインが使用可能になるように、イベントをアクティブ化またはオープンします。
これが理にかなっていることを願っています。
Outlook 2010 アドインでも同じ問題が発生しました。という事実と関係があるかもしれません 2010 年の展望 ではない アドインにシャットダウンしていることを知らせる.
具体的には、Outlook [2010] では、 シャットダウン開始時 そして 切断時 高速シャットダウン中の IDTExtensibility2 インターフェイスのメソッド。
同様に、Microsoft Visual Studio Tools for Office で作成された Outlook アドインは、 ThisAddin_Shutdown Outlook がシャットダウンするときの方法。
(私と同じように) Outlook 2010 のシャットダウン時にアドインに通知を受け取りたい場合は、 Application
さんの ApplicationEvents_Event_Quit
以下のようなコードを使用してイベントを実行します (シャットダウン コードは両方の環境で実行されるはずです) OnDisconnection
そして OnBeginShutdown
いずれの場合もメソッド):
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...
}