C
Cobra91151May 30, 2017, 4:09 p.m.
Проблема с получением данных об установленных программах
Здравствуйте! Я хочу получить данные программ через реестр, проблема в том что у меня находит 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)); // }Скриншот: Спасибо заранее.
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
AD
- Akiv Doros
- Nov. 12, 2024, 1:58 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
m
- molni99
- Oct. 26, 2024, 11:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
m
- molni99
- Oct. 26, 2024, 11:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Last comments
Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь МаксимовOct. 5, 2024, 5:51 p.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Now discuss on the forum
Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey1Nov. 15, 2024, 5:04 p.m.
NSProjectJune 4, 2022, 1:49 p.m.
IscanderCheNov. 1, 2024, 1:43 a.m.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
Полагаю, что Вы получаете список всех программ, которые когда либо существовали на вашем ПК, но в данный момент часть из них удалена. Могу предложить проверять наличие существующих путей установки и удаления, то есть переменные 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 нет или они не работают.
Даже не знаю тогда ((