変な発想法 - Mobile編

Android, iPhone, iPad の裏技、Tips 大好き!

CreateToolhelp32Snapshot が Windows Mobile 6.5 だと失敗する

SDKサンプルソースエミュレータで動きません orz

CreateToolhelp32Snapshot を試そうと、Windows Mobile 6 SDK のサンプル PViewCE と TrayTaskList をビルドしてみたところ・・・。
Windows Mobile 6.5 エミュレータで実行すると、エラーになりました。orz


TrayTaskList はプロセスの一覧が真っ白に。


PViewCE はエラーメッセージ。


デバッガで確認すると、
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); (TrayTaskList)
CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); (PViewCE)
の戻り値が INVALID_HANDLE_VALUE (-1) になってます。


ん、むむ??


同じビルドを Windows Mobile 6 エミュレータで実行すると・・・。


TrayTaskList は、問題ありません。


PViewCE は、6.5 と同じエラー。orz



ググってみると、MSDN のフォーラムにこんな記事が。

CreateToolhelp32Snapshot Windows Mobile 5
You're running out of memory as snapshoot includes all heaps by default. Please add "secret" TH32CS_SNAPNOHEAPS flag to fix that.

Note: TH32CS_SNAPNOHEAPS = 0x40000000

んー、Windows Mobile 6 SDK では、TH32CS_SNAPNOHEAPS はもともと定義済みですね。


TrayTaskList を CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS, 0); としたところ・・・、


見事動きました!


しかしながら。
PViewCE は TH32CS_SNAPNOHEAPS を付けても、WM6 でも WM6.5 でも現象は変わりません。
TH32CS_SNAPALL だけに、まだメモリが足りないのかなぁ?


んー、よく調べて見ると。

CreateToolhelp32Snapshot | Microsoft Docs

Value Description
TH32CS_SNAPNOHEAPS By default, the process heap information is included when creating PROCESS snapshot.For a more efficient way of receiving the basic information of the process, use this flag with H32CS_SNAPPROCESS.

最近はちゃんと公開されているみたいですね。TH32CS_SNAPNOHEAPS。
「TH32CS_SNAPNOHEAPS は TH32CS_SNAPPROESS と組み合わせて使うと効果的だよ。」とのことですが。
TH32CS_SNAPALL と組み合わせても効果ないのかしらん?



しっかし、WM6 SDKサンプルソースなのに、WM6 エミュレータで動かないってひどくないですか!?


・・・。
ん、むむ??


うげっ。


英語版のエミュレータだと TH32CS_SNAPALL のままで動くよ・・・。orz

                                                                  • -

Windows Mobileプログラミング徹底理解

Windows Mobileプログラミング徹底理解