tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 あたりで取り扱われています。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。