C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: サンプルの「COM オブジェクトの参照カウントを解放する」で


(過去ログ 10 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■1869 / inTopicNo.1)  サンプルの「COM オブジェクトの参照カウントを解放する」で
  
□投稿者/ ボビン (1回)-(2007/03/07(Wed) 19:21:06)

分類:[VB.NET (Windows)] 

こんばんは、ボビンと申します。

いつもサイトを開発の参考にさせていただいています。
そこで疑問があり、ご質問させていただきました。よろしくお願いします。

サンプルにある、「COM オブジェクトの参照カウントを解放する」のVB.NETですが、

このように書くのは間違いでしょうか?

↓↓↓

        ' COM オブジェクトの参照カウントを解放する

        ' VB.NET
        ' 必要な変数は Try の外で宣言する
        Dim xlApplication As Excel.Application

        ' COM オブジェクトの解放を保証するために Try 〜 Finally を使用する
        Try
            xlApplication = New Excel.Application()

            ' 警告メッセージなどを表示しないようにする
            xlApplication.DisplayAlerts = False

            Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
            Dim xlBook As Excel.Workbook = xlBooks.Add()
            Dim xlSheets As Excel.Sheets = xlBook.Worksheets
            Dim xlSheet As Excel.Worksheet = DirectCast(xlSheets(1), Excel.Worksheet)
            Dim xlCells As Excel.Range = xlSheet.Cells
            Dim xlRange As Excel.Range = DirectCast(xlCells(6, 4), Excel.Range)

            Try
                ' Microsoft Excel を表示する
                xlApplication.Visible = True

                ' 1000 ミリ秒 (1秒) 待機する
                System.Threading.Thread.Sleep(1000)

                ' Row=6, Column=4 の位置に文字をセットする
                xlRange.Value2 = "あと 1 秒で終了します"

                ' 1000 ミリ秒 (1秒) 待機する
                System.Threading.Thread.Sleep(1000)

            Finally
                If Not xlRange Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                End If
                If Not xlCells Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)
                End If
                If Not xlSheet Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
                End If
                If Not xlSheets Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
                End If

                If Not xlBook Is Nothing Then
                    Try
                        xlBook.Close()
                    Finally
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
                    End Try
                End If
                If Not xlBooks Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
                End If
            End Try
        Finally

            If Not xlApplication Is Nothing Then
                Try
                    xlApplication.Quit()
                Finally
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
                End Try
            End If
        End Try

↑↑↑

Try〜Finallyがたくさんあるところを、まとめただけですが、
試してみたところ
サンプルも、こちらのコードもタスクマネージャのプロセスから"EXCEL.EXE"は消えました。
こちらの書き方では、問題がありますでしょうか。
サンプルの書き方でないと、やはり正しく解放されないのでしょうか?
それとも、わかりやすくするために、Try〜Finallyがたくさんある、サンプルの書き方となっているのでしょうか?

ズレた質問だったらすみませんが、よろしくお願いします。
環境はwin2K + VB2005 + office2003 です。


引用返信 編集キー/
■1871 / inTopicNo.2)  Re[1]: サンプルの「COM オブジェクトの参照カウントを解放する」で
□投稿者/ 渋木宏明(ひどり) (153回)-(2007/03/07(Wed) 19:43:12)
渋木宏明(ひどり) さんの Web サイト
> Try〜Finallyがたくさんあるところを、まとめただけですが、

Finally 節の中で、ReleaseComObject() が例外を投げてきたらどうします?

引用返信 編集キー/
■1872 / inTopicNo.3)  Re[2]: サンプルの「COM オブジェクトの参照カウントを解放する」で
□投稿者/ じゃんぬねっと (398回)-(2007/03/07(Wed) 19:47:17)
じゃんぬねっと さんの Web サイト
掲示板をご利用頂きましてありがとうございます。

このあたりで同じ話題があがっています。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28598&forum=7&start=7
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=29278&forum=7
引用返信 編集キー/
■1885 / inTopicNo.4)  Re[3]: サンプルの「COM オブジェクトの参照カウントを解放する」で
□投稿者/ ボビン (2回)-(2007/03/08(Thu) 09:52:46)
No1872 (じゃんぬねっと さん) に返信
> 掲示板をご利用頂きましてありがとうございます。
>
> このあたりで同じ話題があがっています。
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28598&forum=7&start=7
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=29278&forum=7


渋木宏明(ひどり)さん、じゃんぬねっとさん、お返事ありがとうございます。
過去にも話題になっていたのですね。
なかなか難しくて、理解するのに時間がかかりそうですが、勉強になります。
どうもありがとうございました。

#中尉や神っておもしろいですね。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -