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

わんくま同盟

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

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


(過去ログ 5 を表示中)
■5541 / )  Re[6]: COMオブジェクトの解放について
□投稿者/ 魔界の仮面弁士 少尉(125回)-(2006/08/16(Wed) 10:32:23)

分類:[C#] 

うーん。先に書いたように、細かい点で気になる所はありますが、
今のところ、大きな問題は見当たらないですね。

MarshalOBJ(foo) を呼ぶのではなく、そのまま素直に
Marshal.RelaseComObject(foo) を呼んだ場合も駄目ですか?

> 明示的型変換をするように変更してみます。

Private Sub MarshalOBJ(ByRef objCom As Object) の部分について気になる点。

1. 引数自体は、ByVal でも十分だと思います。
2. というより、ByRef Object だと、Option Strict On の場合にエラーです。
3. Nothing 代入は必ずしも必要ではありません。RelaseComObject の方が大事。
4. 念のため、Try 部でエラーを捕らえていないか確認しておきましょう。
5. どうせなら、IsNothing 判定と IsComObject 判定も行うとベターかも。
6. 特定条件下においては、暗黙の参照カウント増加が発生する場合があるので、
RelaseComObject の戻り値が 0 か否かもついでに判定してみましょう。


今回のケースで、6. に相当する状況が発生しているかは不明ですが、以前、

 'アーリーバインディング
 Dim oRange As Excel.Range = 〜〜
 Dim Hs As Excel.HPageBreaks = oWorksheet.HPageBreaks
 Dim H As Excel.HPageBreak = Hs.Add(oRange) '改ページ挿入

 'レイトバインディング
 Dim oRange As Object = 〜〜
 Dim Hs As Object = oWorksheet.HPageBreaks
 Dim H As Object = Hs.Add(oRange) '改ページ挿入

の 2 種の同等なコードにおいて、後者の場合のみ、Add メソッドの実行後に
Marshal.ReleaseComObject(oRange) の戻り値が 1 になってしまい、結果、
oRange を 2 回 ReleaseComObject しないと終了しなかった経験があります。
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200512/05120042.txt


> 間違いありません。また現状のコードでも新規ブックに書き込むようにすると
> プロセスは残りません。
聞いた話では、VBA コードや Excel アドインその他の理由によって、
オブジェクトの解放が即座に行われない(あるいは阻害される)という現象が
おきる事があるらしいですが、当方には該当のブックが無いので検証できません。

もし、公開して差し支えない物であれば、問題の test.xls と、その検証用の
最小限のコードを zip/lzh 圧縮して、ここに載せてみては如何でしょう。

0
返信 編集キー/


管理者用

- Child Tree -