アプリケーション終了時にリソースを開放するようにしてみました。(アイコンのセット直前にしか開放していなかった)
http://ttssh2.sourceforge.jp/snapshot/ttpmenu.zip
再現環境がないので、これで改善されなかったらエラーの詳細を教えて頂けますか?
maya への返信
再現環境がないので、これで改善されなかったらエラーの詳細を教えて頂けますか?
早速のご対応ありがとうございます。
試してみましたが、状況はかわりませんでした。
現象は、ttpmenuを実行しているPCにおいて、画面の解像度等を変更する
(WM_DISPLAYCHANGEを受け取る)と発生します。
WM_DISPLAYCHANGEを受け取ると、InitListMenu()が呼ばれるのですが、
この中で実行されているExtractAssociatedIconEx()において、SHGetFileInfo()
で取得したアイコンリソースを開放していないので、リソースリーク
が発生します。
http://sourceforge.jp/projects/ttssh2/svn/view/trunk/ttpmenu/ttpmenu.cpp?root=ttssh2&r1=4357&r2=4503
今回の修正前から、InitListMenu の中でアイコンリソースの開放をしています。今回の修正では、アプリケーション終了時にもリソースを開放するようにしました。
ExtractAssociatedIconExで取得したアイコンリソースは、トレイアイコンのExecuteメニューのサブメニューでの表示、およびList Configurationメニューを押したときのList Itemの表示に利用されているので、アプリケーションが終了するまで開放できないものと思います。
リモートデスクトップを使わず単純に画面の解像度変更をしてみましたが、こちらでは落ちることはありませんでした。
たびたびすみません。
リモートデスクトップを使わず単純に画面の解像度変更をしてみましたが、こちらでは落ちることはありませんでした。
ttpmenuが落ちるわけではなく、GDIリソースがリークします。
タスクマネージャでGDIリソースの項目を表示して、解像度を変更すると確認できます。
ExtractAssociatedIconExの中では、SHGetFileInfo()を実行し、CopyIconでhLargeIconや
hSmallIconにアイコンをコピーしています。
本来、コピー後、sfi.hIconをDestroyIconで開放しなくてはいけないのですが、実行されていません。
ttpmenuを利用中に、リモートデスクトップでのログオンとコンソールからの ログオンを交互に実施すると、GDIオブジェクトのリソースリークが発生します。
ExtractAssociatedIconEx()において、SHGetFileInfo()で取得したアイコンリソース を開放していないのが、原因のようです。