USB認識完了を取得するには?

解決


Jun039  2009-05-30 00:43:05  No: 141990

はじめまして。
早速ですが質問があります。

USB接続のONDEVICECHANGEを取得し、検査をするソフトを作成しているのですが、新しいUSBストレージデバイスを接続すると、3回ONDEVICECHANGEメッセージが発行されてしまいます。(DBT_DEVICEARRIVAL)
正常に完了したときのみ取得する方法はありますか?
3回目とそれ以外の差分があればよいのですが、、、、、

申し訳ありませんが、御教授よろしくお願いします。


オショウ  2009-05-30 01:07:13  No: 141991

どういうデバイスなのか解らないので、必ず3回来るなら
3回来るまで待つしかないのでは?

あと、setup系APIで、検知したデバイスがどういうもので
そういう状態かステータスを取得して判断するとか・・・

ただ、1回目〜3回目までが短時間なら、Setup系API呼ん
でいる時間の方が長かったりしますが・・・

※  所定時間内に3回来なかった場合は、他デバイスとし
    て判断するとか・・・

●  う〜ん、やっぱり1回目受信したらSetup系APIでデバ
    イスの状態確認した方が誤認しなくてよさそう・・・

参考まで。


jun039  2009-05-30 02:02:37  No: 141992

初めて接続するものは3回
2回目以降は1回
のみ返ってきます。

ちなみに接続するデバイスは「USB大容量記憶装置」です。
  デバイスが見つかった
  ディスクデバイス認識
  認識完了
位のタイミングで3回返ってきてるといった感じです。


オショウ  2009-05-30 04:38:20  No: 141993

http://www.usefullcode.net/2007/02/usb.html

C言語ですが、参考に・・・

以上。


jun039  2009-05-30 06:44:23  No: 141994

回答ありがとうございます。

>>http://www.usefullcode.net/2007/02/usb.html

確認させていただきましたが、初めて接続をした時点で「DBT_DEVICEARRIVAL」が発行されてしまい、「使用準備ができました」が表示するときにも、再度「DBT_DEVICEARRIVAL」は発行されます。そのため、同じ処理が3回も実行されてしまう状態になっています。

ちなみに、WM_ メッセージを見たのですが、特に差別化できるメッセージが発行されてるように見えなかった、、、、

手はないのでしょうか?


オショウ  2009-05-30 10:26:01  No: 141995

結果的にそのお使いのデバイスが、仕様通りにメッセージを
投げていない・・・と言うことでしょう。

では、1回目のDBT_DEVICEARRIVALを受けた際に何等かの処理
を行おうとして、まだデバイス自体は準備完了となっていない
為、問題?となっているのでしょうか?

どの道、DBT_DEVICEARRIVALを受けてしまっているので、後は
その処理が成功するまで繰り返すしかないのでは?

にわとりが先か、卵が先か・・・
DBT_DEVICEARRIVALを受けているなら、もう順番としては決ま
ってしまっているので、そのデバイスのみに特化した処理を
組むのか、汎用にするのか・・・

どういう仕様の処理を行いたいのでしょうか?

以上。


jun039  2009-05-30 11:37:56  No: 141996

オショウ様
協力ありがとうございます。

やりたいことは、USB大容量記憶装置(USBメモリー)の多台数接続確認を行いたいと思っており、それぞれがUSBのシリアルナンバー(固有ID)が異なるため、Windowsが「新しいデバイス」として認識しています。

思いつくのは、同じUSBメモリーを連続して接続しないとすれば、ひとつ前のシリアルナンバーを保持しておいて、同じ番号の場合は処理をJumpするといった手もありそうですが、あまりスマートではないので、、、、、

タスクバーに「使用準備ができました」と表示が出るので、何かしら完了した状態を取得する方法はありそうなのだが、、、それがわからない状態ですね。


オショウ  2009-05-30 17:25:35  No: 141997

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調べてみて下さい。

参考まで・・・


jun039  2009-06-02 04:04:47  No: 141998

いろいろとありがとうございました。
APIを組み合わせてやってみたいと思います。

勉強になります!

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加