VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: cruzer

超难问题! 如何 根据 盘符 判断 是不是 U盘 ?

[复制链接]

0

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-8-9 18:30:01 | 显示全部楼层
用WMI肯定可以(WMI可得到系统所有信息),以下为例程(当然你可以通过Win32_USBControllerDevice或其它项目来判):


unit wmi;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
ActiveX, WbemScripting_TLB;
function ADsEnumerateNext(pEnumVariant: IEnumVARIANT; cElements: ULONG;
  var pvar: OleVARIANT; var pcElementsFetched: ULONG): HRESULT; safecall; external 'activeds.dll';

procedure DumpWMI_Process(Process: SWBemObject);
var
  Enum: IEnumVARIANT;
  varArr: OleVariant;
  lNumElements: ULong;
  SProp: ISWbemProperty;
  Prop: OleVariant;
  PropName: string;
  PropType: string;
  PropValue: string;
begin
  Form1.Memo1.Lines.Add('+ WMI Path: ' + Process.Path_.Path);
  Enum := Process.Properties_._NewEnum as IEnumVariant;
  while (Succeeded(ADsEnumerateNext(Enum, 1, VarArr, lNumElements))) and
    (lNumElements > 0) do
  begin
    if Succeeded(IDispatch(varArr).QueryInterface(SWBemProperty, SProp)) and
      Assigned(SProp) then
    begin
      try
        PropName  := SProp.Name;
        Prop := SProp.Get_Value;
        PropType := inttostr((VarType(Prop)));
        PropValue := VarToStr(Prop);
        Form1.Memo1.Lines.Add('  + ' + PropName + '[' + PropType + '] = ' + PropValue);
      except
        on E: Exception do
        begin
          // WriteLn(ErrOutput, PropName, ': ', E.Message);
        end;
      end;
    end;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  Server: string;
  Enum: IEnumVARIANT;
  varArr: OleVariant;
  lNumElements: ULong;
  AName: array[0..255] of Char;
  ASize: DWORD;
begin
  if (ParamCount = 0) then
  begin
    Server := '';
    ASize  := SizeOf(AName) - 1;
    if GetComputerName(@AName, ASize) then Server := AName;
  end
  else
  begin
    Server := ParamStr(1);
  end;
  try
    Memo1.Lines.BeginUpdate;
    Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '',
      '', '', '', 0, nil).ExecQuery('Select  InterfaceType from Win32_DiskDrive', 'WQL',
      wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;
    while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and
      (lNumElements > 0) do
    begin
      DumpWMI_Process(IUnknown(varArr) as SWBemObject);
    end;
  finally
    Memo1.Lines.EndUpdate;
  end;
end;
////其中,WbemScripting_TLB.pas可从   
  ///http://www.truth4all.org/WbemScripting_TLB.pas   
  ///下载   
   
end.
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-8-16 14:30:01 | 显示全部楼层
ufoprc  你的方法不行啊 !!!
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-8-16 15:00:01 | 显示全部楼层

ufoprc  你的方法 只是返回 ,下面的信息, 不能判断 那个盘是 USB 接口的磁盘!!!


+ WMI Path: \\LITONE-MSJF7C5U\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE1"
  + DeviceID[8] = \\.\PHYSICALDRIVE1
  + InterfaceType[8] = IDE
+ WMI Path: \\LITONE-MSJF7C5U\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
  + DeviceID[8] = \\.\PHYSICALDRIVE0
  + InterfaceType[8] = IDE
+ WMI Path: \\LITONE-MSJF7C5U\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE2"
  + DeviceID[8] = \\.\PHYSICALDRIVE2
  + InterfaceType[8] = USB
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-8-16 15:15:01 | 显示全部楼层
InterfaceType[8] = USB

回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-8-16 15:45:01 | 显示全部楼层
肯定是行的,不是会把可移动磁盘与硬 盘分开吗?
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-8-16 19:45:01 | 显示全部楼层
但靠 InterfaceType[8] = USB  , 不能 判断 哪里个 盘符是 USB磁盘 !!!!
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-8-16 20:00:01 | 显示全部楼层
呵呵....那么你知道下面的信息是如何给出的吗

+ WMI Path: \\LITONE-MSJF7C5U\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE1"
  + DeviceID[8] = \\.\PHYSICALDRIVE1
  + InterfaceType[8] = IDE
+ WMI Path: \\LITONE-MSJF7C5U\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
  + DeviceID[8] = \\.\PHYSICALDRIVE0
  + InterfaceType[8] = IDE
+ WMI Path: \\LITONE-MSJF7C5U\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE2"
  + DeviceID[8] = \\.\PHYSICALDRIVE2
  + InterfaceType[8] = USB

呵,有意思。谁让你靠上面的字串来判断呢?
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-18 02:15:02 | 显示全部楼层
应该可以的,研究一下注册表看看
回复

使用道具 举报

0

主题

12

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-8-18 02:30:01 | 显示全部楼层
如果要求不高,把动态添加的固定盘也当作U盘吧。
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-18 17:45:01 | 显示全部楼层
如果是移动硬盘接USB,只怕是不行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表