- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
我一直在使用 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/
背景 我一直在使用 Win32_DiskDrive 来查找闪存(USB 笔、SD 卡等),但在其他计算机上进行一些测试后,我发现它们并不总是被发现。因此,我使用 Win32_LogicalDisk,因
在我的应用程序中,我需要大约每 50 毫秒在一个大文件(大约 2-7 GB)中连续写入数据 block (大约 2MB)。这是按顺序、循环方式完成的,所以我将一个 block 一个 block 地写入
我正在编写自己的文件搜索(为什么是因为我想要/可以 - 而不是寻找现有程序)。我可以使用 DriveInfo.GetDrives() 在 c# 中获取所有驱动器方法。理想情况下,我希望仅在独立磁盘的驱
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 上个月关门。 Improve this qu
在我们的开发环境中,我们长期以来一直通过各种 SQL Server 版本和不同的环境配置为每个产品使用特定的备份和恢复脚本,没有出现任何问题。 最近,我们已升级到 SQL Server 2012 作为
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Storing Images in DB - Yea or Nay? 非常简单,我正在托管一个用户可以上传图
这是我的案例: 我正在使用 ABCPDF 从我需要在网络上显示的 .DOCX 文件生成 HTML 文档。当您从 ABCPDF 导出为 HTML 时,您会生成一个 HTML 和一个包含支持文件(.css
我有一个使用 50 字节数据结构的文件格式(.STL,立体光刻,结构是标准的,不能更改。不要与标准模板库混淆)。直接从硬盘读取会导致读取错误数据,因为50字节不是4的倍数。 在整个 50 字节的结构中
我正在尝试在硬盘驱动器上存储一个大小约为 80Gb 的简单大型哈希表(64 位键,64 位值)。如果我想获得最佳性能,最有效的方法是什么? 要查找的键是完全随机的,我必须每 10 毫秒查找一次?是否有
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我正在尝试确定文件是否在本地驱动器上。我找到了 GetDriveType() WINAPI检索驱动器类型。然而,阅读似乎返回值的描述,这就是我的理解,它将闪存驱动器检索为 FIXED,这不是我想要的。
在发表这篇文章之前,我搜索并尝试了 4 天所有的东西,比如 https://www.codeproject.com/kb/gdi-plus/memimage.aspx ,但我是编程新手。 这段代码(不
我在 Google Cloud 中创建了一个10 GB HDD 和 3.75 GB RAM 实例,并在那里托管了一个相当繁重的数据库事务应用程序的后端/API。操作系统是 Ubuntu 14.04 L
我需要将我所有的数据库从操作系统死机的硬盘移动到新硬盘。 我已将所有文件从/var/lib/mysql 移动到新位置,一切正常,除了 mysql 用户名。当我访问 phpmyadmin 中的权限选项卡
我想运行一个机器学习算法作为我的残局研究代码,该代码迄今为止未经证实且未发布用于文本挖掘目的。文本已经获得,但从 Common Crawl 获得的 warc 格式中被删除。我正在为机器学习目的准备数据
我正在尝试用 C++ 开发一个小型基准测试系统,但我在测量 HDD 读写速度时遇到了问题。更确切地说,我测量的传输速度是巨大的:读取 400-600 MB/s,写入 1000 MB/s 以上。我有一个
发生硬盘故障。 因此,添加了一个新的主 HDD,并将旧 HDD 添加为辅助 HDD。 我正在尝试安装辅助硬盘,但出现错误。 我制作了/media/qwe/。 然后我在 Putty 上使用这些 SSH
我们有一个嵌入式 Linux 构建,它以处于 sleep 模式(硬件)的 HDD 启动。然后软件启动并为驱动器供电。 Linux 检测到驱动器正常: ata1: exception Emask 0x1
我是 Hadoop 和虚拟机 (VM) 的新手。我想要一个有 4-5 个节点的 Hadoop 集群。我的理解是每个节点都是商品硬件(运行 Unix 的 PC)。我的想法是,是否可以在外部 HDD 上创
我是一名优秀的程序员,十分优秀!