Device Stage и метаданные устройства: проблемы с поиском ответов

Короче говоря, я ищу улучшенные фотореалистичные значки, которые используются в папке панели управления «Устройства и принтеры».

Я полагаю, что мог бы использовать оболочку Windows для их перечисления, но у меня нет пакета оболочки, связанного с моим проектом .NET, и я вроде как думаю, что это обман (LOL идет сюда, в зависимости от того, хотите ли вы ценю один).

Большая часть той скудной документации, которую я нашел относительно доступа к этим файлам вне оболочки, находится по пути "% LOCALAPPDATA% \ Microsoft \ Device Metadata \ dmrccache"

За исключением того, что я использую Windows 8.1 Pro, и этот каталог не существует. Я нашел каталог под названием "C: \ Users \ Nathan \ AppData \ Local \ Microsoft \ Device Stage \ Device \ {8616C787-FB4C-4B21-A2FE-D263F0DC4DA5} \ en-US"

Кажется, здесь хранятся изображения для моего многофункционального принтера Brother, но я не могу найти подобных папок для других устройств. Не говоря уже о том, что ключ GUID, {8616C787-FB4C-4B21-A2FE-D263F0DC4DA5}, вообще не найден в реестре и не связан с какими-либо свойствами устройства, которые я могу найти связанными с устройством принтера ... Также у устройства принтера нет ключа свойства для файла метаданных устройства (говорит, что ключ не существует, хотя вся остальная информация об устройстве заполняется, просто отлично).

Я посмотрел на MSDN, и в нем все рассказывается о том, как создать СОБСТВЕННЫЙ этап устройства и расширенные метаданные XML значков для развертывания устройства, но почти нет документации о том, как это переварить в Windows.

Я хорошо знаком и компетентен в работе с большинством функций SetupDiXXXXXX и создал свои собственные перечислители оборудования на основе .NET и классы, обернутые вокруг этих функций.

Но сейчас я не могу найти документации, касающейся моей проблемы. Единственное решение "быстрого исправления" - это взять значки из перечисления оболочки файла устройств и принтеров ...

Но мне бы очень хотелось более глубокого понимания внутренней работы этой проблемы, и прохождение через COM-интерфейсы оболочки не является моим первым выбором решения (я действительно работаю с функциями API оболочки C, но довольно немного, и если кто-то может дать ответ по этому поводу, я весь уши).

Кроме того, я хотел бы знать, почему и если уровень этапа устройства каким-то образом изменился с Windows 7 на Windows 8, и почему ничего из этого не задокументировано.

Дополнение

Я был бы не против использования извлечения значка оболочки, если бы мог выяснить, как получить имя самого файла, вычислив его, если оно вообще существует, в подобном каталоге.

Чтобы добраться до устройств и принтеров, волшебное имя:

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

Если вы вставите его в панель браузера Explorer, он перенесет вас туда. Если можно получить информацию для прикрепления к этому пути, я могу использовать вызов оболочки C для получения значка.

Но попытка ID экземпляра принтера не сработала (работает с сетевой папкой).

Я даже не знаю, возможно ли это в такой папке.

Тем не менее, я хотел бы узнать больше о том, как просто пойти и самому найти эти вещи.


person Nathan M    schedule 20.09.2014    source источник


Ответы (1)


Хорошо. Я покопался, и можно получить значок устройства, не прибегая к интерфейсам оболочки.

Учитывая базовый путь к папке «Устройства и принтеры»:

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

Выполняя домашнее задание, я обнаружил, что все, что вам нужно сделать, это добавить:

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

В конец базового пути, за которым следует версия ContainerId устройства с экранированным URL-адресом, полученная функциями SetupDiXXXX. Оттуда вы можете получить фотореалистичный значок.

Я сделал это, и это работает. Просто найдите идентификатор контейнера устройства, передайте эти данные в SHParseDisplayName, а затем оттуда вы сможете получить значок из списка изображений элемента.

ОДНАКО я все же хотел бы знать, почему так сложно найти информацию об использовании данных стадии устройства.

ДОПОЛНИТЕЛЬНО SHParseDisplayName некорректно работает с "чрезвычайно специальными" папками при компиляции для x86 в системах x64 ... пока что я могу получить только специальные фотореалистичные значки с указанной выше формулой путем компиляции для x64 , конкретно. Я собираюсь перейти к реальной машине x86 и посмотреть, получу ли я аналогичную реакцию.

person Nathan M    schedule 20.09.2014