设备阶段和设备元数据:查找问题答案



我正在寻找"设备和打印机"控制面板文件夹中使用的增强、逼真的图标。

我想我可以使用Windows shell来枚举它们,但我没有将shell包链接到我的.NET项目,而且我有点认为这是作弊(LOL在这里,取决于你是否喜欢)。

我发现的大多数关于在shell之外访问这些文件的稀疏文档都是通过访问路径"%LOCALAPPDATA%\Microsoft\Device Metadata\dmrcache"

不过,我运行的是Windows 8.1 Pro,而该目录不存在。我确实找到了一个名为"C:\Users\Nathan\AppData\Local\Microsoft\Device Stage\Device\{8616C787-FB4C-4B21-A2FE-D263F0DC4DA5}\en US"的目录

这似乎保存了我的兄弟多功能打印机的图像,但我找不到其他设备的类似文件夹。更不用说,GUID密钥{8616C787-FB4C-4B21-A2FE-D263F0DC4DA5}在注册表中根本找不到,也没有链接到我能找到的与打印机设备相关的任何设备属性。。。打印机设备也没有设备元数据文件的属性密钥(表示该密钥不存在,尽管所有其他设备信息都会填充,但还好。)

我看了MSDN,它告诉了您如何创建自己的设备阶段和用于设备部署的增强图标XML元数据,但几乎没有关于如何在windows中摘要它的文档。

我非常熟悉并能够胜任大多数SetupDiXXXXXX函数,并构建了自己的基于.NET的硬件枚举器和围绕这些函数的类。

但我现在找不到任何文件来处理我的问题。唯一的"快速解决方案"是从设备和打印机文件的外壳枚举中获取图标。。。

但是,我非常希望对这个问题的内部工作有更深入的了解,并且浏览shell COM接口并不是我的第一选择解决方案(不过,我确实使用了shell C API函数,但有很多,如果有人能提供与此相关的答案,我会洗耳恭听的)。

此外,我想知道为什么以及设备阶段层是否以某种方式从Windows 7更改为Windows 8,以及为什么这些都没有记录在案。

附录

如果我能通过计算文件名(如果它存在于这样的目录中)来获得文件本身的名称,我不会介意使用shell图标提取。

要访问设备和打印机,神奇的名称是:

::{26EE0668-A00A-44D7-9371-BEB064C98683}::{A8A91A66-3A7D-4424-8D24-04E180695C7A}

如果你把它放在浏览器栏里,它会把你带到那里。如果可以获取附加到该路径的信息,我可以使用shell C调用来获取图标。

但是尝试打印机的实例ID不起作用(它适用于网络文件夹)。

我甚至不知道在这样的文件夹中是否可能。

尽管如此,我还是想知道更多关于如何自己去寻找这些东西的信息。

好的。我做了一些挖掘,可以在不使用shell接口的情况下获得设备的图标。

给定设备和打印机文件夹的基本路径:

::{20D04FE0-3AEA-1069-A2D8-08002B30309D}::{21EC2020-3AEA-1069-A2DD-08002B30309D}::{A8A91A66-3A7D-4424-8D24-04E180695C7A}

做作业我发现你所要做的就是添加:

Provider%5CMicrosoft.Base.DevQueryObjects//DDO:

在基本路径的末尾,后跟SetupDiXXXX函数检索到的设备ContainerId的URL转义版本。从那里你可以检索照片逼真的图标。

我已经做到了,而且效果很好。只需找到设备的容器ID,将此数据传递给SHParseDisplayName,然后就可以从项目图像列表中获取图标。

但是我仍然想知道为什么很难找到有关消费设备阶段信息数据的信息。

ADDITIONALLYSHParseDisplayName在x64系统上为x86编译时无法正确使用"极其特殊"的文件夹。。。到目前为止,我只能通过编译x64来检索具有上述公式的特殊照片逼真图标。我要去一台真正的x86机器,看看我是否得到了类似的反应。

最新更新