Function RewiseUSBISOK(Const CheckString:String='要查找的vid/pid'):Boolean; //\usb\vid_XXXX\pid_XXXX\XXXXXX
var
Locator: OleVariant;
WMI: OleVariant;
RET: OleVariant;
Enum: IEnumVariant;
Tmp: OleVariant;
Value: Cardinal;
begin
Result:=False;
Locator:=CreateOleObject('WbemScripting.SWbemLocator');
WMI:=Locator.ConnectServer('.','','','');
Ret := WMI.ExecQuery('SELECT * FROM Win32_USBHub');//这里Win32_USBHub为检测项
Enum:= IUnknown(RET._NewEnum) as IEnumVariant;
while (Enum.Next(1,Tmp, Value) = S_OK) do
begin
ShowMessage(Tmp.PNPDeviceID);
if Pos(CheckString,LowerCase(Tmp.PNPDeviceID))>0 then
begin
Result:=True;
break;
end;
ShowMessage(Tmp.PNPDeviceID);//Tmp为检测到返回的数据集合,其中PNPDeviceID为集合中的对象,包含了PID和VID码
end;
end;以上可以查找指定vid/pid的U盘设备,但不知道如何找出该设备的路径,或者知道路径比如为H:盘,如何判断H:盘U盘设备的vid/pid
var
Locator: OleVariant;
WMI: OleVariant;
RET: OleVariant;
Enum: IEnumVariant;
Tmp: OleVariant;
Value: Cardinal;
begin
Result:=False;
Locator:=CreateOleObject('WbemScripting.SWbemLocator');
WMI:=Locator.ConnectServer('.','','','');
Ret := WMI.ExecQuery('SELECT * FROM Win32_USBHub');//这里Win32_USBHub为检测项
Enum:= IUnknown(RET._NewEnum) as IEnumVariant;
while (Enum.Next(1,Tmp, Value) = S_OK) do
begin
ShowMessage(Tmp.PNPDeviceID);
if Pos(CheckString,LowerCase(Tmp.PNPDeviceID))>0 then
begin
Result:=True;
break;
end;
ShowMessage(Tmp.PNPDeviceID);//Tmp为检测到返回的数据集合,其中PNPDeviceID为集合中的对象,包含了PID和VID码
end;
end;以上可以查找指定vid/pid的U盘设备,但不知道如何找出该设备的路径,或者知道路径比如为H:盘,如何判断H:盘U盘设备的vid/pid
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDiskPartitions = objWMIService.ExecQuery _
("Select * from Win32_DiskPartition")
For each objPartition in colDiskPartitions
Wscript.Echo "Block Size: " & vbTab & objPartition.BlockSize
Wscript.Echo "Bootable: " & vbTab & objPartition.Bootable
Wscript.Echo "Boot Partition: " & vbTab & objPartition.BootPartition
Wscript.Echo "Description: " & vbTab & objPartition.Description
Wscript.Echo "Device ID: " & vbTab & objPartition.DeviceID
Wscript.Echo "Disk Index: " & vbTab & objPartition.DiskIndex
Wscript.Echo "Index: " & vbTab & objPartition.Index
Wscript.Echo "Name: " & vbTab & objPartition.Name
Wscript.Echo "Number Of Blocks: " & vbTab & _
objPartition.NumberOfBlocks
Wscript.Echo "Primary Partition: " & vbTab & _
objPartition.PrimaryPartition
Wscript.Echo "Size: " & vbTab & objPartition.Size
Wscript.Echo "Starting Offset: " & vbTab & _
objPartition.StartingOffset
Wscript.Echo "Type: " & vbTab & objPartition.Type
Next
以上是C#的代码,那么高手翻译一下。
这个只是得到所有盘符,但是我要读取指定盘符的VID PID,怎么弄呢
var
Locator: OleVariant;
WMI: OleVariant;
RET: OleVariant;
Enum: IEnumVariant;
Tmp: OleVariant;
Value: Cardinal;
i:integer;
begin;
Locator := CreateOleObject('WbemScripting.SWbemLocator');
WMI := Locator.ConnectServer('.', '', '', '');
Ret := WMI.ExecQuery('SELECT * FROM Win32_USBHub');//这里Win32_USBHub为检测项,详见下表
Enum:= IUnknown(RET._NewEnum) as IEnumVariant;
i:=1;
while (Enum.Next(1, Tmp, Value) = S_OK) do
begin
if Tmp.Name='USB Mass Storage Device' then
begin
ShowMessage('这个u盘的硬件特征码是'+Tmp.PNPDeviceID);//Tmp为检测到返回的数据集合,其中PNPDeviceID为集合中的对象,包含了PID和VID码
Edit1.Text:=Edit1.Text+Tmp.PNPDeviceID+' ';
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Locator: OleVariant;
WMI: OleVariant;
RET: OleVariant;
Enum: IEnumVariant;
Tmp: OleVariant;
Value: Cardinal;
i:integer;
begin;
Locator := CreateOleObject('WbemScripting.SWbemLocator');
WMI := Locator.ConnectServer('.', '', '', '');
Ret := WMI.ExecQuery('SELECT * FROM Win32_USBHub'); Enum:= IUnknown(RET._NewEnum) as IEnumVariant;
i:=1;
while (Enum.Next(1, Tmp, Value) = S_OK) do
begin
Memo1.Lines.Add(Tmp.Name+' : '+Tmp.PNPDeviceID);
end;
end;end.