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

解決


SELNA  2004-04-22 07:13:02  No: 8505

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

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

xxx := nil;

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

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

開発環境
Win2k
Delphi6 Personal


るるとん@K  2004-04-22 07:45:56  No: 8506

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


るるとん@K  2004-04-22 07:48:56  No: 8507

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


るるとん@K  2004-04-22 07:49:54  No: 8508

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


るるとん@K  2004-04-22 07:56:25  No: 8509

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


つっか  2004-04-22 07:59:43  No: 8510

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


SELNA  2004-04-22 08:00:21  No: 8511

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

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

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


つっか  2004-04-22 08:04:56  No: 8512

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

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


SELNA  2004-04-22 08:07:32  No: 8513

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

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

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


つっか  2004-04-22 08:28:03  No: 8514

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加