トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

VB.NETでExcelを起動するとExcel.exeが落ちない

VB.NETでExcelを起動すると、Excel.exeが落ちない。
参照カウントを全てデクリメントしないと落ちないらしい。

以下のソースの様にすると落ちるようになる。

public sub test()
  'Excelアプリケーションの生成
  Dim xlApp As New Excel.Application
  Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
  Dim xlFilePath As String = Path.GetFullPath(pclsXmlSet.pXmlIni.pstrExcelPath & strTemplate)
  'Excelのワークブック作成
  Dim xlBook As Excel.Workbook = xlBooks.Add(xlFilePath)
  'xlBook = xlBooks.Add(xlFilePath)
  Me.subSetData(xlBook)
  'Excelの表示
  xlApp.Visible = True
  
  subExcelRelease(xlApp)
  MRComObject(CObj(xlBooks))
  MRComObject(CObj(xlApp))
  xlApp = Nothing
  
  'xlApp.Quit()
End Sub

Private Sub subExcelRelease(ByRef xlApp As Excel.Application)
    'AddHandler xlApp.WorkbookBeforeClose, AddressOf subWKClose
    Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
    Dim xlSheets As Excel.Sheets

    For intBooks As Integer = 1 To xlBooks.Count
        xlSheets = xlBooks(intBooks).Worksheets
        For intSheets As Integer = 1 To xlSheets.Count
            MRComObject(CObj(xlSheets(intSheets)))
        Next
        MRComObject(CObj(xlSheets))
        MRComObject(CObj(xlBooks(intBooks)))
    Next

    MRComObject(CObj(xlBooks))
    MRComObject(CObj(xlApp))

End Sub

Private Sub MRComObject(ByRef objCom As Object)
    'COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する
    Try
        '提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメントします
        If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _
                                                  Marshal.IsComObject(objCom) Then
            Dim I As Integer
            Do
                I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
            Loop Until I <= 0
        End If
    Catch
    Finally
        '参照を解除する
        objCom = Nothing
    End Try
End Sub

[カテゴリ: プログラミング言語 > VisualStudio]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2008年05月25日 22時56分47秒