Windows CEでのpng画像ロードと、ヒープ破壊調査

コメントで紹介していただいた、SHLoadImageFile、MSDN見たら


Pocket PC: Windows Mobile 2003 and later.
OS Versions: Windows CE .NET 4.0 and later.
Header: Declared in Aygshell.h.
Library: Use Aygshell.lib.
Windows CE .NET 4.0 and laterか、じゃあWindows CE 5.0でもいけるよねー、と思って試してみたら、だめだったorz
PocketPC系(Windows Mobile系)専用のAPIのようだ…
aygshell.hはあるものの、SHLoadImageFileは影も形もあらず…


やはり非WMなWindows CEではlibpng使うしかなさそう。


ところで、ヒープ破壊の件調査を続けているものの、未だ特定できず。
そうこうしている間に、カタログチェック(全ページ走査)が終わってしまった。
33%縮小で表示できなかったのは898ページ、1123ページだけだった。早々に8bpp、1/3縮小のロジックを補完せねば…


どうでもいい機能として、1秒以上無操作だった時に未書き込みのお気に入りデータを書きに行く機能を追加。ページ切替時にまとめて書き込むよりも、若干軽くなったはず。自分で操作してみてわかったが、カタログチェックしてる最中は、画面内のカットを順番に見ていくので、無操作になる可能性が高い。その間に書き込めるものは書き込んでしまえというアイデア


ヒープ破壊のほうは、ソース上からmalloc、GetProcessHeap()を一掃してプロセスヒープの利用を全くしないようにしてみたが、相変わらずSQLite内で落ちる。そろそろ疑い始めてもいいんだろうか。呼び出し方が悪いという可能性もあるが。
SQLiteはソースを解析したところ、ビルド時にSQLITE_MEMDEBUGをマクロ定義しておくとヒープのデバッグができるようになっている、らしい。


/*
** If SQLITE_MEMDEBUG is defined, then use versions of malloc() and
** free() that track memory usage and check for buffer overruns.
*/


ちなみにマクロ定義によって何段階かレベルがあるらしい。

SQLITE_MEMDEBUG
SQLITE_MEMDEBUG=1
ヒープ確保(sqlite3Malloc/sqlite3Realloc)時にヒープの前後に破壊チェック用バッファを設ける。
sqlite3Free/sqlite3Realloc時にバッファが壊れているとエラーメッセージを出力する(ヒープ破壊チェック)
SQLITE_MEMDEBUG=2
デバッグメッセージが出力される(sqlite3Malloc/sqlite3Free/sqlite3Realloc/sqlite3SetString時に毎回サイズやアドレス、ソース位置など)
SQLITE_MEMDEBUG=3
スタックトレースが出力される(sqlite3Malloc/sqlite3Realloc時)
メッセージはすべてstderrに出力される。Windows CEのようにデフォルトでコンソールが無い場合はデバッグ文字列やファイルなどに出すようちょっと書き換えてやる必要がある。
この辺のメモリ関連の処理はutil.cに入ってるのでこのファイル内で修正してやればよい。