はじめまして。
早速ですが質問があります。
USB接続のONDEVICECHANGEを取得し、検査をするソフトを作成しているのですが、新しいUSBストレージデバイスを接続すると、3回ONDEVICECHANGEメッセージが発行されてしまいます。(DBT_DEVICEARRIVAL)
正常に完了したときのみ取得する方法はありますか?
3回目とそれ以外の差分があればよいのですが、、、、、
申し訳ありませんが、御教授よろしくお願いします。
どういうデバイスなのか解らないので、必ず3回来るなら
3回来るまで待つしかないのでは?
あと、setup系APIで、検知したデバイスがどういうもので
そういう状態かステータスを取得して判断するとか・・・
ただ、1回目〜3回目までが短時間なら、Setup系API呼ん
でいる時間の方が長かったりしますが・・・
※ 所定時間内に3回来なかった場合は、他デバイスとし
て判断するとか・・・
● う〜ん、やっぱり1回目受信したらSetup系APIでデバ
イスの状態確認した方が誤認しなくてよさそう・・・
参考まで。
初めて接続するものは3回
2回目以降は1回
のみ返ってきます。
ちなみに接続するデバイスは「USB大容量記憶装置」です。
デバイスが見つかった
ディスクデバイス認識
認識完了
位のタイミングで3回返ってきてるといった感じです。
http://www.usefullcode.net/2007/02/usb.html
C言語ですが、参考に・・・
以上。
回答ありがとうございます。
>>http://www.usefullcode.net/2007/02/usb.html
確認させていただきましたが、初めて接続をした時点で「DBT_DEVICEARRIVAL」が発行されてしまい、「使用準備ができました」が表示するときにも、再度「DBT_DEVICEARRIVAL」は発行されます。そのため、同じ処理が3回も実行されてしまう状態になっています。
ちなみに、WM_ メッセージを見たのですが、特に差別化できるメッセージが発行されてるように見えなかった、、、、
手はないのでしょうか?
結果的にそのお使いのデバイスが、仕様通りにメッセージを
投げていない・・・と言うことでしょう。
では、1回目のDBT_DEVICEARRIVALを受けた際に何等かの処理
を行おうとして、まだデバイス自体は準備完了となっていない
為、問題?となっているのでしょうか?
どの道、DBT_DEVICEARRIVALを受けてしまっているので、後は
その処理が成功するまで繰り返すしかないのでは?
にわとりが先か、卵が先か・・・
DBT_DEVICEARRIVALを受けているなら、もう順番としては決ま
ってしまっているので、そのデバイスのみに特化した処理を
組むのか、汎用にするのか・・・
どういう仕様の処理を行いたいのでしょうか?
以上。
オショウ様
協力ありがとうございます。
やりたいことは、USB大容量記憶装置(USBメモリー)の多台数接続確認を行いたいと思っており、それぞれがUSBのシリアルナンバー(固有ID)が異なるため、Windowsが「新しいデバイス」として認識しています。
思いつくのは、同じUSBメモリーを連続して接続しないとすれば、ひとつ前のシリアルナンバーを保持しておいて、同じ番号の場合は処理をJumpするといった手もありそうですが、あまりスマートではないので、、、、、
タスクバーに「使用準備ができました」と表示が出るので、何かしら完了した状態を取得する方法はありそうなのだが、、、それがわからない状態ですね。
DBT_DEVICEARRIVALを受信した折、そのUSBメモリが、どのドライブレター
にマウントされたかは取得できていますよネ?
で、そのドライブが準備できたか簡単に検査したいなら・・・
CreateFileで開けば本当に準備完了すればエラーしません。開けます。
逆に準備完了していなければGetLastErrorしてエラーコード見れば解りま
すので、エラーが無くなるまである一定時間ループして待つとか。
認識中に抜いたら・・・DBT_DEVICEREMOVECOMPLETEが受信されるので、同
じドライブレターならCreateFileの待ちループを抜けるとか・・・
あと、DBT_DEVICEARRIVALを受信した折に、RegisterDeviceNotification
使ってデバイスの状態監視を登録すれば、抜いた折、イベント発生して、
そのタイミングが取れるので・・・
結局、何がしたいのか解らないのですが、どうにでもできるように思いま
すが・・・デバイスの出現と消滅の監視を行いたいだけなら、特に問題は
ないかと。
ただ、DBT_DEVICEARRIVALを受信した直後には、まだ本当にそのデバイスが
正常に動作していない場合がある・・・と言うことをどうやって知るか?
と言うことのみかと。
因みにプログラムからそのUSBメモリのデバイスの取り外しも制御できます
し、アンインストールもできます。またアンインストールした場合は、そ
のUSBメモリを抜かないままデバイスのリスキャンで再認識も可能です。
デバイスの取り外しを実行した後は、物理的に抜かないと再認識はできま
せん・・・これだけ厄介・・・
RegisterDeviceNotification/UnregisterDeviceNotification
CreateFile/CloseHandle/DeviceIoControl
SetupDiGetClassDevs/SetupDiEnumDeviceInterfaces
SetupDiGetDeviceInterfaceDetail/SetupDiDestroyDeviceInfoList
CM_Request_Device_Eject/CM_Locate_DevNode_Ex
CM_Reenumerate_DevNode_Ex/CM_Disconnect_Machine
これらのAPIの組み合わせで、できてしまいます。
勉強だと思ってAPI調べてみて下さい。
参考まで・・・
いろいろとありがとうございました。
APIを組み合わせてやってみたいと思います。
勉強になります!
ありがとうございました。
ツイート | ![]() |