воскресенье, 10 мая 2009 г.

Как "Установка и удаление программ" получает размер программы и другую информацию?

Это перевод How does Add/Remove Programs get the size and other information? Автор: Реймонд Чен.

Если программа сама не предоставляет эту информацию, "Установка и удаление программ" вынуждена угадывать.

Проблема в том, что нет "очевидного" способа сопоставить запись в "Установка и удаление программ" с конкретной программой. Каждая запись в списке (для тех, кому интересно) получается из ключа реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall. Единственными обязательными параметрами для удаляемой программы являются DisplayName и UninstallPath. Всё остальное является опциональным.

Предположим, что у "Установка и удаление программ" есть такая регистрация программы:
HKEY_LOCAL_MACHINE\
 Software\
  Microsoft\
   Windows\
    CurrentVersion\
     Uninstall\
      SomeProgram
       DisplayName=REG_SZ:"Классная Программа для Windows"
       UninstallPath=REG_SZ:"C:\WINDOWS\uninstall.exe -Параметры"
Чтобы получить значения для "Последнее использование" и "Частота", "Установка и удаление программ" нужно знать имя exe-файла программы, чтобы спросить меню Пуск: "Эй, как часто пользователь запускает эту программу, и когда последний раз это было?"

Заметьте, что в регистрации, приведённой выше, нет никаких намёков на сущность этого exe-файла.

Поэтому "Установка и удаление программ" начинает угадывать. Она проходит по всему меню Пуск и сравнивает имена программ с display name в списке удаления. Она ищет в меню Пуск элементы, которые совпадают с DisplayName хотя бы по двум словам.

Например, если в меню Пуск есть элемент с именем "Довольно Обычная Программа Windows", то это будет совпадение ровно в два слова ("Windows" и "Программа").

"Установка и удаление программ" берёт элемент с максимальным количеством совпадений и говорит: "Окей, я думаю, что это оно и есть". Предположим на минутку, что наилучшим совпадением и стала "Довольно Обычная Программа Windows.lnk", чей ярлык указывает на "C:\Program Files\LitWare\Decent Program\Decent.exe". "Установка и удаление программ" решит, что запись "Классная Программа для Windows" получит иконку от "Довольно Обычная Программа Windows.lnk". А частота использования и время последнего запуска от "C:\Program Files\LitWare\Decent Program\Decent.exe" будет показана для "Классная Программа для Windows".

Но, постойте, у нас же ещё есть размер программы. "Установка и удаление программ" будет искать в папке "Program Files" каталоги, чьи имена разделяют хотя бы два слова с именем в DisplayName. Каталог с лучшим совпадением будет считаться каталогом, в которую установлена программа. Размеры всех файлов в этом каталоге будут просуммированы и показаны, как размер программы "Классная Программа для Windows".

Программа может добавить дополнительные свойства в свою регистрацию, чтобы избежать этого гадания. Она может установить свойство EstimatedSize, чтобы "Установка и удаление программ" не нужно было искать и угадывать размер программы. Она также может установить свойство DisplayIcon, для указания иконки программы в списке.

Но если программа не указывает эти подсказки, "Установка и удаление программ" вынуждена угадывать среди вариантов, которых может быть абсурдно много. Из своего опыта могу сказать, что, к примеру, Испанский особенно страдает из-за случайных совпадений слов по этому алгоритму - из-за того, что язык сильно использует предлоги и артикли (что приводит к множественным ложным срабатываниям).

Да, всё это, конечно, ужасно неправильно (lame), но когда вас вынуждают оперировать с неадекватной информацией, то "неправильно" - это лучшее, что вы можете сделать.

2 комментария:

  1. А я-то всегда думал, почему это "Установка и удаление программ" так долго запускается)

    ОтветитьУдалить
  2. При сборке инсталляторов учту)

    ОтветитьУдалить

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

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

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

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

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