disksize:=0; for i:=99 to 122 do // 'c'-'z'; begin drive:=pchar(chr(i)+':\'); x:=GetDriveType(drive); if x=3 then //3:代表介质是硬盘. begin GetDiskFreeSpaceEx(drive,userFreeBytes,totalBytes,@freeBytes); k:=1000000000; disksize:=totalBytes div k; ListItem:=ListView1.Items.Add; ListItem.Caption:=UpperCase(chr(i))+' 驱动器'; ListItem.SubItems.Add(Formatfloat('###,##0',disksize)+'G'); end; if x=2 then //removable begin GetDiskFreeSpaceEx(drive,userFreeBytes,totalBytes,@freeBytes); disksize:=totalBytes div 1048576; ListItem:=ListView1.Items.add; ListItem.Caption:=UpperCase(chr(i))+' 可移动磁盘'; ListItem.SubItems.Add(inttostr(disksize)+'M'); end; end;
以前看过一个类似设备管理器的程序源代码,一时找不到在那里了。那个程序应当可以解决的。
http://cache.web745.com/5308/26965.html
不能用 GetDriveType 判断 , 因为 GetDriveType 对某些U盘 判断为 固定的磁盘
另外因为 GetDriveType 对某些U盘 判断为 固定的磁盘,你要换个角度看问题,不是这个函数不行,是别人的U盘不兼容,让他去死吧,换U盘!!!
至于区分USB闪存盘和USB移动硬盘,就无能为力~具体代码,需要有偿提供~~
unit wmi;interfaceuses
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.
keiy() 你的方法 只是返回 ,下面的信息, 不能判断 那个盘是 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
+ 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呵,有意思。谁让你靠上面的字串来判断呢?
for i:=99 to 122 do // 'c'-'z';
begin
drive:=pchar(chr(i)+':\');
x:=GetDriveType(drive);
if x=3 then //3:代表介质是硬盘.
begin
GetDiskFreeSpaceEx(drive,userFreeBytes,totalBytes,@freeBytes);
k:=1000000000;
disksize:=totalBytes div k;
ListItem:=ListView1.Items.Add;
ListItem.Caption:=UpperCase(chr(i))+' 驱动器';
ListItem.SubItems.Add(Formatfloat('###,##0',disksize)+'G');
end;
if x=2 then //removable
begin
GetDiskFreeSpaceEx(drive,userFreeBytes,totalBytes,@freeBytes);
disksize:=totalBytes div 1048576; ListItem:=ListView1.Items.add;
ListItem.Caption:=UpperCase(chr(i))+' 可移动磁盘';
ListItem.SubItems.Add(inttostr(disksize)+'M');
end;
end;