2010-12-07 14 views
2

に呼ばれるが、私は、Visual Studioの拡張IDTExtensibility2インターフェイスを使用してExcelの共有アドインを開発してきた2008年エクセルアドイン - OnDisconnection/OnBeginShutdownないログオフ

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

アドインは通常の操作で動作します。そのため、ユーザーがファイルを開いて閉じると、アドインが必要な処理を行います。開いているワークブックでExcelを終了したら、それは必要な処理を行います。

問題は、ユーザーが開いているワークブックでExcelを開いていて、ログオフしているときです。 2つの方法:OnDisconnectionとOnBeginShutdownはまったく呼び出されないようです。

私はこれをテストするには、2つの事でした:私はこれらの2つの方法が呼び出されたときに、ログファイルに書いては、TextWriterTraceListenerを作成

  1. を。 Excelが正常に終了すると、ヒットし、情報はログファイルに記録されますが、ユーザーがログオフするとログファイルには何も記録されません。

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

この問題を回避する方法はありますか?ユーザーがマシンからログオフしているときにExcelが終了しているときにキャプチャする必要があります。

答えて

1

最終的にはMicrosoft.Win32.SystemEvents.SessionEndingに接続し、このシステムイベントが発生したときに手動でOnBeginShutdownメソッドを呼び出すことでした。

0

これは、VB6でオブジェクト〜失敗エラーのメソッドを発生させるために使用されます。

WorkbookBeforeCloseまたはProtectedViewWindowBeforeCloseを試してみてください。

私が正しく覚えていれば、あなたが持っているかもしれない1つの問題は、イベントがキャンセルされたときにはキャプチャできないため、これを使ってクリーンアップすると、ユーザーが閉じるアクションをキャンセルした場合にアドインが使用可能になるように、activateイベントまたはopenイベントのいずれかで実行されます。

+0

私はすでに方法についてラウンドで、WorkbookBeforeCloseを使用していますが、ときに私は、TextWriterTraceListenerにログインなるようにテストとして、私はそれを変更いわゆる。 Excelが正常に終了すると、デバッグメッセージがログに書き込まれますが、Excelがユーザーログオフで閉じられると、デバッグメッセージはログファイルに書き込まれません。 – kzhen

+0

また、OnDisconnectionおよびOnBeginShutdownがなぜオフになっているのか〜に電話した... – kzhen

0

私のOutlook 2010アドインで同じ問題がありました。それは、Outlook 2010 does not signal add-ins that it is shutting downという事実と関係があるかもしれません。

具体的には、Outlookの[2010]もはや高速シャットダウン時IDTExtensibility2インターフェイスの OnDisconnection OnBeginShutdownとメソッドを呼び出していません。

同様に、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... 
} 
関連する問題