COMオブジェクトを明示的に解放するには?

解決


SELNA  2004-04-22 07:13:02  No: 8505  IP: [192.*.*.*]

CreateComObject関数で生成したインターフェイスを明示的に解放してやりたいのですがxxx._Releaseメソッドを呼び出すとアプリケーション終了時に例外エラーが出ました。

VBっぽく解放できないものかと、

xxx := nil;

としみてたら上手く解放できました。
(Releaseメソッドが呼び出されたらテキストにデバッグ出力しています。)
この方法は正しいのでしょうか?

いろいろ検索したのですが見つからなかったので質問した次第です。
よろしくお願いします。

開発環境
Win2k
Delphi6 Personal

編集    削除
るるとん@K  2004-04-22 07:45:56  No: 8506  IP: [192.*.*.*]

xxx:=nil;では
xxx自体が何も示さないようになるだけです

編集    削除
るるとん@K  2004-04-22 07:48:56  No: 8507  IP: [192.*.*.*]

要するにxxxが指すオブジェクト自体がnilになることは有りません

編集    削除
るるとん@K  2004-04-22 07:49:54  No: 8508  IP: [192.*.*.*]

xxxがnilを指すようになります

編集    削除
るるとん@K  2004-04-22 07:56:25  No: 8509  IP: [192.*.*.*]

オーナーがApplication等の場合、自動で解放されるため、プログラムでReleaseすると二重で解放され、nilを解放することになりエラーになります

編集    削除
つっか  2004-04-22 07:59:43  No: 8510  IP: [192.*.*.*]

nil を代入すると、COM インタフェースで Free と同等の動作をする場合があるね。
TImage.Picture.Bitmap なんかも nil を代入すると、Bitmap オブジェクトが
破棄されるんじゃなかったかな。ほかにもハンドル値にゼロを代入すると、いままで
保持していたリソースハンドルは破棄する場合もあるね。

編集    削除
SELNA  2004-04-22 08:00:21  No: 8511  IP: [192.*.*.*]

レスありがとうございます。

>xxx:=nil;では
>xxx自体が何も示さないようになるだけです

しかしながら、インターフェイスの解放はできているのですが…。
nilを代入すると確実にReleaseメソッドは呼び出せています。

編集    削除
つっか  2004-04-22 08:04:56  No: 8512  IP: [192.*.*.*]

> しかしながら、インターフェイスの解放はできているのですが…。
> nilを代入すると確実にReleaseメソッドは呼び出せています。

ならそれでいいんじゃないですか。

編集    削除
SELNA  2004-04-22 08:07:32  No: 8513  IP: [192.*.*.*]

お早いレスどうもです
(書いてる間に返信が^^)

なるほど。
nilを代入するとオブジェクトが破棄されるのですね。
勉強になりました。

るるとん@Kさんつっかさんありがとうございました。

編集    削除
つっか  2004-04-22 08:28:03  No: 8514  IP: [192.*.*.*]

あらためて Delphi COM Programming by E. Harmon を読んでみると、インタフェースは
参照カウントされているので、参照するローカル変数が関数の外にでて破棄されたり、
nil を代入して、参照を消すと、参照カウントがゼロになって、Release メソッドが
自動的に呼ばれるようですね。

編集    削除