Получение списка установленных программ
Как получить перечень установленных в системе программ? Наиболее правильный способ - это обработка списка зарегистрированных инсталляций в реестре. Список инсталляций представляет собой пачку ключей в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, в каждом из которых содержится набор параметров с описанием установленной программы. Тут есть имя программы и название ее разработчика, ссылки на деинсталлятор, на папку, куда она была установлена, на ее иконку, дата установки и т.п. Каких-то второстепенных параметров может и не быть, но основные всегда присутствуют.Список установленных программ
Надо понимать, что список включает в себя не все программы, имеющиеся в системе, а только те, которые были нормально установлены и зарегистрированы. Всякие портативные программы и программы с нестандартной установкой, естественно, в этот список не попадут.
Подготавливаем все необходимые данные. Это наименование ключа реестра и список параметров, значения которых надо будет получить.
Code (Assembler) : Убрать нумерацию
- szKey db 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',0
- szParam1 db 'DisplayName',0
- szParam2 db 'DisplayVersion',0
- szParam3 db 'InstallLocation',0
- szParam4 db 'InstallLocationEx',0
- szParam5 db 'UninstallString',0
- slash db '\',0
- ERROR_FILE_NOT_FOUND = 2
Code (Assembler) : Убрать нумерацию
- ; Открыть ключ реестра
- invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,szKey,0,\
- KEY_ENUMERATE_SUB_KEYS,hkResult
- ; Получить список ключей реестра
- mov [index],0
- loc_enum_keys:
- mov [tmp],200h
- invoke RegEnumKeyEx,[hkResult],[index],szName,tmp,NULL,NULL,NULL,NULL
- or eax,eax
- ; Вложенных ключей больше нет
- jnz loc_done
- ; Сформировать строку вложенного ключа
- invoke lstrcpy,buff,szKey
- invoke lstrcat,buff,slash
- invoke lstrcat,buff,szName
- ; Открыть ключ реестра
- invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,buff,0,KEY_QUERY_VALUE,hkSub
- or eax,eax
- jnz loc_next
- ; DisplayName
- mov [tmp],200h
- invoke RegQueryValueEx,[hkSub],szParam1,0,lpdwDisp,szName,tmp
- cmp eax,ERROR_FILE_NOT_FOUND
- je loc_close
- ; szName -> название программы
- ; DisplayVersion
- mov [tmp],200h
- invoke RegQueryValueEx,[hkSub],szParam2,0,lpdwDisp,szVer,tmp
- cmp eax,ERROR_FILE_NOT_FOUND
- je @f
- ; szVer -> версия программы
- @@:
- ; InstallLocation
- mov [tmp],200h
- invoke RegQueryValueEx,[hkSub],szParam3,0,lpdwDisp,szPath,tmp
- cmp eax,ERROR_FILE_NOT_FOUND
- je @f
- cmp byte [szPath],0
- je @f
- ; szPath -> путь установки
- jmp loc_1
- @@:
- ; InstallLocationEx
- mov [tmp],200h
- invoke RegQueryValueEx,[hkSub],szParam4,0,lpdwDisp,szPath,tmp
- cmp eax,ERROR_FILE_NOT_FOUND
- je @f
- cmp byte [szPath],0
- je @f
- ; szPath -> путь установки
- @@:
- loc_1:
- ; UninstallString
- mov [tmp],200h
- invoke RegQueryValueEx,[hkSub],szParam5,0,lpdwDisp,szPath,tmp
- cmp eax,ERROR_FILE_NOT_FOUND
- je @f
- ; szPath -> строка деинсталляции
- @@:
- loc_close:
- ; Закрыть ключ реестра
- invoke RegCloseKey,[hkSub]
- loc_next:
- ; Следующий ключ
- inc [index]
- jmp loc_enum_keys
- loc_done:
- ; Закрыть ключ реестра
- invoke RegCloseKey,[hkResult]
Хозяйке на заметку. Дата установки из ветки реестра с записями о деинсталляции (параметр InstallDate), в принципе, может быть использована для реализации триала шароварных программ. Немного из другой сказочки, но на всякой случай это тоже стоит упомянуть.
В приложении пример программы с исходным текстом, которая записывает в файл list.txt список установленных приложений с их названиями и версиями, путями установки и строками вызова деинсталлятора.
Просмотров: 1396 | Комментариев: 1
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
==DJ==[ZLO]
(03.11.2021 в 11:02):
В десятке, если приложения установлены из магазина они в этот список не попадают. Впрочем, это совсем другая история...
Добавить комментарий
Заполните форму для добавления комментария