3

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

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

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

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

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

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

1 ответ1

5

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

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

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

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

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

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

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

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

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

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

HKEY_CLASSES_ROOT\.zzy

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

Значение этого ключа связано со вторым ключом, который вы создадите. На самом деле это имя второго ключа. Для примера программы я присвоил этому ключу значение «Тестовый файл приложения». Это значение может быть любым по вашему выбору, но, как и в случае с первым ключом, вы должны быть уверены, что ключ еще не существует в реестре.

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

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

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 аналогично значению открытого подраздела, за одним исключением:

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .