CreateComObject関数で生成したインターフェイスを明示的に解放してやりたいのですがxxx._Releaseメソッドを呼び出すとアプリケーション終了時に例外エラーが出ました。
VBっぽく解放できないものかと、
xxx := nil;
としみてたら上手く解放できました。
(Releaseメソッドが呼び出されたらテキストにデバッグ出力しています。)
この方法は正しいのでしょうか?
いろいろ検索したのですが見つからなかったので質問した次第です。
よろしくお願いします。
開発環境
Win2k
Delphi6 Personal
xxx:=nil;では
xxx自体が何も示さないようになるだけです
要するにxxxが指すオブジェクト自体がnilになることは有りません
xxxがnilを指すようになります
オーナーがApplication等の場合、自動で解放されるため、プログラムでReleaseすると二重で解放され、nilを解放することになりエラーになります
nil を代入すると、COM インタフェースで Free と同等の動作をする場合があるね。
TImage.Picture.Bitmap なんかも nil を代入すると、Bitmap オブジェクトが
破棄されるんじゃなかったかな。ほかにもハンドル値にゼロを代入すると、いままで
保持していたリソースハンドルは破棄する場合もあるね。
レスありがとうございます。
>xxx:=nil;では
>xxx自体が何も示さないようになるだけです
しかしながら、インターフェイスの解放はできているのですが…。
nilを代入すると確実にReleaseメソッドは呼び出せています。
> しかしながら、インターフェイスの解放はできているのですが…。
> nilを代入すると確実にReleaseメソッドは呼び出せています。
ならそれでいいんじゃないですか。
お早いレスどうもです
(書いてる間に返信が^^)
なるほど。
nilを代入するとオブジェクトが破棄されるのですね。
勉強になりました。
るるとん@Kさんつっかさんありがとうございました。
あらためて Delphi COM Programming by E. Harmon を読んでみると、インタフェースは
参照カウントされているので、参照するローカル変数が関数の外にでて破棄されたり、
nil を代入して、参照を消すと、参照カウントがゼロになって、Release メソッドが
自動的に呼ばれるようですね。
ツイート | ![]() |