USB Selectを使って Mass Storageモードに切り替えた場合、PCがカードを認識するまでに時間がかかる件。これは、USB Selectの問題ではなく、標準のMass Storageドライバの問題です。従って、基本的に独自のドライバを持つ以外に、解決方法がないと思われます。
一体、ナニにそんなに時間がかかるのか? 可能性としては、miniSDをシステムからアンマウントして、さらにドライバ側でマウントしなおす部分が時間を食っているというものが考えられます。ならば、とりあえず、事前にカードをアンマウントしてみてはどうだろう……。と、思い、試みてみました。
まぁ、タイトルからも判るように、結論から言えば失敗に終わりました。カードがアンマウントされていようがいまいが、認識にかかる時間はおよそ60秒。全然変わりませんでした。あとは、Mass Storageモードになったら、ドライバがminiSDを掴みっぱなしにするとか、そういう工夫が必要な気がします。多分、Card ExportIIのドライバはそんなことをしているんでしょう。(未確認)
悔しいので、アンマウントの方法について書いておきます。アンマウントの方法はMSDNにドキュメントがあります。やることは、storeapi.libに入っている、OpenStore()とDismountStore()を呼ぶだけです。
HANDLE hstore = OpenStore(L"DSK1:"); // DSK1: はminiSD
if (hstore != INVALIDE_HANDLE_VALUE)
{
DismountStore(hstore);
}
以上、終了……と、いいたいところですが、このコードは、Windows Mobile SDKではビルドできません。必要なヘッダ(storemgr.h)はあるものの、肝心のライブラリ(storeapi.lib)が含まれていないからです。……ソンナンバッカリダ oTL
if (hstore != INVALIDE_HANDLE_VALUE)
{
DismountStore(hstore);
}
それで、終わってしまったら、実験になりませんから、手を尽くして調べた結果、次のコードと等価であることが判りました。
HANDLE hstore = CreateFile(L"\\StoreMgr\\DSK1:", 0, 0, NULL, 0, 0, NULL);
if (hstore != INVALID_HANDLE_VALUE)
{
(*(BOOL (*) (HANDLE hStore))(0xF000E3F8))(hstore);
}
おいおい、直接アドレス指定で飛んでいるよ。こんなコード久しぶりに見た oTLif (hstore != INVALID_HANDLE_VALUE)
{
(*(BOOL (*) (HANDLE hStore))(0xF000E3F8))(hstore);
}
で、これを走らせれば、あっという間に、miniSDカードが見えなくなります。目出度し!?
いや、それはともかく、この状態からMass Storageに切り替えても認識速度に差はなかったのだから、徒労に終わったと言うべきですな oTL
kumaneko
この先何かに役立つかもですよ
非常に便利なユーティリティーですので応援してます
つかSHARPもこれくらい最初からやっておけと言う話なんですが,無いモノは'ユーザー'が勝手に作ると言う忌まわしき伝統が・・・
hiro
ありがとうございます。なんの役に立つかわかりませんが、とりあえず覚えておこうと思いました(^^;;