2008-05-22

外部メモリの名称

自作ツールのWhereNowを修正中です。
 
WhereNowは住所データが 170MB近くあるので外部メモリが必須なのですが、実は外部メモリの名称というのは Ad[es]では "microSDカード"、エミュレータだと "Storage Card"といった具合にまちまちになっています。
v0.1では "microSDカード"に決め打ちしていたのですが、エミュレータでテストする度にコードを切り替えるのが面倒だったので名称の取得方法を調べてみました。
 
最初はレジストリのどこかに記録されているものと思っていたのですが それらしい箇所は見当たりません。
SDKのサンプルの中にもそれらしいサンプルは無いようです。
 
ところが何気なく開いた「Windows Mobileプログラミング徹底理解」でFindFirstFlashCard()FindNextFlashCard()を発見。
いつもながら貴重な情報が満載ですね。
というか一度読んだはずなのに完全に頭から消えていました。
10回読み直せ>自分。
 
という訳で、外部メモリの名称を取得するようにしたコードがコチラ。
これでエミュレータと実機で共通のコードが使えるようになりました。
#define DEFAULT_STORAGE_NAME            _T("microSDカード")
#define INDEX_FILE                      _T("\\%s\\wn\\index.dat")


HANDLE          hFlashCard              = NULL,
                hIndexFile              = NULL;
WIN32_FIND_DATA findData                = {0};
TCHAR           szStorageCard[MAX_PATH] = _T(""),
                szIndexFile[MAX_PATH]   = _T("");

// 外部メモリの名前を取得
ZeroMemory(szStorageCard, sizeof(szStorageCard));
hFlashCard = FindFirstFlashCard(&findData);
if (INVALID_HANDLE_VALUE != hFlashCard) {
    StringCchCopy(szStorageCard, MAX_PATH, findData.cFileName);
    FindClose(hFlashCard);
} else {
    StringCchCopy(szStorageCard, MAX_PATH, DEFAULT_STORAGE_NAME);
}
// インデックスファイルの名称
wsprintf(szIndexFile, INDEX_FILE, g_szStorageCard);
 
でも、このコードでは FindNextFlashCard()を呼ばずに最初に見つかった名前を使っています。
複数の外部メモリがあるとたちまち問題が起きちゃいますね...。
 

0 件のコメント: