Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 11
1

Узнать установлена ли программа на компьютере

07.08.2014, 22:06. Показов 5482. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проверить установлена ли программа на компьютере?
Желательно через реестр
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2014, 22:06
Ответы с готовыми решениями:

Как узнать установлена ли программа на компьютере?
Ребята подскажите хороший способ, как узнать существует ли программа на компьютере. Вот я например...

Программа не может быть запущена, т.к. на Вашем компьютере установлена программа-эмулятор
При запуске лицензионной детской игровой программы выскакивает сообщение: Программа не может быть...

Можно ли узнать когда установлена программа
На планшет, то есть точную дату и время?

Узнать папку в которую установлена программа
В Delphi 7 было ExtractFilePath(Application.ExeName) , в Delphi XE5 нет такого. Какой другой способ...

14
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
08.08.2014, 06:59 2
Работа с реестром в C++ Builder
0
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 11
08.08.2014, 14:44  [ТС] 3
Вот здесь Работа с реестром в C++ Builder нет то что нужно
0
85 / 85 / 33
Регистрация: 21.09.2013
Сообщений: 339
08.08.2014, 15:25 4
SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\
Тут всё что есть, но тебе придётся перебирать папочки и искать в ключах, то что тебе надо. Так как имена папок разные
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
08.08.2014, 18:40 5
Какая программа, что она делает при установке?
Если это правильная программа - то есть не мусорящая в реестре или служебных каталогах ОС - то только перебором по диску... И то, если ей имя не поменяли.
Если это стандартно-мусорящая в реестре - то ищи там.
Но ты должен знать, что и где она там пишет.
0
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 11
08.08.2014, 20:41  [ТС] 6
Программа: Steam
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
09.08.2014, 06:17 7
Предлагаю следующий вариант:
Как сказал DeadHipo, все установленные программы лежат тут: SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\. Единственное, что надо учесть это то, что такой ключ присутствует как в разделе HKEY_LOCAL_MACHINE (установлено для всех пользователей), так и в разделе HKEY_CURRENT_USER (для конкретного пользователя, зашедшего в данный момент в систему). Программа ищет все значения в этих ветках реестра и выводит их все в Мемо (просто для наглядности, от Мемо можно в любой момент избавиться). После этого проводится поиск конкретной программы, которую пользователь указывает в Едит1.
Плохо то, что этот метод не дает 100% уверенности, что программа действительно установлена. Либо она есть, но как указал krv, она не мусорит в реестре, либо ее нет, но запись в реестре осталась (пользователь некорректно ее удалил и т.д.). Так что тут есть что дорабатывать... Если есть желание - вперед !!!

*.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "registry.hpp"
#include "Unit6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm6 *Form6;
 
TStringList *All = new TStringList;
 
//---------------------------------------------------------------------------
__fastcall TForm6::TForm6(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button1Click(TObject *Sender)
{
  bool ProgrammInstalled = false;
  All->Add("Раздел All Users:");
  FindReg(HKEY_LOCAL_MACHINE);
  All->Add("***************************************");
  All->Add("Раздел Current User:");
  All->Add("=============================");
  FindReg(HKEY_CURRENT_USER);
 
  TStringList *Temp = new TStringList;
  for(int i = 0; i < All->Count; i++)
   if(Temp->IndexOf(All->Strings[i]) == -1) Temp->Add(All->Strings[i]);
  Memo1->Text = Temp->Text;
  delete Temp;
  for(int i = 0; i < Memo1->Lines->Count; i++)
   if(Memo1->Lines->Strings[i].Trim() == Edit1->Text.Trim())
     {
       ProgrammInstalled = true;
       break;
     }
   if(ProgrammInstalled)
    ShowMessage("Программа " + Edit1->Text + " скорее всего установлена");
   else ShowMessage("Программа " + Edit1->Text + " не установлена");
}
//---------------------------------------------------------------------------
void __fastcall TForm6::FindReg(HKEY rKey)
{
  String Path, Values;
  TRegistry *reg = new TRegistry();
  reg->RootKey = rKey;
  Path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\";
  TStringList *l = new TStringList;
  reg->OpenKey(Path, false);
  reg->GetKeyNames(l);
  for(int i = 0; i < l->Count; i++)
   {
     String SubPath = Path + l->Strings[i];
     reg->OpenKey(SubPath, false);
     if(reg->ValueExists("DisplayName"))
      Values = reg->ReadString("DisplayName");
     All->Add(Values);
     reg->CloseKey();
   }
  delete l;
  delete reg;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::FormClose(TObject *Sender, TCloseAction &Action)
{
  delete All;
}
//---------------------------------------------------------------------------

*.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef Unit6H
#define Unit6H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm6 : public TForm
{
__published:    // IDE-managed Components
    TMemo *Memo1;
    TButton *Button1;
    TEdit *Edit1;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:    // User declarations
    void __fastcall FindReg(HKEY rKey);
public:     // User declarations
    __fastcall TForm6(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm6 *Form6;
//---------------------------------------------------------------------------
#endif
Миниатюры
Узнать установлена ли программа на компьютере  
1
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
09.08.2014, 15:26 8
Цитата Сообщение от D1973 Посмотреть сообщение
Плохо то, что этот метод не дает 100% уверенности, что программа действительно установлена. Либо она есть, но как указал krv, она не мусорит в реестре, либо ее нет, но запись в реестре осталась (пользователь некорректно ее удалил и т.д.).

Не по теме:

Получается, если программа не мусорит в реестре, то это тоже самое, что просто скопировать программу в любую папку. Правильно ли будет называть ее "установленной"?
Для меня программа установлена если она отображается в панели управления в программах

0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
09.08.2014, 18:37 9
Цитата Сообщение от _Dimon_ Посмотреть сообщение
Для меня программа установлена если она отображается в панели управления в программах

Не по теме:

_Dimon_, все это так... Но вот где мой сын берет такие программы, которые есть в ПУСК->Все программы, но в панели управления (в Удалении программ, конкретно) их нет. Качает что-то с сети не читая, они и лепятся. И в реестре они не находятся.
Как в том фильме:
" - Видишь суслика?
- Нет.
- И я не вижу. А он есть!"

0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
11.08.2014, 11:48 10

Не по теме:

Нда... И чего это я считаю установленная === есть на компе
Может старые привычки времен отсутствия винды сказываются? :)


А со стимом - проще.
Посмотри где он лежит в реестре, и проверяй..
Далее, найдя в реестре - проверь не удалена ли руками "неправильно", то бишь присутствует в том месте куда ссылается реестр.
В общем D1973 написал хороший вариант.
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
11.08.2014, 13:27 11
Перед установкой снимать полный дамп всей системы: реестр, системный диск (дерево заголовков файлов и размер). И после установки сверять что пошевелилось, что где прибавилось/изменилось.
Вариант конечно в лоб и три месяца, но надежнее топора еще ничего не придумали.
0
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 11
11.08.2014, 14:43  [ТС] 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
BOOL DumpMZ(LPVOID lpBase, TCHAR *lpFName)
  {
    // проверяем что можем читать MZ-заголовок и указатель на имя не пустой
    if (IsBadReadPtr(lpBase, sizeof(IMAGE_DOS_HEADER)) || lpFName == NULL)
    return FALSE;
 
    // проверяем сигнатуру
    PIMAGE_DOS_HEADER lpDosHeader = (PIMAGE_DOS_HEADER)lpBase;
    if (lpDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
      return FALSE;
 
    PIMAGE_NT_HEADERS lpNtHeaders = MAKE_PTR(PIMAGE_NT_HEADERS, lpBase, lpDosHeader->e_lfanew);
 
    // проверяем что можем прочесть PE-заголовок и сигнатуру
    if ((IsBadReadPtr(lpNtHeaders, sizeof(IMAGE_NT_HEADERS))) || (lpNtHeaders->Signature != IMAGE_NT_SIGNATURE))
      return FALSE;
 
    HANDLE hFile = CreateFile(lpFName, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL ,NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
      return FALSE;
    }
 
    DWORD nNumWr = 0;
    // здесь лучше писать в файл посекционно, проверяя привилегии доступа к ним
    WriteFile(hFile, lpBase, lpNtHeaders->OptionalHeader.SizeOfImage, &nNumWr, NULL);
    CloseHandle(hFile);
    return TRUE;
  }
Добавлено через 2 минуты
dump сняли,а как проверку сделать ?

Добавлено через 2 минуты
Точно знаю куда устанавливается программа по умолчанию (путь не меняю)
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
11.08.2014, 14:45 13
Цитата Сообщение от Wanelandar Посмотреть сообщение
как проверку сделать ?
Вторым.
0
D1973
11.08.2014, 16:40
  #14

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Перед установкой снимать полный дамп всей системы: реестр, системный диск (дерево заголовков файлов и размер...)
Принцип программы Ashampoo Uninstaller и иже с ними... Еще и перехват делать, чтобы при запуске программ типа setup.exe, install*.exe, *.msi сначала запустилась наша прога, дамп сняла, а потом установщику управление передала до окончания его работы. Потом - следующий дамп, сравнение, и результат в какой-то лог.

0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
11.08.2014, 18:12 15
Цитата Сообщение от Wanelandar Посмотреть сообщение
dump сняли
Да уж... дамп распакованного в оперативке PE - это просто необходимо для данной задачи...
0
11.08.2014, 18:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2014, 18:12
Помогаю со студенческими работами здесь

Как проверить какая оперативная память установлена на компьютере?
Помогите узнать какой прогой или другим способом проверить какая оператива у меня стоит.

Как загрузиться с флешки, если на компьютере установлена Windows 8?
Ноут toshiba p855-dss Не могу загрузиться с флешки. Boot speed - normal (not fast) secure boot -...

Как под ms-dos 6.22 определить, какая именно установлена микросхема UART в компьютере?
Микросхемы UART: 8250 - буфер 1 байт 16450 - буфер 8 байт 16550 - буфер 16 байт 16650 - буфер...

Как узнать какая установлена видеокарта?
Короче у одноклассника такая фигня: он переустановил винд, но не знает, какая у него видеокарта, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru