CreateDIBitmapのエラー判断方法

[戻る]
なな 2010/10/27(水) 17:24:23
【環境】VC++2005 MFC WindowsXP(SP2)

CreateDIBitmapでNULLが返ってくる場合、関数に何かしらの理由で
失敗しているからだと思っております。

ただ、直後にGetLasterrorをしても0が返ってきてしまいます。

関数の中に入る事も出来なく(ソースが無いからだと思っておりますが)、
困っております。

上記以外に何が原因なのか調べる方法をご存知の方はおられませんでしょうか?

どうぞよろしくお願いいたしますm(__)m

PATIO 2010/10/28(木) 09:50:17
GDIリソースが足りないという話ならシステムモニター等で確認しながら
動かしてみるとかそんな話になると思います。
書かれている内容だけでは状況が良く分からないので
これ以上はなんとも。

なな 2010/10/28(木) 11:23:51
[[解決]]
PATIOさん

ありがとうございます。
昨日はずっと悩んでいたんですが、つい先ほど解決いたしました。
>GDIリソースが足りないという話ならシステムモニター等で確認しながら
>動かしてみるとかそんな話になると思います。
まさにその通りでした。
別の箇所で「CreateCompatibleBitmap」で作成したビットマップを
DeleteObjectしていなかったからでした。

メモリリークしている箇所を探すために
「_CrtDumpMemoryLeaks()」を使ってみたりもしたんですが、
上記のような場合には検出してくれませんでした。

また、「CMemoryState」を使って、怪しい箇所の前後でメモリの
スナップショットを取得して比較させてみても、なかなか見つけられず・・・。

効率が悪いかもしれませんが、結局以下のような方法で解決いたしましたので
記載させていただきます。

フリーソフトの「メモリの掃除屋さん」でメモリを監視しながら
メモリをつかんでいる箇所を特定し、その解放がどこかでされているか
という方法で調べました。

解決いたしましたので、解決チェック入れさせていただきますm(__)m

PATIO 2010/10/28(木) 14:32:20
ちなみにですが、
GDIリソースと言っているのはハンドルなのでメモリリークではありません。
ハンドルを開放し忘れている場合、利用可能なハンドルが枯渇してしまい
あらたにハンドルの割り当てが出来なくなる事で失敗すると言う話です。
実際には画素情報を保持する為のメモリ等も残っているのだと思いますが、
扱っている画像が小さい時はメモリの方はそこまで激しく減らないと思います。
ハンドルの方は画像の大きさに関わりなく、一つのオブジェクトにつき
一つ消費されていくので画像が小さくても数が多ければ、枯渇します。

古いスレッドには追加発言できません。