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

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

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

Re[2]: WordのCOMオブジェクトの解放について


(過去ログ 114 を表示中)

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

■67327 / inTopicNo.1)  WordのCOMオブジェクトの解放について
  
□投稿者/ 恐竜 (1回)-(2013/07/25(Thu) 12:32:38)

分類:[.NET 全般] 

例えば、VB.netより、

oWord = CreateObject("Word.Application")
oWord = GetObject(, "Word.Application")

などの方法でWordを操作する場合、操作が終わったらCOMオブジェクトの解放をしなくてはならないと色々なサイトで書かれておりますが、
例えばWordの操作が終わった後、Wordをそのまま開いておきたい場合があります。
この場合、WordアプリケーションやドキュメントコレクションなどのCOMオブジェクトの解放は必要なのでしょうか?
COMオブジェクトの仕組みがよく分かっていなくて申し訳ございませんが、宜しくお願いします。
引用返信 編集キー/
■67329 / inTopicNo.2)  Re[1]: WordのCOMオブジェクトの解放について
□投稿者/ 魔界の仮面弁士 (271回)-(2013/07/25(Thu) 12:54:26)
No67327 (恐竜 さん) に返信
> この場合、WordアプリケーションやドキュメントコレクションなどのCOMオブジェクトの解放は必要なのでしょうか?

ReleaseComObject による明示的解放とするのか、AppDomain のアンロードや GC 任せにするのかは別として、
COM の解放処理は必要です。というよりも、そもそもアプリケーションの終了と、COM オブジェクトの解放は別物です。

たとえば Word や InternetExplorer の場合、Quit メソッドを呼び出すことで
そのアプリケーションが終了することになりますが、終了させたからと言って
VB 側で保持している COM 参照や 相互運用機能アセンブリまでが解放されるわけではありません。
また、ユーザー操作による終了や、強制終了などについても同様です。

ただし参照を保持した相手が既に終了していた場合、すでに切断状態にあるため、
そのオブジェクトを継続利用するとエラーになります。


逆に、VB 側でオブジェクトを解放したからといって、接続先の EXE が終了するとも限りません。

ただし EXE によっては、どこからも参照されなくなった時点で、EXE 自体も終了するように
作られているものもあります。CreateObject 等を通じて COM コンポーネントとして呼び出された
Excel がこれに当たりますが、この場合は、最初に Process.Start 等で単独起動した上で、
GetObject なり IRunningObjectTable なりでインスタンスを拾うようにすれば、
COM 参照を破棄しても、EXE は終了せずに残り続けます。
引用返信 編集キー/
■67346 / inTopicNo.3)  Re[2]: WordのCOMオブジェクトの解放について
□投稿者/ 恐竜 (2回)-(2013/07/26(Fri) 11:27:02)
魔界の仮面弁士さま、ご回答ありがとうございました。
やはりWordをそのまま開いておきたい場合でもCOMの解放処理は必要なのですね。
ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -