Как работают ассоциации

Как работают ассоциации

У меня проблема с ассоциациями файлов. Мое приложение C# может устанавливать ассоциацию файлов для собственного расширения, так что пользователи, дважды щелкнув файл проекта, который оно использует, откроют мое приложение и загрузят файл.

Это вызывает проблемы с двумя сторонними компонентами. Каждый использует лицензирование.

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

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

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

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

решение1

Как работают ассоциации

Когда вы дважды щелкаете по файлу в проводнике Windows, оболочка Windows ищет расширение файла в реестре, чтобы узнать, зарегистрировано ли расширение. Если расширение не зарегистрировано, Windows отображает диалоговое окно «Открыть с помощью», позволяющее пользователю выбрать приложение для связи с типом файла. Если расширение зарегистрировано, Windows вызывает функцию ShellExecute() с командой «открыть». Она также передает имя файла, который был дважды щелкнут, в качестве параметра командной строки.

Однако ассоциации выходят за рамки простого открытия файла. Если щелкнуть правой кнопкой мыши по текстовому файлу (.TXT) в Проводнике, то в верхней части контекстного меню появятся два элемента. Первый называется Открыть. Выбор этого элемента меню аналогичен двойному щелчку по файлу в Проводнике. При выборе Открыть будет запущен NOTEPAD.EXE с выбранным загруженным файлом (при условии установки Windows по умолчанию). Второй элемент меню называется Печать. Щелчок по этому элементу меню приведет к печати файла без отображения Блокнота.

Другие типы файлов отображают еще больше элементов в контекстном меню Explorer. Если вы щелкните правой кнопкой мыши файл Microsoft PowerPoint, например, вы увидите элементы контекстного меню с именами Открыть, Новый, Печать и Показать. Элементы, отображаемые в контекстном меню для определенного типа файла, берутся из реестра.

Существует по крайней мере два способа создания ассоциации файлов в Windows. Один из способов — щелкнуть правой кнопкой мыши файл в проводнике Windows и выбрать «Открыть с помощью…» в контекстном меню. Когда вы это сделаете, Windows отобразит диалоговое окно «Открыть с помощью». Естественно, этот метод требует вмешательства пользователя. При развертывании приложения вы, вероятно, не захотите заставлять пользователей вручную настраивать ассоциацию файлов.

Лучший способ создания ассоциации — создание различных записей в реестре из вашего приложения. Хорошая программа установки создаст записи в реестре для вас, но бывают случаи, когда вам нужно больше контроля над процессом.

Регистрация ассоциации

Регистрация ассоциации файлов требует создания двух отдельных ключей реестра. Оба ключа создаются в HKEY_CLASSES_ROOTразделе реестра.

Ключ расширения файла

Первый ключ — это имя расширения файла, которому предшествует точка.

HKEY_CLASSES_ROOT\.zzy

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

Значение этого ключа связано со вторым ключом, который вы создадите. Фактически, это имя второго ключа. Для примера программы я дал этому ключу значение "Test App File". Это значение может быть любым, которое вы выберете, но, как и в случае с первым ключом, вы должны быть уверены, что этот ключ еще не существует в реестре.

Ключ ассоциации приложения

Второй ключ имеет то же имя, что и значение по умолчанию для первого ключа.

HKEY_CLASSES_ROOT\Test App File

Этот ключ должен иметь по крайней мере один подраздел. Windows использует этот подраздел при запуске приложения. Весь ключ структурирован следующим образом:

HKEY_CLASSES_ROOT
  Test App File
    shell
      open
        command

Строка, присвоенная командному ключу, представляет собой полный путь и имя файла приложения, за которым следует%1. Например:

C:\MyApp\MyApp.exe %1

Когда Windows запускает приложение, оно заменяет%1символ с путем и именем файла, который был дважды нажат в проводнике Windows. Это значение передается в ваше приложение как параметр командной строки.

Дополнительные ключи

Есть и другие подразделы, которые можно создать в разделе ассоциации файлов. Одним из таких разделов является DefaultIconраздел . Этот раздел используется для указания значка, который оболочка Windows будет отображать рядом с файлами зарегистрированных типов. Этот раздел не требуется, если у вас зарегистрирован только один тип файла и если этот тип файла должен использовать значок приложения. Вот как выглядит значение раздела DefaultIcon для ассоциации, которая определяет значок приложения по умолчанию:

C:\MyApp\MyApp.exe,0

Это указывает, что первый значок, найденный в EXE-файле приложения, должен использоваться в качестве значка отображения ассоциации файлов. Если в вашем приложении имеется более одного типа файлов, вы можете указать другие значки, изменив индекс значка, который следует за запятой. Например, в C++Builder есть значки для файла проекта, файла формы, исходного файла и т. д. Если вы посмотрите в реестре ниже, HKEY_CLASSES_ROOT\BCBProject\DefaultIconвы увидите, что значок для файла проекта имеет индекс значка 4 (для C++Builder 4, по крайней мере).

Если вы хотите разрешить пользователям печатать документ, вы можете добавить подраздел print в дополнение к подразделу open. Значение подраздела print аналогично значению подраздела open, за одним исключением:

C:\MyApp\MyApp.exe /p %1

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

Вы можете добавить столько подразделов, сколько захотите для определенного типа файла. Имя каждого подраздела будет отображаться в контекстном меню Проводника. Вам нужно только добавить переключатель командной строки для каждого типа команды, чтобы ваше приложение могло идентифицировать выбранный элемент контекстного меню. Если вы укажете значение по умолчанию для подраздела, Windows будет использовать этот текст для текста элемента контекстного меню. Если вы не укажете значение по умолчанию, Windows будет использовать само имя ключа для элемента меню.

Вся информация взята отсюдастатья.

Связанный контент