Как связать приложение Windows с файлом определенного типа, но поделиться этой ассоциацией с другими приложениями?

StackOverflow https://stackoverflow.com/questions/1569102

Вопрос

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

Кроме того, когда я сохраняю файл Microsoft Word как файл .xml, а затем дважды щелкаю файл, он запускает Microsoft Word, даже если тип файла .xml связан с чем-то другим, например с Internet Explorer.Похоже, что с типом файла .xml может быть заглушка, которая при вызове просматривает содержимое и запускает соответствующее приложение.

Есть ли Windows API или какой-то стандартный способ сделать это?

Я хотел создать приложение, которое бы делало именно то, что делает Word, т.е.сохранить файл в формате .xml, но при двойном щелчке вместо Internet Explorer запускается мое приложение.

Это было полезно?

Решение

Механизм открытия документов Office .xml

Для документов Word, сохраненных в формате XML и имеющих расширение .xml, Microsoft реализовала специальный обработчик для открытия этих файлов в соответствующем приложении (этот механизм используется не только для документов Word, но также для электронных таблиц Excel, форм InfoPath и некоторых других форматов).

Если вы проверите реестр, вы увидите, что для файлов с расширением .xml установлен тип файла: xmlfile:

HKEY_CLASSES_ROOT\.xml (Default) = "xmlfile"

Команда, которая выполняется при открытии этого типа файла, указана в разделе

HKEY_CLASSES_ROOT\xmlfile\shell\open\command = ""C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSOXMLED.EXE" /verb open "%1""

Поэтому при двойном щелчке по XML-файлу в Проводнике Windows запускает MSOXMLED.EXE.Теперь это приложение просматривает XML-файл и ищет инструкции по обработке XML.Эта инструкция обработки с именем MSO-приложение можно указать ProgId:

<?mso-application progid="Word.Document"?>

Если эта инструкция обработки найдена и ProgId является одним из поддерживаемых значений, MSOXMLED.EXE выполняет поиск в реестре команды открытия, указанной для этого ProgId.Для Word.Документ на самом деле есть еще одно перенаправление на Word.Document12 (если установлен Office 2007) с помощью подраздела CurVer Word.Document, в результате чего мы получим:

HKEY_CLASSES_ROOT\Word.Document.12\shell\Open\command = ""C:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /n /dde"

Итак, наконец, MSOXMLED.EXE запустит соответствующее приложение Office или запустит приложение XML по умолчанию, указанное в разделе

HKEY_CLASSES_ROOT\XEV.GenericApp\shell\open\command

Вы можете попробовать это, вызвав MSOXMLED.EXE из командной строки:

MSOXMLED.EXE /verb OPEN "SampleWordMLDocument.xml"

Если вы хотите реализовать такое же поведение, вам придется реализовать обработчик, например MSOXMLED.EXE, который просматривает внутри файла предварительно определенную инструкцию обработки, а затем направляет документ в соответствующее приложение.

Обработка значков

Выше мы рассмотрели, как осуществляется открытие и редактирование документов.Другой механизм отвечает за отображение определенного значка в зависимости от инструкции обработки внутри XML-документа:а обработчик значков.

Обработчики значков — это тип расширений оболочки Explorer, которые представляют собой внутрипроцессные COM-объекты, которые могут быть связаны с определенными типами файлов.Тот, который используется для файлов XML, указан в реестре в разделе

HKEY_CLASSES_ROOT\xmlfile\ShellEx\IconHandler = "{AB968F1E-E20B-403A-9EB8-72EB0EB6797E}"

Этот GUID относится к MSOXEV.dll, который, как и MSOXMLEX.EXE, проверяет XML-файл на предмет ProgId, а затем предоставляет правильный значок.

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

Microsoft больше не использует этот метод и вместо этого использует расширения файлов для своих новых форматов OpenXML (см. Почему файлы Office «.xml» ведут себя иначе, чем другие файлы «.xml»?).

Другие советы

Ну, все ассоциации файлов хранятся в реестре.Есть статья "Понимание ассоциаций файлов MS Windows"это может помочь.

Помимо этого, существует множество способов программного создания ассоциаций файлов.Хотя чаще всего это делается в инсталляторе.Например, в моей любимой системе установки NSIS есть макрос для этого: http://nsis.sourceforge.net/FileAssoc

Но возникает проблема установки программы по умолчанию для открытия файлов определенного типа.Я не знаю, какой язык или систему установки вы планируете использовать для этого, но, похоже, вопрос в следующем: ответил здесь для NSIS.Наверняка у Microsoft также есть документация о том, как это сделать с помощью установщика Windows.Но, как вы, наверное, догадались, я больше сторонник NSIS.;)

В проводнике Windows нажмите «Инструменты» -> «Свойства папки» -> «Типы файлов».Нажав «Новый» или «Дополнительно», вы можете создать/изменить свои собственные ассоциации приложений с различными типами файлов, которые появятся при щелчке правой кнопкой мыши по файлу.

РЕДАКТИРОВАТЬ:Я не знаю, есть ли заглушка, которая перенаправляет определенные файлы.Вы можете проверить Мой компьютер\HKEY_CLASSES_ROOT в реестре и посмотреть, что он туда помещает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top