タイトル : Re: クリップボード監視時のエラーについて 投稿日 : 2009/04/16(Thu) 15:56 投稿者 : Hongliang
まず、いわゆるサブクラス化は、WinForms では継承と WndProc のオーバーライドで対応します。WndProc で Web 検索すれば色々見つかるでしょう。 これで問題そのものが消えますね。 さて今回の問題の原因ですが。 AddressOf 演算子は Delegate オブジェクトを作って返します。この Delegate オブジェクトへの参照が残っている限り、GC によって片付けられる心配はありません。 しかし、SetWindowLong はメモリ管理外、つまりアンマネージドな世界です。この関数にオブジェクトを渡したところで、そっちに参照が確保されたりはしません。 そうすると、AddressOf で作成した Delegate オブジェクトは、メソッドを抜ければ誰からも参照されないただの使い捨てのローカル変数と言うことになります。 参照が残らないのでそのうち GC が動いたときに片付けられ、その後ウィンドウプロシージャがコールバックされたときに参照すべきメソッドのあて先が消失していて例外、と言うわけです。 GC.Collect の呼び出しによってっていうのはジェネレーションが上がったからとかその程度の理由で、解決策にはなり得ていません。 デリゲート変数をフィールドに確保して、AddressOf の返値をそれに代入してやれば、参照はそのオブジェクトの寿命まで(この場合なら Form1 ですね。名前からしてメインフォームでしょうから事実上アプリケーションの終了まで)残ることになって GC の対象にならなくなります。 |