Если программа сама не предоставляет эту информацию, "Установка и удаление программ" вынуждена угадывать.
Проблема в том, что нет "очевидного" способа сопоставить запись в "Установка и удаление программ" с конкретной программой. Каждая запись в списке (для тех, кому интересно) получается из ключа реестра 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), но когда вас вынуждают оперировать с неадекватной информацией, то "неправильно" - это лучшее, что вы можете сделать.
А я-то всегда думал, почему это "Установка и удаление программ" так долго запускается)
ОтветитьУдалитьПри сборке инсталляторов учту)
ОтветитьУдалить