タイトル : Re^6: エクセル行削除を行うと、プロセスが残ってしまいました。 投稿日 : 2005/12/28(Wed) 11:00 投稿者 : 魔界の仮面弁士
> > EntireRow の参照を解放しないままなのでは? > ご指摘ありがとうございます。 > 今回の仕様は前述の通り変更しましたが、個人的に未解決が嫌なので > 考えていきます。 xlRange.EntireRow.Delete() '←問題B このように、「.」が2回連続する箇所は要注意です。解放漏れの可能性が大です。 そのドットが、名前空間(Microsoft.Office.〜など)の区切りを表している場合は良いのですが、 プロパティやメソッドの区切りだった場合、それが「ActiveXオブジェクト(COM)」を返していると、 参照の解放漏れが発生し、Excelが残ってしまう原因となります。 # ちなみに、最初から.NET専用に開発されれたコンポーネントの場合は、こうした問題はおきません。 # あくまで、.NET から ActiveX コンポーネントを扱う場合だけの話です。 今回の場合、xlRange は COM オブジェクト(Excel.Range)です。これは既に変数に受けてあるので良いとして。 Range クラスの EntireRow プロパティもまた、COM を返します。Excel.Range ですね。 ですから、これも変数に受けねばなりません(が、提示されてコードでは変数受けていませんね)。 ちなみに、その Delete メソッドは Boolean 型を返します。もし、これが COM を返す場合は、 やはり変数に受けて、最後に解放する必要がある事に注意してください。 > > 参照カウントとか、そういう勉強をした方がいいかもしれませんね。 > はい、このことは勉強が足らないことを痛感しています。 .NET のオブジェクトが、すべて System.Object を実装しているのと同様に、 COM のオブジェクトは、すべて IUnknown というインターフェイスを実装しています。 そして IUnknown は、「参照カウント」と「型変換機能」の2つの機能を持っています。 参照カウンタとは、『ActiveXコンポーネントが参照されている回数』を管理する仕組みです。 ・COMオブジェクトが生成されると、参照カウンタが 1 にセットされます。 ・COMオブジェクトが変数等に参照されると、参照カウンタが自動的に増加します。 ・型変換を行った場合も参照カウンタが増加します。 ・参照していた変数等が解放されると、参照カウンタも減少します。 ・最終的に参照カウンタが 0 になると、メモリ上から解放されます。 これが、COM の「参照カウント」という仕組みです。 (上記では、意図的に "カウンタ" と "カウント" を使い分けています) ところが、.NET のメモリ管理は COM のそれとは異なる仕組みになっています。 .NET側の説明は省きますが、この両者の違いが原因で、.NET側で変数が解放されても、 それが COM 側に即座に伝わる事はありません。そのため、COM の 解放処理を行うために、 明示的に『ReleaseComObject メソッド』を呼ぶ必要があるというわけです。 # VB6 や VBScript は、元々が COMベースの言語なので、明示的な解放は不要なのですけれども。 > これはといったものに当たらない状況です。。。 少し専門的になってもよければ、虚無僧あたりは如何でしょう。 hhttp://www5.plala.or.jp/atata/ 参照カウンタについては、上記サイト内の COM研究室 - SEQ 5〜6 あたりで取り扱われています。 |