2014-04-06 96 views
1

我有一個像我的應用程序中的Windows資源管理器模塊。 我想處理該模塊中的單詞和excel文件的打開和關閉。 當我開放f.e. 4-5個文件在同一時間,關閉處理程序無法正常工作。MS互操作Word,Excel多個打開的文件DocumentBeforeClose處理

問題是:有時在關閉Word應用程序後,我的應用程序不會在wordDocEvents_DocumentBeforeClose函數的開始處停止斷點。 似乎與相關的進程間通信有關,因爲每個打開的文件都是一個新的進程。

如果它是已知的問題,請幫助,否則我會嘗試在我的代碼中做一些事情。

代碼快照:

if (_wordApp == null) 
{ 
    _wordApp = new Word.Application(); 
    _wordDocEvents = (Word.ApplicationEvents4_Event)_wordApp; 
    if (!isLocked) 
    { 
     //_wordDocEvents.Quit += new Word.ApplicationEvents4_QuitEventHandler(wordDocEvents_Quit); 
     _wordDocEvents.DocumentBeforeClose += new Word.ApplicationEvents4_DocumentBeforeCloseEventHandler(wordDocEvents_DocumentBeforeClose); 
     _wordDocEvents.DocumentBeforeSave += new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(wordDocEvents_DocumentBeforeSave); 
     _wordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone; 
    } 
} 
_wordApp.Visible = true; 
Word.Document oDoc = _wordApp.Documents.Open(fileName, null, isLocked); 

oDoc.Activate(); 
_wordApp.Visible = true; 
_wordApp.Activate(); 

關閉處理程序:

void wordDocEvents_DocumentBeforeClose(Word.Document doc, ref bool Cancel) 
{ 
    if (!doc.Saved) 
    { 
     MessageBoxResult res = MessageBox.Show(ApplicationValues.GetResourceString("library_file_save_changes"), "", MessageBoxButton.YesNoCancel, MessageBoxImage.Question, MessageBoxResult.Yes, System.Windows.MessageBoxOptions.DefaultDesktopOnly); 
     switch (res) 
     { 
      case MessageBoxResult.Yes: 
      doc.Save(); 
       break; 
      case MessageBoxResult.No: 
       doc.Saved = true; 
       break; 
      default: 
       Cancel = true; 
       return; 
     } 
    } 
    interopFileBeforeCloseHandler(doc.FullName, doc.ReadOnly); 

} 
+0

你能弄明白嗎?我們遇到同樣的問題。 – animaonline

+0

這個問題仍然沒有答案...?:(我也有同樣的問題..有時關閉事件觸發器,有時它不... –

+0

我只是停止使用MS互操作,這是我的解決方案對不起:) – artos

回答

0

這是一個較舊的,但我發現這個線程在MSDN後想通了: workbookbeforeclose-event-does-not-fire

所以一相當容易的解決方案是將所有創建/加載的文檔存儲到一個數組/列表//...所以垃圾收集器不會處理它們,當它認爲它需要做所以,從而清除所有事件處理程序。

工作就像一個魅力對我來說;)