gpt4 book ai didi

delphi - WMI:如何区分内部 "local disk"HDD 和外部 "local disk"HDD

转载 作者:行者123 更新时间:2023-12-03 15:28:03 31 4
gpt4 key购买 nike

背景
我一直在使用 Win32_DiskDrive 来查找闪存(USB 笔、SD 卡等),但在其他计算机上进行一些测试后,我发现它们并不总是被发现。因此,我使用 Win32_LogicalDisk,因为它具有 DriveType,所以我不必与两个类(例如分区)关联来首先查找驱动器,然后查找它们的驱动器号。

问题在于,外部硬盘驱动器在 LogicalDisk 中被检测为 DriveType 3(本地磁盘),而在 DiskDrive 的功能中没有 7(支持可移动媒体)。所以我无法区分内部驱动器和外部驱动器之间的区别。

问题
如何使用 LogicalDisk(或 DiskDrive,如果确实需要的话)或第三种东西来区分内部硬盘驱动器和外部硬盘驱动器之间的区别。

好的。问题已得到解答!
这是代码,如果有人感兴趣的话。

program GetWMI_USBConnectedInfo;

{$APPTYPE CONSOLE}

uses
Windows,
Classes,
ActiveX,
Variants,
SysUtils,
WbemScripting_TLB, // Using the .pas supplied by the wrapper as it seems to be the XP version of 1.2
magwmi,
magsubs1;

function CheckType(Str: string): boolean;
var
I: Integer;
Str2: string;
begin
Result := False;
for I := 1 to Length(Str) - 1 do if Str[I] = '\' then begin
Str2 := Copy(Str, 1, I-1);
Str2 := LowerCase(Str2);
if (Str2 = 'usbstor') or (Str2 = 'flashmedia') then
Result := True;
Break;
end;
end;

procedure GetUSBDiskDriveInfo;
var
I, II, III: Integer;
Start, Stop, Freq: Int64;
instances, instances2, instances3: integer ;
WmiResults, WmiResults2, WmiResults3: T2DimStrArray ;
errstr: string ;
begin
QueryPerformanceFrequency(Freq);
QueryPerformanceCounter(Start);
try
MagWmiGetInfoEx('.', 'root\CIMV2', '', '', 'SELECT * FROM Win32_DiskDrive', WmiResults, instances, errstr);
for I := 1 to instances do begin
MagWmiGetInfoEx('.', 'root\CIMV2', '', '', 'ASSOCIATORS OF {Win32_DiskDrive.DeviceID=''' + WmiResults[I, 12] + '''} WHERE AssocClass = Win32_DiskDriveToDiskPartition', WmiResults2, instances2, errstr);
for II := 1 to instances2 do begin
MagWmiGetInfoEx('.', 'root\CIMV2', '', '', 'ASSOCIATORS OF {Win32_DiskPartition.DeviceID=''' + WmiResults2[II, 11] + '''} WHERE AssocClass = Win32_LogicalDiskToPartition', WmiResults3, instances3, errstr);
for III := 1 to instances3 do begin
if CheckType(WmiResults[I, 32]) or (Pos('7', WmiResults[I, 3])>0) then begin
Write(WmiResults3[III, 4]);
Write(WmiResults3[III, 39]);
Writeln;
end;
end;
WmiResults3 := nil;
end;
WmiResults2 := nil;
end;
WmiResults := nil;
except
Writeln;
Writeln('error: '+errstr);
end;
Writeln;
QueryPerformanceCounter(Stop);
if (Freq > 0) then
Writeln('It took ' + FormatFloat('0.#0', (Stop-Start) / Freq) + ' seconds to complete.');
end;

begin
try
CoInitialize(nil);
GetUSBDiskDriveInfo;
Readln;
CoUninitialize;
except
on E:Exception do begin
CoUninitialize;
Writeln(E.Classname, ': ', E.Message);
Readln;
end;
end;
end.

还有一件事!
称其为肮脏的黑客或其他什么,但我注释掉了 MagWmiGetInfoEx 的这一部分(magwmi 中的第 298 行)以使其正常工作:

//        if Pos ('SELECT', Arg) = 1 then
wmiObjectSet := wmiServices.ExecQuery (Arg, 'WQL', wbemFlagReturnImmediately, nil)
// else
// wmiObjectSet := wmiServices.InstancesOf (Arg, wbemFlagReturnImmediately or
// wbemQueryFlagShallow, nil)
;

最佳答案

我建议坚持使用 WMI。有个好的delphi wrapper可用,其中包括帮助您入门的完整源代码。

帮助您入门的查询是“SELECT * FROM WIN32_DiskDrive”,它将返回系统中所有磁盘驱动器的所有信息。对于任何 USB 驱动器,PNPDeviceID 字段都应以 USBSTOR 开头。关于返回哪些字段的一个很好的资源是 MSDN网站。只需将对象转换为查询即可。

如果您要从线程中调用此函数,则可能需要在进行任何调用之前添加初始化 COM (ComInitialize)。在销毁线程之前,调用 ComUnitialize。

关于delphi - WMI:如何区分内部 "local disk"HDD 和外部 "local disk"HDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2347808/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com