2008年10月26日

デスクトップアラート

 今日は昨日書くつもりで書けなかった「CMFCDesktopAlertWnd」クラスについて書きたいと思います。
 このクラスはどんなものかというと、通知領域の上へメッセージ用のウインドウを表示させるためのクラスで、表示するときの効果や、表示したあと一定時間で閉じるようにしたりできます。

 このクラスを使って、今は普通のツールチップヒントを使っている「MP3再生君」の曲変更時の曲表示部分に使えたら、と思ったのです。
 そこで、とりあえずメイン部分はそのままで、サンプルを参考にしてポップアップ処理の部分だけを書き替えてみました。

 しかし、いざ実行するとウインドウが表示される時にエラーになるので、何が悪いのか順を追って探っていくと、ダイアログのリソースIDが不正、となっていました。
 このクラスは、自前で用意したダイアログも使えるのですが、表示するメッセージやアイコンの有無などを設定するだけでも使えるようになっているので、こちら側が悪い、ということではなさそうです。

 ということで、何かインクルードするものがあるのか、どこかで宣言してあるのか?と思い、サンプルのソースを一通りみてもどこにもなくて、前回もあったようにプロパティで設定してあるのかとも思ったのですが、そこでもなかったです。

 さんざん探したあげく、結局、rcファイル内で「afxribbon.rc」をリンクしてなかったのが原因だと分かりました。
 ということは、このウインドウはリボン関係のクラスになるんですね。

 原因がわかったところで、早速rcファイルを書き替え実際に表示させてみると、やっときちんと表示されました。
 しかし、そのままソフトを終了させると、なんとメモリリークするのです。
 リーク内容を見てみると、「CMFCVisualManager」と出ているので、メインスレッドの「CWinApp」が「CWinAppEx」になってないからだと気付き、これを修正するとメモリリークはなくなりました。

 しかしさらに、このウインドウを表示したままソフト自体を終了させると、やっぱりメモリリークするのです。
 これはサンプルでも同じようにメモリリークするので、根本的にどこか間違っているみたいです。
 リーク内容を見てみると、「CMFCDesktopAlertWnd」と出ているので、表示させる時に「new」で作っているのがきちんと解放されていないのだろうと思い、それなりの処理をいれるとメモリリークはなくなりました。

 今回の新しいクラス全般にいえるのですが、サンプルを見ると、使用する時に「new」で領域を確保して、解放してないことが多く、「大丈夫なんだろうか?」と思っていたのですが、やはり、きちんと解放されないこともあるみたいです。
 内部では、終了時に自動的に解放するようにはなっているみたいですが完全じゃないみたいで、その辺はこちら側でうまく処理しないといけないみたいです。
 やはり、この辺も詰めが甘い感じがしますね。

 以上のように苦労しながらも、このダイアログを表示させることは出来たのですが、なんといってもファイルサイズが一気に大きくなるので、これだけなら自前で用意したほうが良さそうな気がしました。
 とにかく、今回の新クラスを使うようにするとファイルサイズが一気に大きくなるので、よほどのことがない限りあまり使う気にはならない、というのが現状だったりします。

 まぁ、それなりに大きなプロジェクトで、それなりの機能を持ったソフトなら気にならないのかもしれませんが、コンパクトさが売りのソフトにとっては無駄な物?だったりするかもしれませんねぇ。
ランキングへ  posted by 遠雷 at 00:48 | コメント(0) | MFC

2008年10月24日

問題解決!

 今日はまず、「ファイル名変更君」をバージョンアップさせました。ぴかぴか(新しい)
 今回の変更点は、ここでは散々書いてきましたが、色んなところのバグ修正が主です。
 今後、新タイプ制作でまだ修正点が出てくるかもしれないので、まだバージョンアップさせるかも?

 今回の更新は、ソフト全体でも一ヶ月以上ぶりの更新で、本当に久しぶりでした。
 今回のバージョンアップでとりあえず一段落ついたので、次はちょっと気分転換に、違うソフトの更新作業に入るか、新作ソフトの制作をしようかな?と思っていたりします。

 次に、昨日書いた、新タイプをWindows 2000上で実行しようとすると「gdiplus.dllがありません」と表示される件ですが、サンプルのソフトを実行するとこのメッセージが表示されないので、どこが違うのか見比べてみました。
 見比べ元のソフトは、新しく作ったプロジェクトで、ごくシンプルに必要最低限の機能だけにしたものを使いました。
 ちなみに、この見比べ元のソフトも同じようにエラーメッセージが表示されます。

 一通り見比べてみても、特に見比べ元のソフトにだけ使っているクラスもないし、ファイルへのリンクなども別にないのです。
 何が違うのか分からないまま、ずっと考えていると、プロジェクトのプロパティが違うのでは?と思い調べてみると、見事に当たりでした。

 どこが違ったかというと、リンカ→入力→DLLの遅延読み込みのところに「gdiplus.dll」が設定されていました。
 ということで、早速見比べ元のソフトにも同様の設定をしたところ、前述のエラーメッセージは表示されなくなりました。

 まぁ、結局どのクラスが使用しているかまでは突き止められなかったのですが、一通り実行してみても特に不具合がなかったので、それほどの影響はないんでしょう。
 というか、内部でdllの有無で処理を切り替えるようになっているのかも?

 以上のように、dll問題?は解決したので、とりあえず、これ以上ファイルサイズを大きくしなくてすみました。
ランキングへ  posted by 遠雷 at 00:52 | コメント(0) | MFC