掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
USBメモリのドライブ名を取得する方法 (ID:47667)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ということでtakeさん、Delphi版が出来ましたのでお試しください。 なお、タイプライブラリ WbemScripting_TLB は使用してません。(使うとかえって面倒なので。) 下記サンプルの出力例 USB Drives: F: G: USB Drives Supports Removable Media: G: IDE Drives: C: E: ☆InterfaceTypeとかCapabilitiesの定数はこちら Win32_DiskDrive class (Windows) http://msdn.microsoft.com/en-us/library/aa394132%28v=vs.85%29.aspx WQL (SQL for WMI) (Windows) http://msdn.microsoft.com/en-us/library/aa394606%28v=vs.85%29.aspx implementation {$R *.dfm} uses ComObj, ActiveX; // Win32_DiskDrive.InterfaceType 'SCSI', 'HDC', 'IDE', 'USB', '1394' function GetDriveNamesByType(DriveNames: TStrings; InterfaceType: String; OnlyRemovable: Boolean): Boolean; var WMI: OleVariant; Query: String; DiskDrives, DiskPartitions, LogicalDisks: OleVariant; DiskDrivesEnum, DiskPartitionsEnum, LogicalDisksEnum: IEnumVariant; DiskDrive, DiskPartition, LogicalDisk: OleVariant; iValue : LongWord; strDeviceID: String; I: Integer; begin Result:=False; WMI:=OleVariant(CreateOleObject('WbemScripting.SWbemLocator')).ConnectServer; Query:='SELECT * FROM Win32_DiskDrive WHERE InterfaceType='''+InterfaceType+''''; DiskDrives:=WMI.ExecQuery(Query); DiskDrivesEnum:=IUnknown(DiskDrives._NewEnum) as IEnumVariant; while DiskDrivesEnum.Next(1, DiskDrive, iValue)=0 do begin if OnlyRemovable then begin for I:=VarArrayLowBound(DiskDrive.Capabilities, 1) to VarArrayHighBound(DiskDrive.Capabilities, 1) do begin if DiskDrive.Capabilities[I]=7 then Break; // 7: Supports Removable Media end; if I=VarArrayHighBound(DiskDrive.Capabilities, 1)+1 then Continue; end; strDeviceID:=StringReplace(VarToStr(DiskDrive.DeviceID), '\', '\\', [rfReplaceAll]); Query:='ASSOCIATORS OF {Win32_DiskDrive.DeviceID="'+strDeviceID+ '"} WHERE AssocClass=Win32_DiskDriveToDiskPartition'; DiskPartitions:=WMI.ExecQuery(Query); DiskPartitionsEnum:=IUnknown(DiskPartitions._NewEnum) as IEnumVariant; while DiskPartitionsEnum.Next(1, DiskPartition, iValue)=0 do begin Query:='ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+ VarToStr(DiskPartition.DeviceID)+ '"} WHERE AssocClass=Win32_LogicalDiskToPartition'; LogicalDisks:=WMI.ExecQuery(Query); LogicalDisksEnum:=IUnknown(LogicalDisks._NewEnum) as IEnumVariant; while LogicalDisksEnum.Next(1, LogicalDisk, iValue)=0 do begin strDeviceID:=VarToStr(LogicalDisk.DeviceID); if strDeviceID<>'' then begin DriveNames.Add(strDeviceID); Result:=True; end; end; LogicalDisks:=Unassigned; end; DiskPartitions:=Unassigned; end; DiskDrives:=Unassigned; WMI:=Unassigned; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add('USB Drives:'); GetDriveNamesByType(Memo1.Lines, 'USB', False); Memo1.Lines.Add('USB Drives Supports Removable Media:'); GetDriveNamesByType(Memo1.Lines, 'usb', True); Memo1.Lines.Add('IDE Drives:'); GetDriveNamesByType(Memo1.Lines, 'IDE', False); end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.