Nanashi-softプログラマ専用Windows Mobile 6


◇Windows Mobile 6-フォルダ一覧取得-

Unixだと、opendirして、readdirしながら1つずつ調べていきます
CeGCCでもそれを使う事ができるのですが、こういう OSに近い場所はちゃんとした方法で記述しておいた方が後々トラブルを避ける事ができます

WindowsAPIでは、FindFirstFileして、FindNextFileしながら1つずつ調べていくそうです
ただ、1つ注意しなければならない点があり、FindFirstFileした際に既に一番最初のファイル名を取得しています
opendirを使った場合と同じロジックで書いてしまうと、一番最初のファイル名をスキップしてしまう事になります

・ディレクトリ一覧取得サンプル
			WIN32_FIND_DATA data;
HANDLE hFind;
hFind = FindFirstFile(L"*", &data); //このdataに最初のファイルが既に入っているので注意
if(hFind != INVALID_HANDLE_VALUE){
do{
if(wcscmp(data.cFileName, L".") != 0 && wcscmp(data.cFileName, L"..") != 0){
if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
MessageBoxW(0, data.cFileName, L"folder", MB_OK);
}
}
}while(FindNextFile(hFind, &data) == TRUE);
}else{
MessageBoxW(0, L"フォルダ取得エラー", L"ERROR!!", MB_OK);
}
この方法で取得したフォルダ名は、Unicodeで返ってきますので、日本語もOKです

ただ、大きな問題があります
なんと、Windows Mobileにはカレントフォルダと言う概念がありません
しかも、本来プログラムパスが取得できるはずの GetCommandLine()も空欄が返ってきます
普通のC言語からは実行ファイルのフォルダを取得する事ができない不具合があるのです

プログラムと同一の場所に環境ファイルを作るには、端末上の全てのファイルを調べて探さなければなりません
しかも、ファイル名を変えていたり、同一ファイル名があるとアウトです


メモカ上の特定のフォルダに置くルールを敷いても問題があります
端末毎にデバイス名が異なる可能性が高いです

エミュレータ上では、Storage Card
実機iPAQ上では、CF Card、SD Card、iPAQ File Storage
と既に異なっていますし、スロットも沢山あったりします

ここで開発が止まっていたのですが、カルナノードはシナリオフォルダのトップを /karunawmと決め打ちにする事にしました
そして、各デバイスを順に探して、/karunawm以下に置かれているシナリオを全て列挙する
シナリオ選択時に、デバイス名を含めたフルパスをコピーしておいて、セーブファイルをそこに作る
こうすれば、SDカードやコンパクトフラッシュに入れたシナリオを自由にプレイできます


Nanashi-softプログラマ専用Windows Mobile 6