C
Cobra91151Мамыр 30, 2017, 4:09 Т.Қ.

Проблема с получением данных об установленных программах

с++, qt, windows-application

Здравствуйте! Я хочу получить данные программ через реестр, проблема в том что у меня находит 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));
// }
Скриншот: Спасибо заранее.

2017-05-29_232847.png
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

33
Evgenii Legotckoi
  • Мамыр 31, 2017, 2:37 Т.Ж.

Полагаю, что Вы получаете список всех программ, которые когда либо существовали на вашем ПК, но в данный момент часть из них удалена. Могу предложить проверять наличие существующих путей установки и удаления, то есть переменные Install Path и Uninstall Path, чтобы отсеять несуществующее ПО. То есть не учитывать то ПО, у которого, например, не найден деинсталлятор по заданном пути. То есть считать, что программа не установлена. Кстати, Установка и Удаление программ тоже иногда содержит несуществующее ПО, если не совсем корректно была произведена деинсталляция. Ну и допустим отсеивать дублирующиеся записи.

Сами же знаете, что реестр со временем превращается в помойку. Тогда возможно и с иконками будет проще работать, если будете предварительно отсеивать несуществующее ПО.

    C
    • Мамыр 31, 2017, 4:40 Т.Ж.

    Да, но как отсеивать эти данные по (Uninstall Path), так как сейчас идет через:

    if (key.contains("DisplayName") && registryKeyLocalMachineX86.value(key).toString() != "") {
                displayName = registryKeyLocalMachineX86.value(key).toString();
                emit appData(programIcon, displayName);
            }
    И оно записывает название программы, можно сделать через 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 но тогда часть установленных программ будет отсеяна.

      Evgenii Legotckoi
      • Мамыр 31, 2017, 5:13 Т.Ж.

      Я имел ввиду, использовать QFile или QDir, чтобы проверить, а есть ли этот деинсталлятор по заданном пути. К тому же, HKEY_CURRENT_USER - это программы текущего пользователя, а HKEY_LOCAL_MACHINE - это программы всего ПК. Здесь уже вопрос к правам и администрированию. Может быть, что всё верно, что правильно показывает такое большое количество записей, поскольку в панели управления может отображаться лишь то, что доступно пользователю.

      Помимо прочего, в установке и удалении программ отображаются лишь программы с зарегистрированным в реестре деинсталлятором. А если деинсталлятор в реестре не зарегистрирован, то и информации там не будет. Поэтому Install Path здесь роли не играет. То есть Вы не сможете всё равно получить полный список всех установленных программ, если в реестре нет записи об их деинсталляторе.

      У QFile Есть статический метод exists . Можете использовать его для проверки существования деинсталлятора. Вам сейчас нужно определить чёткие критерии, какого результата хотите добиться в рамках реестра Windows. Я пока не вижу чего-то более чёткого, чем просто необходимость забрать все программы. Вы пытаетесь получить такой же результат как в Установки и Удаления программ ?

      Что касается сортировки и QStringList, то этого всего лишь проблема подхода с заполнением таблиц, не более того. Можно же использовать и специально написанный класс для хранения данных о записи реестра, которая будет содержать Install Path, DisplayName и т.д. Это может быть даже обычная структура. Просто исключать или добавлять эту структуру в QVector с записями и использовать требуемую Вам обработку.

        C
        • Мамыр 31, 2017, 6:06 Т.Ж.

        Да, я хочу получить почти такой результат как в Установки и Удаления программ. Задачи: 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 Код:

        void Test::setAppData(QList<QIcon> icons, QStringList names, QStringList versions, QStringList publishers, QStringList installLocations, QStringList uninstallLocations)
        {
            qDebug() << "Icons: " << icons.count();
            qDebug() << "Names: " << names.count();
            qDebug() << "Versions: " << versions.count();
            qDebug() << "Publishers: " << publishers.count();
            qDebug() << "Install Locations: " << installLocations.count();
            qDebug() << "Uninstall Locations: " << uninstallLocations.count();
        
            //int i = 0;
            for (QString uninstallLocation : uninstallLocations) {
                //i++;
                //qDebug() << uninstallLocation << " :" << i;
                allApplicationsItem = new QTreeWidgetItem(allApplications);
                allApplicationsItem->setText(0, uninstallLocation);
            }
        }
        
        Теперь нужно отсортировать относительно Uninstall Locations остальные данные.
          C
          • Мамыр 31, 2017, 6:08 Т.Ж.

          Вот скриншот с программы. Еще нужно вывести иконку с названием, версию, разработчика и путь установки.

            C
            • Мамыр 31, 2017, 9:46 Т.Ж.

            Изменил код на:

            void Test::setAppData(QList<QIcon> icons, QStringList names, QStringList versions, QStringList publishers, QStringList installLocations, QStringList uninstallLocations)
            {
                for (int i = 0; i < uninstallLocations.count(); i++) {
                    allApplicationsItem = new QTreeWidgetItem(allApplications);
                    allApplicationsItem->setText(0, names.at(i));
                    //allApplicationsItem->setText(1, versions.at(i));
                    //allApplicationsItem->setText(2, publishers.at(i));
                    //allApplicationsItem->setText(3, installLocations.at(i));
                    allApplicationsItem->setText(4, uninstallLocations.at(i));
                }
            }
            Но название программы не соответствует installLocations (Uninstall Path). Попробую сделать через структуру. А что за специально написанный класс для хранения данных о записи реестра, вы писали? Спасибо.
              C
              • Мамыр 31, 2017, 11:23 Т.Ж.

              Еще вот такой вопрос: создал структуру

              struct AppsData { 
                  QList icons; 
                  QStringList name; 
                  QStringList version; 
                  QStringList publisher; 
                  QStringList installLocation; 
                  QStringList uninstallLocation; 
              };
               и создал обьект класса QVector со структурой QVector dataVector; У меня получает данные с класса Worker и передает эти данные программ через поток в Test класс (главное окно) как QList и остальное как QStringList. А теперь эти данные записать в dataVector или нужно когда emit (передаю данные) уже в dataVector записать и тогда передавать уже?

                C
                • Мамыр 31, 2017, 4:30 Т.Қ.

                Я изменил код на тот что был ранее, все данные выводятся правильно, только проблема с иконками програм. Думаю что структура и вектор здесь только усложнят задачу, а нужно решать вопрос с иконками программ. Вывожу данные так:

                void Test::setAppData(QIcon icon, QString name)
                {
                    allApplicationsItem = new QTreeWidgetItem(allApplications);
                    allApplicationsItem->setIcon(0, icon);
                    allApplicationsItem->setText(0, name);
                }
                
                void Test::setAppVersion(QString version)
                {
                    allApplicationsItem->setText(1, version);
                }
                
                void Test::setAppPublisher(QString publisher)
                {
                    allApplicationsItem->setText(2, publisher);
                }
                
                void Test::setAppInstallLocation(QString installLocation)
                {
                    allApplicationsItem->setText(3, installLocation);
                }
                
                void Test::setAppUninstallLocation(QString uninstallLocation)
                {
                    allApplicationsItem->setText(4, uninstallLocation);
                }
                  Evgenii Legotckoi
                  • Маусым 1, 2017, 2:31 Т.Ж.

                  Структуру реализовали не правильно. Нужно было так сделать:

                  struct AppsData { 
                      QIcon icons; 
                      QString name; 
                      QString version; 
                      QString publisher; 
                      QString installLocation; 
                      QString uninstallLocation; 
                  };

                  И уже этой структурой оперировать в QVector

                  QVector<AppsData> vectorData;

                  Тогда всё станет гораздо проще

                    C
                    • Маусым 1, 2017, 2:46 Т.Ж.

                    Хорошо. Значит теперь нужно

                    QIcon programIcon, QString displayName
                    и т.д записать в эту структуру к примеру
                    AppsData appsData; appsData.icon = programIcon
                    и т.д, тогда записать структуру в
                    QVector vectorData.push_back(appsData);
                    и передать данные
                    emit appsData(vectorData)
                    с класса
                    Worker
                    Test (главное окно).
                      Evgenii Legotckoi
                      • Маусым 1, 2017, 2:52 Т.Ж.

                      Да. Совершенно верно, тогда вы будете оперировать объектом, который содержит полную информацию об одной строке. Тогда можно будет делать сортировку и прочие действия на этими объектами, не беспокоясь, что потеряете один из параметров.

                        C
                        • Маусым 1, 2017, 2:58 Т.Ж.

                        Хорошо. Спасибо. Сейчас буду пробовать, позже напишу.

                          C
                          • Маусым 1, 2017, 3:13 Т.Ж.

                          Теперь проблема с сигналами и слотами, сначала писало что структура не ининциализирована, так как при передаче данные оно хочет видеть

                          appData(QVector data)
                          (это в signals и позже slots), тогда я создал в каждом (Worker и Test) эту структуру в заголовочном файле (Worker.h/Test.h). Но теперь пишет вот:
                           error: C2338: Signal and slot arguments are not compatible.
                           see reference to function template instantiation 'QMetaObject::Connection QObject::connect<void(__cdecl Worker::* )(QVector<Worker::AppsData>),void(__cdecl PCInfo::* )(QVector<PCInfo::AppsData>)>(const Worker *,Func1,const PCInfo *,Func2,Qt::ConnectionType)' being compiled
                          with
                          [
                              Func1=void (__cdecl Worker::* )(QVector<Worker::AppsData>),
                              Func2=void (__cdecl PCInfo::* )(QVector<Test::AppsData>)
                          ]
                          Как это исправить?
                            C
                            • Маусым 1, 2017, 3:15 Т.Ж.
                            Точнее вот эта ошибка:
                            error: C2338: Signal and slot arguments are not compatible.
                             see reference to function template instantiation 'QMetaObject::Connection QObject::connect<void(__cdecl Worker::* )(QVector<Worker::AppsData>),void(__cdecl PCInfo::* )(QVector<PCInfo::AppsData>)>(const Worker *,Func1,const PCInfo *,Func2,Qt::ConnectionType)' being compiled
                            with
                            [
                                Func1=void (__cdecl Worker::* )(QVector<Worker::AppsData>),
                                Func2=void (__cdecl Test::* )(QVector<Test::AppsData>)
                            ]
                              C
                              • Маусым 1, 2017, 3:22 Т.Ж.

                              Как тогда передать сигнал вектора со структурой?

                                C
                                • Маусым 1, 2017, 4:11 Т.Ж.

                                Уже решил проблему с сигналами и слотами. Нужно было инициализировать эту структуру в глобальном классе чтобы она была видна и в Worker и Test.

                                  C
                                  • Маусым 1, 2017, 4:26 Т.Ж.

                                  Почти все. Последний вопрос, как записать эти все данные в

                                  QTreeWidgetItem
                                  в соответствующую колонку?
                                  void Test::setAppData(QVector data)
                                  {
                                      QVectorIterator i(data);
                                  
                                      while (i.hasNext()) {
                                          allApplicationsItem = new QTreeWidgetItem(allApplications);
                                          allApplicationsItem->setText(0, i.next());
                                      }
                                  }
                                  
                                  Такой код не работает.
                                    C
                                    • Маусым 1, 2017, 4:30 Т.Ж.

                                    На вашем сайте не верно форматирует код, должно быть: void Test::setAppData(QVector data)

                                      C
                                      • Маусым 1, 2017, 5:34 Т.Ж.

                                      Теперь знаю как выводить данные структуры через вектор:

                                      void Test::setAppData(QVector data)
                                      {
                                          qDebug() << data.data()->name;
                                      }
                                      
                                      Данный код выводит только 1 значение: "HHD Software Free Hex Editor Neo 6.24".
                                        C
                                        • Маусым 1, 2017, 5:56 Т.Ж.
                                        qDebug() << vectorData.count();
                                        Возвращает только 1 значение, значит я что-то неправильно записываю в структуру.
                                          C
                                          • Маусым 1, 2017, 7:42 Т.Ж.

                                          Здесь что-то не так, цыкл записывает только последнее значение, а нужно все, если сделать через

                                          QString::append()
                                          тогда будет 1 значение со всеми записями. Мне нужно использовать QStringList все-же?
                                            C
                                            • Маусым 1, 2017, 8:20 Т.Ж.

                                            Я установил

                                            dataVector.push_back(appsData);
                                            в цикл, теперь выводит много одинаковых значений.

                                              C
                                              • Маусым 1, 2017, 9:05 Т.Ж.

                                              Я уже сделал так как вы советовали.

                                              if (key.contains("UninstallString") && registryKeyLocalMachineX64.value(key).toString() != "" && !key.contains("QuietUninstallString")) {
                                                    uninstallLocation = registryKeyLocalMachineX64.value(key).toString();
                                                    appsData.uninstallLocation = uninstallLocation;
                                                   dataVector.push_back(appsData);
                                              }
                                              Теперь работает через QVector структуру, но с иконками также. Если выводить только HREY_CURRENT_USER тогда все работает нормально, если подключить HKEY_LOCAL_MACHINE тогда уже все данные перекручивает по всех полях. Я думаю время настало перейти на Win API и пробовать там.

                                                C
                                                • Маусым 1, 2017, 12:35 Т.Қ.

                                                Даже если выводить без иконки или к примеру добавить стандартную на все программы: 

                                                void Test::setAppData(QVector vectorData)
                                                { 
                                                    for (int i = 0; i < vectorData.count(); i++) 
                                                    { 
                                                        allApplicationsItem = new QTreeWidgetItem(allApplications); 
                                                        allApplicationsItem->setIcon(0, vectorData[i].icon); 
                                                        allApplicationsItem->setText(0, vectorData[i].name); 
                                                        allApplicationsItem->setText(1, vectorData[i].version); 
                                                        allApplicationsItem->setText(2, vectorData[i].publisher); 
                                                        allApplicationsItem->setText(3, vectorData[i].installLocation); 
                                                        allApplicationsItem->setText(4, vectorData[i].uninstallLocation); 
                                                    } 
                                                }

                                                Тогда некоторые данные в полях не совпадают. К примеру через QStringList тогда все записывало только была проблема с иконками. А теперь как с иконками так и с данными нет порядка. QVector vectorData это хорошо, но как с ним работать так чтобы все работало.

                                                  Evgenii Legotckoi
                                                  • Маусым 2, 2017, 1:46 Т.Ж.

                                                  Сдаётся мне, что вы просто где-то создаёте эту структуру с данными и не обнуляете её поля, когда добавляете данные, а в QVector добавляете её через копирование. Вот и получается, что там остаются старые данные. Так что, проблема не в структуре и векторе, а в том, где и как Вы с ними работаете.

                                                  Что касается HKEY_LOCAL_MACHINE и HKEY_CURRENT_USER, то вы сверяли результат с установкой и удаление программ? А также в самом реестре смотрели эти записи? Может там реально пусто и ничего нет в реестре. А Вы пытаетесь получить иконки из ничего. К тому же, записи для обоих ключей могут дублироваться.

                                                    C
                                                    • Маусым 2, 2017, 4:43 Т.Ж.

                                                    Хорошо. Я это проверю. Спасибо.

                                                      C
                                                      • Шілде 1, 2017, 11:10 Т.Ж.

                                                      Здравствуйте! Я решил делать по другому, через Win API (Shell):

                                                      Код:
                                                      HRESULT hr = CoInitialize(NULL);
                                                      	if (SUCCEEDED(hr))
                                                      	{
                                                      		LPITEMIDLIST pidlPrograms = NULL;
                                                      		IShellFolder *psfPrograms = NULL;
                                                      		// Installed Apps
                                                      		hr = SHParseDisplayName(TEXT("shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}"), NULL, &pidlPrograms, 0, NULL);
                                                      		if (SUCCEEDED(hr))
                                                      		{
                                                      			IShellFolder* pshDesktop;
                                                      			hr = SHGetDesktopFolder(&pshDesktop);
                                                      			hr = pshDesktop->BindToObject(pidlPrograms, NULL, IID_IShellFolder, (void**)&psfPrograms);
                                                      			if (SUCCEEDED(hr))
                                                      			{
                                                      				IEnumIDList *ppenum = NULL;
                                                      				LPITEMIDLIST pidlChild = NULL;
                                                      				ULONG celtFetched = 0;
                                                      				hr = psfPrograms->EnumObjects(NULL, SHCONTF_ENABLE_ASYNC | SHCONTF_FLATLIST | SHCONTF_FOLDERS | SHCONTF_INCLUDEHIDDEN | SHCONTF_NONFOLDERS, &ppenum);
                                                      				if (SUCCEEDED(hr))
                                                      				{
                                                      					int nX = 0, nY = 0;
                                                      					hr = ppenum->Next(1, &pidlChild, &celtFetched);
                                                      					while (hr = ppenum->Next(1, &pidlChild, &celtFetched) == S_OK && (celtFetched) == 1)
                                                      					{
                                                      						STRRET strFolderName;
                                                      						TCHAR szFolderName[MAX_PATH];
                                                      						if ((psfPrograms->GetDisplayNameOf(pidlChild, SHGDN_INFOLDER, &strFolderName) == S_OK) &&
                                                      							(StrRetToBuf(&strFolderName, pidlChild, szFolderName, MAX_PATH) == S_OK))
                                                      						{
                                                      							SHFILEINFO sfi = { 0 };
                                                      							PIDLIST_ABSOLUTE pidlAbs = NULL;
                                                      							pidlAbs = ILCombine(pidlPrograms, (LPITEMIDLIST)pidlChild);
                                                      							HIMAGELIST hImageList = (HIMAGELIST)(SHGetFileInfo((LPCWSTR)pidlAbs, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_PIDL));
                                                      							if (hImageList)
                                                      							{
                                                      								// draw text + icon just to test
                                                      								int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
                                                      								int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
                                                      								HDC hDC = GetDC(NULL);
                                                      								DrawIconEx(hDC, nX, nY + 18, ImageList_GetIcon(hImageList, sfi.iIcon, ILD_TRANSPARENT), 0, 0, 0, NULL, DI_IMAGE);
                                                      								RECT rect;
                                                      								SetRect(&rect, nX, nY, nX + 400, nY + 32);
                                                      								SetTextColor(hDC, RGB(255, 255, 255));
                                                      								SetBkColor(hDC, RGB(0, 0, 0));
                                                      								DrawText(hDC, szFolderName, -1, &rect, DT_SINGLELINE);
                                                      								nY += 50;
                                                      								if (nY >= nScreenHeight)
                                                      								{
                                                      									nY = 0;
                                                      									nX += 410;
                                                      								}
                                                      								ReleaseDC(NULL, hDC);
                                                      							}
                                                      						}
                                                      					}
                                                      					ppenum->Release();
                                                      				}
                                                      			}
                                                      			psfPrograms->Release();
                                                      		}
                                                      		CoUninitialize();
                                                      	}
                                                      Все работает, только нужно сделать вывод Пути удаления,  и чтобы работало с Win XP.
                                                      Дело в том что нужно изменить ключ 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

                                                      Но какой комбинировать? Можете помочь? Спасибо.

                                                        C
                                                        • Шілде 1, 2017, 11:13 Т.Ж.

                                                        Интересно как это сделать? Так как свойства на путь удаления там нет.

                                                         CComVariant vPublisher;
                                                         hr = psf2->MapColumnToSCID(1, &pscid);
                                                         hr = psf2->GetDetailsEx(pidlChild, &pscid, &vPublisher);

                                                        1 индекс это разрабочик, 4 - версия и т.д. Но нет пути удаления.
                                                          Evgenii Legotckoi
                                                          • Шілде 2, 2017, 2:45 Т.Ж.

                                                          А стандартный ключ удаления программы не подходит?

                                                          HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\название программы
                                                          Если я правильно понимаю, то Shell также использует эти ключи для получения путей программ (Это моё предположение, с этим функционалом WinAPI я не работал)
                                                            C
                                                            • Шілде 2, 2017, 6:53 Т.Ж.

                                                            Но там не все будут пути и также нужно будет отсортировать по названию программ которые получает через Shell. Я думаю они какой-то свой алгоритм используют для определения пути удаления программ. На Win XP мне нужно CLSID ключ для Панели Управления и Установки и Удаления программ. Пока никак не могу найти эти ключи.

                                                              Evgenii Legotckoi
                                                              • Шілде 2, 2017, 9:08 Т.Ж.

                                                              Это поможет?

                                                              Action Center {BB64F8A7-BEE7-4E1A-AB8D-7D8273F7FDB6}
                                                              Add Network Location {D4480A50-BA28-11d1-8E75-00C04FA31A86}
                                                              Administrative Tools {D20EA4E1-3957-11d2-A40B-0C5020524153}
                                                              Advanced User Accounts {7A9D77BD-5403-11d2-8785-2E0420524153}
                                                              Applications {4234d49b-0245-4df3-b780-3893943456e1}
                                                              AutoPlay {9C60DE1E-E5FC-40f4-A487-460851A8D915}
                                                              Backup and Restore {B98A2BEA-7D42-4558-8BD1-832F41BAC6FD}
                                                              Biometric Devices {0142e4d0-fb7a-11dc-ba4a-000ffe7ab428}
                                                              BitLocker Drive Encryption {D9EF8727-CAC2-4e60-809E-86F80A666C91}
                                                              Bluetooth Devices {28803F59-3A75-4058-995F-4EE5503B023C}
                                                              Briefcase {85BBD920-42AO-1069-A2E4-08002B30309D}
                                                              Color Management {B2C761C6-29BC-4f19-9251-E6195265BAF1}
                                                              Command Folder {437ff9c0-a07f-4fa0-af80-84b6c6440a16}
                                                              Common Places FS Folder {d34a6ca6-62c2-4c34-8a7c-14709c1ad938}
                                                              Computer {20d04fe0-3aea-1069-a2d8-08002b30309d}
                                                              Connect To {38A98528-6CBF-4CA9-8DC0-B1E1D10F7B1B}
                                                              Control Panel {5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}
                                                              Control Panel (All Tasks) {ED7BA470-8E54-465E-825C-99712043E01C}
                                                              Control Panel (Category view) {26EE0668-A00A-44D7-9371-BEB064C98683}
                                                              Control Panel (Icons view) {21EC2020-3AEA-1069-A2DD-08002B30309D}
                                                              Credential Manager {1206F5F1-0569-412C-8FEC-3204630DFB70}
                                                              Date and Time {E2E7934B-DCE5-43C4-9576-7FE4F75E7480}
                                                              Default Location {00C6D95F-329C-409a-81D7-C46C66EA7F33}
                                                              Default Programs {17cd9488-1228-4b2f-88ce-4298e93e0966} or {E44E5D18-0652-4508-A4E2-8A090067BCB0}
                                                              delegate folder that appears in Computer {b155bdf8-02f0-451e-9a26-ae317cfd7779}
                                                              Desktop Gadgets {37efd44d-ef8d-41b1-940d-96973a50e9e0}
                                                              Desktop in Favorites {04731B67-D933-450a-90E6-4ACD2E9408FE}
                                                              Device Manager {74246bfc-4c96-11d0-abef-0020af6b0b7a}
                                                              Devices and Printers {A8A91A66-3A7D-4424-8D24-04E180695C7A}
                                                              Display (DPI) {C555438B-3C23-4769-A71F-B6D3D9B6053A}
                                                              Ease of Access Center {D555645E-D4F8-4c29-A827-D93C859C4F2A}
                                                              E-mail (default program) {2559a1f5-21d7-11d4-bdaf-00c04f60b9f0}
                                                              Favorites {323CA680-C24D-4099-B94D-446DD2D7249E}
                                                              Flip 3D {3080F90E-D7AD-11D9-BD98-0000947B0257}
                                                              Folder Options {6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}
                                                              Font Settings {93412589-74D4-4E4E-AD0E-E0CB621440FD}
                                                              Fonts {BD84B380-8CA2-1069-AB1D-08000948534}
                                                              Gadgets {37efd44d-ef8d-41b1-940d-96973a50e9e0}
                                                              Game Controllers {259EF4B1-E6C9-4176-B574-481532C9BCE8}
                                                              Games Explorer {ED228FDF-9EA8-4870-83b1-96b02CFE0D52}
                                                              Get Programs {15eae92e-f17a-4431-9f28-805e482dafd4}
                                                              Getting Started {CB1B7F8C-C50A-4176-B604-9E24DEE8D4D1}
                                                              Help and Support {2559a1f1-21d7-11d4-bdaf-00c04f60b9f0}
                                                              HomeGroup {67CA7650-96E6-4FDD-BB43-A8E774F73A57} or {B4FB3F98-C1EA-428d-A78A-D1F5659CBA93}
                                                              Indexing Options {87D66A43-7B11-4A28-9811-C86EE395ACF7}
                                                              Infared {A0275511-0E86-4ECA-97C2-ECD8F1221D08}
                                                              Installed Updates {d450a8a1-9568-45c7-9c0e-b4f9fb4537bd}
                                                              Internet Explorer {871C5380-42A0-1069-A2EA-08002B30309D}
                                                              Internet Options {A3DD4F92-658A-410F-84FD-6FBBBEF2FFFE}
                                                              iSCCI Initiator {A304259D-52B8-4526-8B1A-A1D6CECC8243}
                                                              Keyboard Properties {725BE8F7-668E-4C7B-8F90-46BDB0936430}
                                                              Libraries {031E4825-7B94-4dc3-B131-E946B44C8DD5}
                                                              Location {00C6D95F-329C-409a-81D7-C46C66EA7F33}
                                                              Location and Other Sensors {E9950154-C418-419e-A90A-20C5287AE24B}
                                                              Manage Wireless Networks {1fa9085f-25a2-489b-85d4-86326eedcd87}
                                                              Mobility Center {5ea4f148-308c-46d7-98a9-49041b1dd468}
                                                              Mouse Properties {6C8EEC18-8D75-41B2-A177-8831D59D2D50}
                                                              My Documents {450d8fba-ad25-11d0-98a8-0800361b1103}
                                                              Network {F02C1A0D-BE21-4350-88B0-7367FC96EF3C}
                                                              Network and Sharing Center 8E908FC9-BECC-40f6-915B-F4CA0E70D03D}
                                                              Network Center Notification area pop-up {38A98528-6CBF-4CA9-8DC0-B1E1D10F7B1B}
                                                              Network Connections {7007ACC7-3202-11D1-AAD2-00805FC1270E} or {992CFFA0-F557-101A-88EC-00DD010CCC48}
                                                              Network Map {E7DE9B1A-7533-4556-9484-B26FB486475E}
                                                              Network Neighborhood {208D2C60-3AEA-1069-A2D7-O8002B30309D}
                                                              Network (WorkGroup) Places {208D2C60-3AEA-1069-A2D7-08002B30309D}
                                                              Notification Area Icons {05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}
                                                              NVIDIA Control Panel (if driver installed) {0bbca823-e77d-419e-9a44-5adec2c8eeb0}
                                                              Offline Files Folder {AFDB1F70-2A4C-11d2-9039-00C04F8EEB3E}
                                                              Parental Controls {96AE8D84-A250-4520-95A5-A47A7E3C548B}
                                                              Pen and Touch {F82DF8F7-8B9F-442E-A48C-818EA735FF9B}
                                                              People Near Me {5224F545-A443-4859-BA23-7B5A95BDC8EF}
                                                              Performance Information and Tools {78F3955E-3B90-4184-BD14-5397C15F1EFC}
                                                              Personalization {ED834ED6-4B5A-4bfe-8F11-A626DCB6A921}
                                                              Phone & Modem Location Information {40419485-C444-4567-851A-2DD7BFA1684D}
                                                              Portable Devices {35786D3C-B075-49b9-88DD-029876E11C01}
                                                              Power Options {025A5937-A6BE-4686-A844-36FE4BEC8B6D}
                                                              Previous Versions Results Folder {f8c2ab3b-17bc-41da-9758-339d7dbf2d88}
                                                              printhood delegate folder {ed50fc29-b964-48a9-afb3-15ebb9b97f36}
                                                              Printers {2227A280-3AEA-1069-A2DE-08002B30309D} or {863aa9fd-42df-457b-8e4d-0de1b8015c60}
                                                              Programs and Features {7b81be6a-ce2b-4676-a29e-eb907a5126c5}
                                                              Public folder {4336a54d-038b-4685-ab02-99bb52d3fb8b}
                                                              Recent Places {22877a6d-37a1-461a-91b0-dbda5aaebc99}
                                                              Recovery (System Restore) {9FE63AFD-59CF-4419-9775-ABCC3849F861}
                                                              Recycle Bin {645FF040-5081-101B-9F08-00AA002F954E}
                                                              Region and Language {62d8ed13-c9d0-4ce8-a914-47dd628fb1b0}
                                                              RemoteApp and Desktop Connections {241D7C96-F8BF-4F85-B01F-E2B043341A4B}
                                                              Run {2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}
                                                              Search {2559a1f0-21d7-11d4-bdaf-00c04f60b9f0}
                                                              Search Results {9343812e-1c37-4a49-a12e-4b2d810d956b}
                                                              Set Program Access and Defaults {2559a1f7-21d7-11d4-bdaf-00c04f60b9f0}
                                                              Show Desktop {3080F90D-D7AD-11D9-BD98-0000947B0257}
                                                              Sound {F2DDFC82-8F12-4CDD-B7DC-D4FE1425AA4D}
                                                              Speech Recognition {58E3C745-D971-4081-9034-86E34B30836A}
                                                              Sync Center {9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}
                                                              Sync Setup Folder {2E9E59C0-B437-4981-A647-9C34B9B90891}
                                                              System {BB06C0E4-D293-4f75-8A90-CB05B6477EEE}
                                                              System Icons {05d7b0f4-2121-4eff-bf6b-ed3f69b894d9} \SystemIcons
                                                              Tablet PC Settings {80F3F1D5-FECA-45F3-BC32-752C152E456E}
                                                              Taskbar and Start Menu {0DF44EAA-FF21-4412-828E-260A8728E7F1}
                                                              Text to Speech {D17D1D6D-CC3F-4815-8FE3-607E7D5D10B3}
                                                              Time and Date {E2E7934B-DCE5-43C4-9576-7FE4F75E7480}
                                                              Troubleshooting {C58C4893-3BE0-4B45-ABB5-A63E4B8C8651}
                                                              User Accounts {60632754-c523-4b62-b45c-4172da012619}
                                                              User Folder {59031a47-3f72-44a7-89c5-5595fe6b30ee}
                                                              User Pinned {1f3427c8-5c10-4210-aa03-2ee45287d668}
                                                              Web Browser (default) {871C5380-42A0-1069-A2EA-08002B30309D}
                                                              Windows Anytime Upgrade {BE122A0E-4503-11DA-8BDE-F66BAD1E3F3A}
                                                              Windows Cardspace {78CB147A-98EA-4AA6-B0DF-C8681F69341C}
                                                              Windows Defender {D8559EB9-20C0-410E-BEDA-7ED416AECC2A}
                                                              Windows Features {67718415-c450-4f3c-bf8a-b487642dc39b}
                                                              WEI {78F3955E-3B90-4184-BD14-5397C15F1EFC}
                                                              Windows Firewall {4026492F-2F69-46B8-B9BF-5654FC07E423}
                                                              Windows Mobility Center {5ea4f148-308c-46d7-98a9-49041b1dd468}
                                                              Windows SideShow {E95A4861-D57A-4be1-AD0F-35267E261739}
                                                              Windows Update {36eef7db-88ad-4e81-ad49-0e313f0c35f8}
                                                                C
                                                                • Шілде 2, 2017, 10:12 Т.Ж.

                                                                Да, я знаю об этих ключах. Но на Панель Управления на Win XP нет или они не работают.

                                                                  Evgenii Legotckoi
                                                                  • Шілде 2, 2017, 10:17 Т.Ж.

                                                                  Даже не знаю тогда ((

                                                                    Пікірлер

                                                                    Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                                                    Кіріңіз немесе Тіркеліңіз
                                                                    OI
                                                                    • Ora Iro
                                                                    • Жел. 24, 2024, 6:38 Т.Ж.

                                                                    C++ - Тест 001. Первая программа и типы данных

                                                                    • Нәтиже:40ұпай,
                                                                    • Бағалау ұпайлары-8
                                                                    AD

                                                                    C++ - Тест 004. Указатели, Массивы и Циклы

                                                                    • Нәтиже:50ұпай,
                                                                    • Бағалау ұпайлары-4
                                                                    m
                                                                    • molni99
                                                                    • Қаз. 26, 2024, 1:37 Т.Ж.

                                                                    C++ - Тест 004. Указатели, Массивы и Циклы

                                                                    • Нәтиже:80ұпай,
                                                                    • Бағалау ұпайлары4
                                                                    Соңғы пікірлер
                                                                    ИМ
                                                                    Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                                                                    Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                                                    Evgenii Legotckoi
                                                                    Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                                                                    Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                                                    A
                                                                    ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                                                                    Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                                                    ИМ
                                                                    Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                                                                    Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                                                    d
                                                                    dblas5Шілде 5, 2024, 11:02 Т.Ж.
                                                                    QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                                    Енді форумда талқылаңыз
                                                                    Evgenii Legotckoi
                                                                    Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                                                                    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                                                    t
                                                                    tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                                                                    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                                                    NSProject
                                                                    NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                                                                    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                                                    9
                                                                    9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
                                                                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                                                    Бізді әлеуметтік желілерде бақылаңыз