Как Windows связывает значки с файлами в оболочке проводника?

У меня установлены как InDesign CS2, так и CS3. Оба используют файлы с расширением .indd. Как Windows узнает, какой значок использовать? Он использует правильные значки, то есть файлы CS2 имеют значок cs2, а файлы CS3 имеют значок CS3.

Откуда Windows знает, как это сделать?

И как я могу извлечь или использовать эту систему определения версий в своих программах?

Изменить:

Спасибо за ваши ответы обработчика значков-расширений оболочки. Что-то новое для меня. Но есть ли способ подключиться к IconHandler, который предоставляет InDesign, и использовать его для определения версии файла InDesign?


person Kugel    schedule 25.02.2010    source источник
comment
Маловероятно, что вы сможете получить эту информацию из обработчика InDesign. Однако стоит посмотреть, есть ли какие-либо другие расширения оболочки, зарегистрированные для этого типа файла, например, он может реализовать интерфейс свойств, который может дать вам это значение. Попробуйте щелкнуть правой кнопкой мыши, чтобы получить свойства файла, и проверьте вкладку «Подробности». Я бы попробовал загрузить файлы cs2 и cs3 в шестнадцатеричный редактор и посмотреть первые 20 байтов или около того. Во многих форматах файлов заголовок является обычным и содержит номер версии (который не обязательно будет 2 или 3), поэтому вы сможете определить его по нему.   -  person the_mandrill    schedule 26.02.2010
comment
@the_mandrill - вот что я делал, читая первые байты. Но информация о версии не фиксируется, иногда всплывает. Вот почему я ищу более надежный метод, если он доступен.   -  person Kugel    schedule 26.02.2010
comment
В этом случае вы, вероятно, не сможете это сделать, если формат файла не будет опубликован или реконструирован. Одной из возможностей может быть вызов обработчика значков Adobe, а затем определение того, какой значок был использован, но это может быть ненадежным и, конечно, требует, чтобы обработчик был установлен в системе (что вы не можете гарантировать и не будете иметь возможность распространять его).   -  person the_mandrill    schedule 28.02.2010


Ответы (3)


Вам нужно написать расширение оболочки Icon Handler. См. Документацию MSDN для IExtractIcon. Основной механизм заключается в том, что вы создаете расширение оболочки и регистрируете обработчик значков для нужного типа файла (см. HKEY_CLASSES_ROOT / .indd), а затем оболочка загружает ваш обработчик, передает информацию о файле и запрашивает значок взамен. Также существует метод IExtractImage, если вы хотите предоставьте растровое изображение эскиза, а не просто значок.

Обратите внимание, что вам нужно быть особенно осторожным при написании обработчиков расширений оболочки, поскольку любые утечки памяти или сбои могут нанести ущерб проводнику и любым другим приложениям, которые отображают диалоговое окно открытия / сохранения файла.

person the_mandrill    schedule 25.02.2010
comment
Хорошо, вы ответили на первую часть моего вопроса. Другая часть, вероятно, невозможна. - person Kugel; 26.02.2010

Для некоторых файлов это HKEY_CLASSES_ROOT\<file extension here>\DefaultIcon запись реестра, но большинство файлов сопоставляются с более понятным именем, например .pdf\(Default) -> AcroExch.Document (если установлен Adobe Reader).

В этом случае вам нужно пройти по реестру до AcroExch.Document и увидеть, что либо

  • DefaultIcon прямо там или
  • AcroExch.Document\CLSID\(Default) - это какой-то GUID. Затем следуйте за HKEY_CLASSES_ROOT\CLSID\<insert that guid here>, и вы заметите, что этот ключ содержит DefaultIcon

... а DefaultIcon - откуда загружается значок.

Надеюсь, это было достаточно ясно;). Не знаю, как в вашем особом случае, но в реестре должно быть различие.

person AndiDog    schedule 25.02.2010
comment
Это случай фиксированного значка, но OP спрашивал, как программно переключить тип значка, когда у вас есть две версии файла, но с одинаковым расширением. +1 хотя за упоминание о необходимости второго уровня косвенного обращения к GUID - person the_mandrill; 26.02.2010

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

person Hans Passant    schedule 25.02.2010
comment
вы можете дать ссылку на проект, который поддерживает windows 7, а не только xp? - person Beno; 18.08.2013