Эта статья обсуждает, как приложения могут предоставлять системе информацию о себе, необходимую для задействования некоторых сценариев. Эта информация включает в себя информацию, необходимую для нахождения приложения, действия (verbs), которые поддерживает приложение, и типы файлов, которые приложение может обрабатывать.
Эта статья организована так:
- Поиск исполняемого файла приложения
- Регистрация приложения
- Регистрация действий (Verbs) и другой информации о файловых ассоциациях
- Регистрация воспринимаемого (perceived) типа
- Связанные темы
Примечание: Приложения также могут быть зарегистрированы в апплетах Панели управления Set Program Access and Computer Defaults (SPAD) и Set Your Default Programs (SYDP) Control Panels. Для получения информации о SPAD и SYDP - см. Guidelines for File Associations and Default Programs и Set Program Access and Computer Defaults (SPAD).
Поиск исполняемого файла приложения
Когда функция ShellExecuteEx вызывается с именем исполняемого файла в своём параметре lpFile, то она будет искать этот файл в нескольких местах. Мы рекомендуем вам зарегистрировать своё приложение в ключе реестра App Paths, чтобы вам не пришлось модифицировать переменную окружения PATH.Файл ищется в таких местах:
- Текущий каталог.
- Каталог Windows (без подкаталогов).
- Каталог Windows\System32.
- Каталоги, указанные в переменной окружения PATH.
- (Рекомендуется) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths (подключ реестра App Paths).
Регистрация приложения
Оба ключа реестра App Paths и Applications используются для регистрации и контроля поведения системы от имени приложений. Ключ App Paths является предпочтительным местом регистрации на компьютерах с Windows XP Service Pack 1 (SP1) и выше.Использование подключа реестра App Paths
Приложение, которое устанавливается для всех пользователей компьютера, может быть зарегистрировано под ключом реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths. В Windows 7 и выше, приложение также может быть установлено только для одного пользователя регистрацией в ключе реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths.Записи под ключом App Paths в основном используются для таких целей:
- Чтобы указать соответствие между именем исполняемого файла приложения и полным путём к приложению.
- Чтобы добавлять информацию к переменной окружения PATH индивидуально для приложения и процесса.
- Запись (Default) используется как полное имя файла.
- Запись Path этого ключа добавляется к переменной окружения PATH этого процесса. Если это не требуется, то значение Path можно не задавать.
- Оболочка ограничивает длину командной строки до MAX_PATH * 2 символов. Если в ключе реестра задано несколько файлов или их имена очень велики, то имена в конце списка могут быть потеряны, потому что командная строка будет усечена.
- Некоторые приложения не принимают несколько имён файлов в командной строке.
- Некоторые приложения, которые принимают несколько файлов, не распознают формат, в котором Оболочка передаёт их имена. Оболочка передаёт список параметров как строку с кавычками, но некоторые приложения ожидают строку без кавычек.
- Не все элементы, которые таскаются мышью, являются частью файловой системы. Например - принтеры. У таких элементов нет обычного пути Win32, поэтому нельзя предоставить разумное значение параметра lpParameters функции ShellExecuteEx.
Чтобы зарегистрировать и контролировать поведение вашего приложения с помощью ключа App Paths, вам нужно:
- Добавить подключ к App Paths, имя которого будет совпадать с именем вашего исполняемого файла, как показано в примере:
HKEY_LOCAL_MACHINE или HKEY_CURRENT_USER SOFTWARE Microsoft Windows CurrentVersion App Paths file.exe (Default) DontUseDesktopChangeRouter DropTarget Path UseUrl
- См. таблицу ниже для информации по записям в ключе App Paths:
Запись в реестре Описание (Default) Полный путь к исполняемому файлу приложения. Имя приложения, указанного в записи (Default), может быть задано с или без расширения .exe. Если необходимо, то функция ShellExecuteEx добавит расширение, когда будет просматривать ключ App Paths. Запись имеет тип REG_SZ. DontUseDesktopChangeRouter Является обязательным для приложений-отладчиков, чтобы избежать взаимной блокировки (deadlock) при отладке процесса Проводника Windows. Однако установка записи DontUseDesktopChangeRouter приводит к несколько менее эффективной обработке уведомлений об изменениях. Запись имеет тип REG_DWORD с допустимым значением $1. DropTarget Является class identifier (CLSID). Запись DropTarget содержит CLSID объекта (обычно типа local server, а не in-process server), который реализует интерфейс IDropTarget. По-умолчанию, когда drop target является исполняемым файлом и значение DropTarget не указано, то Оболочка конвертирует список перетаскиваемых файлов в один параметр командной строки и передаёт его в функцию ShellExecuteEx через аргумент lpParameters. Path Предоставляет строку (в форме списка каталогов, разделённых точкой с запятой. Этот список добавляется к переменной окружения PATH, когда запускается приложение. Запись имеет тип REG_SZ. В Windows 7 и выше тип может быть REG_EXPAND_SZ, и часто является REG_EXPAND_SZ %ProgramFiles%.
Примечание: В дополнение к распознаваемым Оболочкой параметров (Default), Path и DropTarget - приложение может добавлять свои значения к своему подключу в App Paths. Мы поощряем разработчиков приложений использовать подключ App Paths для указания специфичных для приложения пути и данных, вместо того, чтобы добавлять к глобальным данным системы.UseUrl Указывает, что ваше приложение может принимать URL (вместо имени файла) в командной строке. Эта запись должна указываться web-браузерами и любой программой, которая может открыть документ прямо из Интернета. Когда функция ShellExecuteEx запускает приложение и значение UseUrl=1 не установлено, то ShellExecuteEx скачивает документ в локальный файл и запускает приложение на локальную копию.
Например, возможность Web Folders ищет приложения, которые обрабатывают тип файла и отображает зарегистрированное им действие (verb) только если приложение указало запись UseUrl. В этом примере, если действие open для файлов .txt ссылается на notepad.exe и notepad.exe не имеет значения UseUrl=1, то Web Folders не будет показывать действие open для контекстного меню .txt файлов.
Запись UseUrl имеет тип REG_DWORD и значение $1.
Использование подключа реестра Applications
С помощью включения записей реестра под ключом HKEY_CLASSES_ROOT\Applications\ApplicationName.exe приложения могут предоставлять такую специфичную для приложения информацию:Запись реестра | Описание |
---|---|
shell\verb | Предоставляет действие (verb) для вызова приложения через OpenWith. Без определения действия, система предполагает, что приложение поддерживает CreateProcess и передаёт имя файла в командной строке. Эта функциональность применима ко всем методам, включая DropTarget, ExecuteCommand и Dynamic Data Exchange (DDE). |
DefaultIcon | Позволяет приложению указать иконку, представляющую приложение, вместо первой иконки в исполняемом файле приложения. |
FriendlyAppName | Позволяет приложению задать локализуемое имя приложения для показа пользователю, вместо использования информации о версии, которая может быть не локализована. Запрос ассоциации ASSOCSTR использует это значение реестра и откатывается к использованию имени FileDescription из версионной информации. Если и это имя отсутствует, то будет использоваться отображаемое имя файла. Приложениям следует использовать ASSOCSTR_FRIENDLYAPPNAME, чтобы получать эту информацию и корректное поведение. |
SupportedTypes | Перечисляет имена типов, которые поддерживаются приложением. Это позволяет приложению быть указанным в каскадном меню диалогового окна Открыть с помощью. |
NoOpenWith | Указывает, что для открытия этого типа приложение не задано. Информация об использовании приложений записывается, а затем используется (если эта запись задана) для заполнения списка Рекомендуемые программы, который показывается в каскадном меню Открыть с помощью, что очень заметно. Если для приложения заданы записи OpenWithList или OpenWithProgIDs, то ваше приложение всё равно появится в этом списке, даже если оно укажет запись NoOpenWith. Для дальнейшие информации см. "Включение приложения в диалог 'Открыть с помощью'" и "Исключение приложения из диалога 'Открыть с помощью' для файлов без ассоциаций" в Типы файлов. |
IsHostApp | Указывает, что процесс является серверным процессом. Например, типа Rundll32.exe или Dllhost.exe. Это означает, что он не должен рассматриваться для закрепления программы в меню Пуск или включения в список Most Frequently Used (MFU). Когда он запускается через ярлык с не пустым списком параметров или явным Application User Model IDs (AppUserModelIDs), то процесс может быть закреплён в меню Пуск (как этот ярлык). Такие ярлыки также являются кандидатами для включения в список MFU. |
NoStartPage | Указывает, что приложение и ярлыки на него должны быть исключены из меню Пуск, из закрепления и включения в список MFU. Эта запись обычно используется для системных утилит, установщиков и удалений программ и readme-файлов. |
UseExecutableForTaskbarGroupIcon | Просит Панель задач использовать иконку по-умолчанию этого приложения, если нет закреплённого ярлыка для этого приложения (вместо иконки окна приложения). |
TaskbarGroupIcon | Указывает иконку, которую следует использовать в Панели задач. Обычно для этого используется иконка окна. Установка записи TaskbarGroupIcon приводит к использованию вместо этого другой иконки из .exe-файла приложения. |
Примеры
Вот некоторые примеры регистрации приложений через ключ реестра HKEY_CLASSES_ROOTApplicationsApplicationName.exe. Все записи имеют тип REG_SZ, за исключением DefaultIcon, который имеет тип REG_EXPAND_SZ.HKEY_CLASSES_ROOT Applications wordpad.exe FriendlyAppName = @shell32.dll,-22069
HKEY_CLASSES_ROOT Applications wmplayer.exe SupportedTypes .3gp2
HKEY_CLASSES_ROOT Applications wmplayer.exe DefaultIcon (Default) = %SystemRoot%\system32\wmploc.dll,-730
HKEY_CLASSES_ROOT Applications WScript.exe NoOpenWith
HKEY_CLASSES_ROOT Applications photoviewer.dll shell open DropTarget Clsid = {FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}
HKEY_CLASSES_ROOT Applications mspaint.exe SupportedTypes .bmp .dib .rle .jpg .jpeg .jpe .jfif .gif .emf .wmf .tif .tiff .png .ico
Регистрация действий (Verbs) и другой информации о файловых ассоциациях
Подключи, зарегистрированные под HKEY_CLASSES_ROOT\SystemFileAssociations, позволяют Оболочке определять поведение по-умолчанию для атрибутов файла и использовать разделяемые файловые ассоциации (shared file associations). Когда пользователь изменяет программу по-умолчанию для типа файла, ProgID нового приложения по-умолчанию имеет приоритет для поставки действий (verb) и другой информации. Этот приоритет определяется по его первому положению в списке ассоциаций (association array). Если программа по-умолчанию изменяется, то информация под предыдущим ProgID более не доступна.Чтобы быть готовым к последствиям смены программы по-умолчанию, вы можете использовать HKEY_CLASSES_ROOT\SystemFileAssociations, чтобы зарегистрировать действия (verb) и другую информацию. Из-за размещения этих регистраций после ProgID в списке ассоциаций, регистрации в этом ключе реестра имеют меньший приоритет. Эти регистрации SystemFileAssociations неизменны, даже когда пользователи меняют свои программы по-умолчанию, и поэтому они предоставляют место для регистрации вторичных действий, которые всегда будут доступны для выбранного типа файла. Для примера см. Регистрация воспринимаемого (perceived) типа ниже.
Следующий пример показывает, что происходит, когда пользователь запускает апплет Программы по-умолчанию в Панели управления, чтобы изменить программу для открытия файлов .mp3 на App2ProgID. После изменения умолчания действие Verb1 больше не доступно, а действие Verb2 становится действием по-умолчанию.
HKEY_CLASSES_ROOT .mp3 (Default) = App1ProgID
HKEY_CLASSES_ROOT App1ProgID shell Verb1
HKEY_CLASSES_ROOT App2ProgID shell Verb2
Регистрация воспринимаемого (perceived) типа
Записи реестра для perceived-типов определяются как подключи HKEY_CLASSES_ROOT\SystemFileAssociations. Например, perceived-тип text зарегистрирован так:HKEY_CLASSES_ROOT SystemFileAssociations text shell edit command (Default) = "%SystemRoot%\system32\NOTEPAD.EXE" "%1" open command (Default) = "%SystemRoot%\system32\NOTEPAD.EXE" "%1"Perceived-тип для любого типа файла указывается в записи PerceivedType в подключе типа файла. Значение PerceivedType устанавливается в имя perceived-типа, который предварительно зарегистрирован под HKEY_CLASSES_ROOT\SystemFileAssociations, как показано в предыдущем примере. Чтобы объявить, например, что файлы .cpp имеют perceived-тип "text", вам нужно добавить такую запись:
HKEY_CLASSES_ROOT .cpp PerceivedType = text
Полезный сборник, спасибо!
ОтветитьУдалить