четверг, 23 сентября 2010 г.

1.1: Регистрация приложений

Это перевод Application Registration. Цикл: реализация индивидуального формата файлов.

Эта статья обсуждает, как приложения могут предоставлять системе информацию о себе, необходимую для задействования некоторых сценариев. Эта информация включает в себя информацию, необходимую для нахождения приложения, действия (verbs), которые поддерживает приложение, и типы файлов, которые приложение может обрабатывать.

Эта статья организована так:

Примечание: Приложения также могут быть зарегистрированы в апплетах Панели управления 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 индивидуально для приложения и процесса.
Если имя подключа App Paths соответствует имени файла, то Оболочка выполняет два действия:
  • Запись (Default) используется как полное имя файла.
  • Запись Path этого ключа добавляется к переменной окружения PATH этого процесса. Если это не требуется, то значение Path можно не задавать.
Потенциальные проблемы, на которые нужно обратить внимание:
  • Оболочка ограничивает длину командной строки до MAX_PATH * 2 символов. Если в ключе реестра задано несколько файлов или их имена очень велики, то имена в конце списка могут быть потеряны, потому что командная строка будет усечена.
  • Некоторые приложения не принимают несколько имён файлов в командной строке.
  • Некоторые приложения, которые принимают несколько файлов, не распознают формат, в котором Оболочка передаёт их имена. Оболочка передаёт список параметров как строку с кавычками, но некоторые приложения ожидают строку без кавычек.
  • Не все элементы, которые таскаются мышью, являются частью файловой системы. Например - принтеры. У таких элементов нет обычного пути Win32, поэтому нельзя предоставить разумное значение параметра lpParameters функции ShellExecuteEx.
Использование записи DropTarget помогает избежать этих потенциальных проблем, предоставляя доступ ко всем форматам буфера обмена, включая CFSTR_SHELLIDLIST (для длинных списков файлов) и CFSTR_FILECONTENTS (для объектов вне файловой системы).

Чтобы зарегистрировать и контролировать поведение вашего приложения с помощью ключа App Paths, вам нужно:
  1. Добавить подключ к App Paths, имя которого будет совпадать с именем вашего исполняемого файла, как показано в примере:
    HKEY_LOCAL_MACHINE или HKEY_CURRENT_USER 
       SOFTWARE 
          Microsoft 
             Windows 
                CurrentVersion 
                   App Paths 
                      file.exe 
                         (Default)
                         DontUseDesktopChangeRouter 
                         DropTarget 
                         Path 
                         UseUrl
  2. См. таблицу ниже для информации по записям в ключе 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

Связанные темы

1 комментарий:

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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

Примечание. Отправлять комментарии могут только участники этого блога.