あるドライブに接続されている物が、
USBメモリか否かを識別したいと考えております。
検索した所、
http://delphiholic.hopeseeds.com/?eid=327045 にて、
USBデバイスの情報を取得する方法が紹介されていました。
しかし、USBメモリかどうかを識別する方法は見つかりません。
どういった方法がありますでしょうか?
回答じゃなくて申し訳ない。
興味本位で紹介URLを見たところ
http://scp.assarbad.net/dsource/index.htm に、USB Device Lister という、
USBデバイスの一覧を表示するソフト(ソースコード付き)のリンクが
あって、ダウンロードしてみた。
それをさわってみたところ、
http://www.linux-usb.org/usb.ids
このページ(リスト)をUSBのベンダー・デバイス名を判断するデータとして
取得しているようです(たぶん)
USBのフラッシュメモリかHDDかは、このリストと照らし合わせて見るしかないのかな?
USBデバイスの取り外し機能は作ったことあるけど、USBでリムーバブル
という2点しか見ていないので、ほかの属性でわかる方法があるかは知りません。
ちなみに、USBメモリは、デバイス名に「FLASH」の文字が入っているものとないものがあるので、単純に「FLASH」の有無で判断はできないはずです。
GetDriveTypeでその辺の情報は得られないのかな? と思って調べてみたら
→USBかどうか知りたかったらSetupDiGetDeviceRegistryPropertyを使うといいよ
→いや、IOCTL_STORAGE_QUERY_PROPERTYでBusTypeを見る方が確実だ
と出ました。
前者は「安全に取り外す」操作が必要か問い合わせるもので、
後者はUSBバスに接続されているか調べる方法のようですね。
いずれもWindows DDKがいるようですが、まあ参考までに。
http://msdn.microsoft.com/en-us/library/aa364939(VS.85).aspx
こんにちは。
WMI にて以下のクラスを参照すればなんとかなるかもしれません。
・Win32_LogicalDiskToPartition
・Win32_DiskDriveToDiskPartition
・Win32_DiskDrive
・Win32_LogicalDisk
WMI の操作方法に関しては、Mr.XRAY さんの以下の記事が詳しいです。
[900_WMI_HardWare (Mr.XRAY)]
http://mrxray.on.coocan.jp/Delphi/plSamples/900_WMI_HardWare.htm
時間経ってるからもう解決ずみかな?
ちょっとインチキっぽいけど、ドライブ文字から調べるならこんなのはどうでしょう。
function IsUsbDrive(ADrv: Char): Boolean;
const
S = ['A'..'Z'];
MAX_DEVS = $FFFF;
MAX_DEV = $0400;
var
strDrv: String;
strDevNam : String;
desDevName :array[0..MAX_DEV -1] of Char;
dosDevices :array[0..MAX_DEVS -1] of Char;
iIdx, iDosCnt, iPosCnt :Integer;
pHedPos :PChar;
begin
Result := false;
// A〜Z以外は処理終了
if not CharInSet(ADrv,S) then Exit;
strDrv := ADrv + ':';
if QueryDosDevice(PChar(strDrv), @desDevName, MAX_DEV) <= 0 then Exit;
strDevNam := desDevName;
iDosCnt := QueryDosDevice(nil, @dosDevices, MAX_DEVS);
if iDosCnt > 0 then begin
iPosCnt := 0;
while (iPosCnt < iDosCnt) do begin
pHedPos := @dosDevices[iPosCnt];
if ('STORAGE' = copy(pHedPos,1,7)) and (Pos('USBSTOR', pHedPos) > 0) then
begin
if QueryDosDevice(pHedPos, @desDevName, MAX_DEV) > 0 then begin
if (desDevName = strDevNam ) then begin
Result := true;
Exit;
end;
end;
end;
iIdx := 0;
while (iPosCnt < iDosCnt) and (pHedPos[iIdx] <> #0) do begin
Inc(iIdx);
Inc(iPosCnt);
end;
Inc(iPosCnt);
end;
end;
end;
ツイート | ![]() |