2010-05-04 108 views
2

後釋放的Excel我讀過許多後找我的答案,但都與此類似: Reading excel files in vb.net leaves excel process hanging使用互操作

我的問題是,我不退出應用程序...

我們的想法是這樣的:

如果用戶有Excel中打開,如果他有我感興趣的打開文件...獲取Excel實例,做任何我想做的事......

但我完成後請不要關閉他的文件...我想讓他保持工作王,關閉它的問題是,當他關閉Excel ...該進程繼續運行...並正在運行...並在用戶用X按鈕關閉Excel後運行...

這是我如何嘗試做

這件作品是用來知道他有沒有Excel中打開,並在對我檢查的文件名,我感興趣的

Try 
     oApp = GetObject(, "Excel.Application") 
     libroAbierto = True 
     For Each libro As Microsoft.Office.Interop.Excel.Workbook In oApp.Workbooks 
      If libro.Name = EquipoASeccionIdSeccion.Text & ".xlsm" Then 
       Exit Try 
      End If 
     Next 
     libroAbierto = False 
    Catch ex As Exception 
     oApp = New Microsoft.Office.Interop.Excel.Application 
    End Try 

這裏是我的代碼...如果他沒有打開Excel,我創建一個新實例,打開文件和其他所有內容。

我的代碼只能到此爲止:

If Not libroAbierto Then 
     libroSeccion.Close(SaveChanges:=True) 
     oApp.Quit() 
    Else 
     oApp.UserControl = True 
     libroSeccion.Save() 
    End If  
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(libroOriginal) 
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(libroSeccion) 
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(origen) 
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(copiada) 
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oApp) 
    libroOriginal = Nothing 
    libroSeccion = Nothing 
    oApp = Nothing 
    origen = Nothing 
    copiada = Nothing 
    nuevosGuardados = True 

所以你可以看到,如果我打開這個文件,我叫oApp.Quit()和(幾秒鐘後一切,Excel進程可能結束5 aprox。)

但是如果我的意思是用戶保持打開文件(而不是調用Quit()),Excel進程會在用戶使用X按鈕關閉Excel後繼續運行。

有沒有辦法做我想做的事?控制一個開放的Excel實例並釋放一切,當用戶用X按鈕關閉時,Excel進程正常死亡?

謝謝!

回答

0

在我看來,使用CreateObject而不是GetObject(, "Excel.Application")(見http://support.microsoft.com/kb/288902/enhttp://technet.microsoft.com/en-us/library/ee176980.aspx)會更好。然後在調用FinalReleaseComObject和assigninh之前調用Quit方法沒有什麼明確的意義。

+0

但是CreateObject創建一個新的Excel實例...我想獲得一個已經打開的Excel Book ...並且當我的應用程序完成使用時我想讓它打開...問題在於最後,如果用戶關閉Excel,該進程將繼續運行 – figus 2010-05-05 15:00:16

+0

如果Excel已經運行,則不應關閉它。如果僅使用GetObject(,「Excel.Application」),如果它尚未運行,您將無法啓動Excel。請閱讀我在答案中包含的兩個參考資料。還有一點意見。它啓動一個應用程序的新實例,它不需要雙重內存。大多數DLL和EXE代碼將在應用程序之間共享。只需將「Memory - Working Set」與應用程序的「Memory - Private Working Set」進行比較即可。名稱「Memory - ...」是任務管理器(用於Windows 7)中列的名稱或使用Process Explorer(www.sysinternals.com) – Oleg 2010-05-05 18:16:01