USBメモリかどうかを識別するには?


ティブ  2009-12-11 19:53:28  No: 36411

あるドライブに接続されている物が、
USBメモリか否かを識別したいと考えております。

検索した所、
http://delphiholic.hopeseeds.com/?eid=327045  にて、
USBデバイスの情報を取得する方法が紹介されていました。
しかし、USBメモリかどうかを識別する方法は見つかりません。

どういった方法がありますでしょうか?


ぽむぽむ  2009-12-11 22:30:56  No: 36412

回答じゃなくて申し訳ない。

興味本位で紹介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」の有無で判断はできないはずです。


ttt  2009-12-12 00:23:17  No: 36413

GetDriveTypeでその辺の情報は得られないのかな? と思って調べてみたら
→USBかどうか知りたかったらSetupDiGetDeviceRegistryPropertyを使うといいよ
→いや、IOCTL_STORAGE_QUERY_PROPERTYでBusTypeを見る方が確実だ
と出ました。

前者は「安全に取り外す」操作が必要か問い合わせるもので、
後者はUSBバスに接続されているか調べる方法のようですね。

いずれもWindows DDKがいるようですが、まあ参考までに。
http://msdn.microsoft.com/en-us/library/aa364939(VS.85).aspx


DEKO  2009-12-12 13:19:49  No: 36414

こんにちは。

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


HalPapa  2009-12-29 01:13:19  No: 36415

時間経ってるからもう解決ずみかな?
ちょっとインチキっぽいけど、ドライブ文字から調べるならこんなのはどうでしょう。

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;


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








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