C
Cobra9115130 мая 2017 г. 16:09
Проблема с получением данных об установленных программах
Здравствуйте! Я хочу получить данные программ через реестр, проблема в том что у меня находит 900 записей, а если проверить через Панель Управления (Установка и удаление программ) то только 213. Я пробовал получать данные через
QSettingsи также через Win API. Я хочу записать эти данные в
QTreeWidgetItem (QTreeWidget)Вывести нужно списком - иконку/название/версию/разработчика/путь установки и удаления программ Код Qt
QStringList allLocalMachineX86Keys; QString displayIcon; QString iconFile; QIcon programIcon; QStringList displayIconSplitted; QString iconSplittedData; QFileIconProvider fileIconProvider; QString displayName; QSettings registryKeyLocalMachineX86("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", QSettings::NativeFormat); allLocalMachineX86Keys = registryKeyLocalMachineX86.allKeys(); for (QString key : allLocalMachineX86Keys) { if (!key.isEmpty()) { if (key.contains("DisplayIcon")) { displayIcon = registryKeyLocalMachineX86.value(key).toString(); if (displayIcon.contains("\"")) { displayIconSplitted = displayIcon.split("\""); iconSplittedData = displayIconSplitted.value(displayIconSplitted.length() - 2); iconFile = iconSplittedData; } else if (displayIcon.contains(",")) { displayIconSplitted = displayIcon.split(","); iconSplittedData = displayIconSplitted.value(displayIconSplitted.length() - 2); iconFile = iconSplittedData; } else { iconFile = displayIcon; } if (iconFile.contains(".ico")) { programIcon = QIcon(iconFile); } else { QFileInfo fileInfo(iconFile); programIcon = fileIconProvider.icon(fileInfo); } } else { programIcon = QtWin::fromHICON(LoadIcon(NULL, IDI_APPLICATION)); } if (key.contains("DisplayName") && registryKeyLocalMachineX86.value(key).toString() != "") { displayName = registryKeyLocalMachineX86.value(key).toString(); emit appData(programIcon, displayName); } } }Если закоментировать этот код, тогда некоторые иконки программ или пустые или не от той программы:
// } else { // programIcon = QtWin::fromHICON(LoadIcon(NULL, IDI_APPLICATION)); // }Скриншот: Спасибо заранее.
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD
- Akiv Doros
- 11 ноября 2024 г. 23:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50баллов,
- Очки рейтинга-4
m
- molni99
- 26 октября 2024 г. 9:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80баллов,
- Очки рейтинга4
m
- molni99
- 26 октября 2024 г. 9:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20баллов,
- Очки рейтинга-10
Последние комментарии
Как написать игру на Qt - Урок 3. Взаимодействие с другими объектами what is priligy tablets What happens during the LASIK surgery process
Использование переменных объявленных в CMakeLists.txt внутри C++ файлов where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
Сейчас обсуждают на форуме
добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
IscanderChe31 октября 2024 г. 23:43
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3 октября 2024 г. 12:05
Полагаю, что Вы получаете список всех программ, которые когда либо существовали на вашем ПК, но в данный момент часть из них удалена. Могу предложить проверять наличие существующих путей установки и удаления, то есть переменные Install Path и Uninstall Path, чтобы отсеять несуществующее ПО. То есть не учитывать то ПО, у которого, например, не найден деинсталлятор по заданном пути. То есть считать, что программа не установлена. Кстати, Установка и Удаление программ тоже иногда содержит несуществующее ПО, если не совсем корректно была произведена деинсталляция. Ну и допустим отсеивать дублирующиеся записи.
Сами же знаете, что реестр со временем превращается в помойку. Тогда возможно и с иконками будет проще работать, если будете предварительно отсеивать несуществующее ПО.
Да, но как отсеивать эти данные по (Uninstall Path), так как сейчас идет через:
И оно записывает название программы, можно сделать через QStringList все записи в массив и тогда циклом сортировать по Uninstall Path, только не будет сходится по Install Path и будет сбой программы или не соотвествовать Install Path к программе, так как Install Path не у всех программ есть, но эти программы определяются в Панели Управления. Вот к примеру данные с "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" записывает хорошо, только проблема с "HKEY_LOCAL_MACHINE" и "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node". Есть вариант сделать проверку по Install Path и Uninstall Path но тогда часть установленных программ будет отсеяна.Я имел ввиду, использовать QFile или QDir, чтобы проверить, а есть ли этот деинсталлятор по заданном пути. К тому же, HKEY_CURRENT_USER - это программы текущего пользователя, а HKEY_LOCAL_MACHINE - это программы всего ПК. Здесь уже вопрос к правам и администрированию. Может быть, что всё верно, что правильно показывает такое большое количество записей, поскольку в панели управления может отображаться лишь то, что доступно пользователю.
Помимо прочего, в установке и удалении программ отображаются лишь программы с зарегистрированным в реестре деинсталлятором. А если деинсталлятор в реестре не зарегистрирован, то и информации там не будет. Поэтому Install Path здесь роли не играет. То есть Вы не сможете всё равно получить полный список всех установленных программ, если в реестре нет записи об их деинсталляторе.
У QFile Есть статический метод exists . Можете использовать его для проверки существования деинсталлятора. Вам сейчас нужно определить чёткие критерии, какого результата хотите добиться в рамках реестра Windows. Я пока не вижу чего-то более чёткого, чем просто необходимость забрать все программы. Вы пытаетесь получить такой же результат как в Установки и Удаления программ ?
Что касается сортировки и QStringList, то этого всего лишь проблема подхода с заполнением таблиц, не более того. Можно же использовать и специально написанный класс для хранения данных о записи реестра, которая будет содержать Install Path, DisplayName и т.д. Это может быть даже обычная структура. Просто исключать или добавлять эту структуру в QVector с записями и использовать требуемую Вам обработку.
Да, я хочу получить почти такой результат как в Установки и Удаления программ. Задачи: 1. Вывести такое количество данных как в Установки и Удаления программ 2. Вывести нужно списком - иконку/название/версию/разработчика/путь установки и удаления программ А зачем проверять путь деинсталлятора через QFile::exists если нужно только список вывести без функционала удаления? Я переписал код на QStringList. Вот количество всех данных со всех веток реестра - HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE/HKEY_LOCAL_MACHINE (x64) Icons: 170 Names: 914 Versions: 904 Publishers: 906 Install Locations: 848 Uninstall Locations: 875 Код:
Теперь нужно отсортировать относительно Uninstall Locations остальные данные.Вот скриншот с программы. Еще нужно вывести иконку с названием, версию, разработчика и путь установки.
Изменил код на:
Но название программы не соответствует installLocations (Uninstall Path). Попробую сделать через структуру. А что за специально написанный класс для хранения данных о записи реестра, вы писали? Спасибо.Еще вот такой вопрос: создал структуру
Я изменил код на тот что был ранее, все данные выводятся правильно, только проблема с иконками програм. Думаю что структура и вектор здесь только усложнят задачу, а нужно решать вопрос с иконками программ. Вывожу данные так:
Структуру реализовали не правильно. Нужно было так сделать:
И уже этой структурой оперировать в QVector
Тогда всё станет гораздо проще
Хорошо. Значит теперь нужно
и т.д записать в эту структуру к примеру и т.д, тогда записать структуру в и передать данные с класса Test (главное окно).Да. Совершенно верно, тогда вы будете оперировать объектом, который содержит полную информацию об одной строке. Тогда можно будет делать сортировку и прочие действия на этими объектами, не беспокоясь, что потеряете один из параметров.
Хорошо. Спасибо. Сейчас буду пробовать, позже напишу.
Теперь проблема с сигналами и слотами, сначала писало что структура не ининциализирована, так как при передаче данные оно хочет видеть
(это в signals и позже slots), тогда я создал в каждом (Worker и Test) эту структуру в заголовочном файле (Worker.h/Test.h). Но теперь пишет вот: Как это исправить?Как тогда передать сигнал вектора со структурой?
Уже решил проблему с сигналами и слотами. Нужно было инициализировать эту структуру в глобальном классе чтобы она была видна и в Worker и Test.
Почти все. Последний вопрос, как записать эти все данные в
в соответствующую колонку? Такой код не работает.На вашем сайте не верно форматирует код, должно быть: void Test::setAppData(QVector
data)
Теперь знаю как выводить данные структуры через вектор:
Данный код выводит только 1 значение: "HHD Software Free Hex Editor Neo 6.24".Здесь что-то не так, цыкл записывает только последнее значение, а нужно все, если сделать через
тогда будет 1 значение со всеми записями. Мне нужно использовать QStringList все-же?Я установил
в цикл, теперь выводит много одинаковых значений.Я уже сделал так как вы советовали.
Теперь работает через QVector структуру, но с иконками также. Если выводить только HREY_CURRENT_USER тогда все работает нормально, если подключить HKEY_LOCAL_MACHINE тогда уже все данные перекручивает по всех полях. Я думаю время настало перейти на Win API и пробовать там.Даже если выводить без иконки или к примеру добавить стандартную на все программы:
Сдаётся мне, что вы просто где-то создаёте эту структуру с данными и не обнуляете её поля, когда добавляете данные, а в QVector добавляете её через копирование. Вот и получается, что там остаются старые данные. Так что, проблема не в структуре и векторе, а в том, где и как Вы с ними работаете.
Что касается HKEY_LOCAL_MACHINE и HKEY_CURRENT_USER, то вы сверяли результат с установкой и удаление программ? А также в самом реестре смотрели эти записи? Может там реально пусто и ничего нет в реестре. А Вы пытаетесь получить иконки из ничего. К тому же, записи для обоих ключей могут дублироваться.
Хорошо. Я это проверю. Спасибо.
Здравствуйте! Я решил делать по другому, через Win API (Shell):
Дело в том что нужно изменить ключ Shell в этой функции - (SHParseDisplayName(TEXT("shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}"), NULL, &pidlPrograms, 0, NULL);).
Вот некоторые ключи реестра в Win XP :
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\CLSID:
{0B124F8F-91F0-11D1-B8B5-006008059382} | Data - Installed Apps Enumerator{1BC972D6-555C-4FF7-BE2C-C584021A0A6A} | Data - Software installation
{317E92FC-1679-46FD-A0B5-F08914DD8623} | Data - InstallationAgent Class
{BACF5C8A-A3C7-11D1-A760-00C04FB9603F} | Data - Software installation
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\Add-Remove_Programs | Name - Add/Remove Programs
Но какой комбинировать? Можете помочь? Спасибо.
Интересно как это сделать? Так как свойства на путь удаления там нет.
1 индекс это разрабочик, 4 - версия и т.д. Но нет пути удаления.
А стандартный ключ удаления программы не подходит?
Но там не все будут пути и также нужно будет отсортировать по названию программ которые получает через Shell. Я думаю они какой-то свой алгоритм используют для определения пути удаления программ. На Win XP мне нужно CLSID ключ для Панели Управления и Установки и Удаления программ. Пока никак не могу найти эти ключи.
Это поможет?
Да, я знаю об этих ключах. Но на Панель Управления на Win XP нет или они не работают.
Даже не знаю тогда ((