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

解决方案 »

  1.   

    strComputer = "."
    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#的代码,那么高手翻译一下。
      

  2.   

    看不懂C#代码,不过我觉得可不可以用VBS之类的脚本进行这方面的功能实现,Delphi只需要CreateOleObject然后调用VBS获得返回值就行了……
      

  3.   

    原来弄过这个...首先一定确信,wmi 可以查到windows所有的设备资源信息.PNPDeviceID 这个集合应该包括这个路径,我没检测,你可以在msdn 上可以查wmi的所有方法..
      

  4.   

    GetLogicalDriveStrings 可以取得所有盘符。。
      

  5.   


    这个只是得到所有盘符,但是我要读取指定盘符的VID PID,怎么弄呢
      

  6.   

    刚写了一段,但是好像不能运行在Windows 7下!我也在解决这个问题,希望高手能帮忙!USES ExtCtrls, ActiveX, ComObj;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');//这里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;
      

  7.   

    重新修改了一下,可能对你有帮助,各系统Tmp.Name是不一样的
    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.