Сделай сам на Delphi: Установка и удаление программ

Скачать программу i (исходники на Delphi + exe)

    В Панели управления Windows находится апплет «Установка и удаление программ». Название говорит само за себя: с помощью этого апплета мы удаляем и устанавливаем программы. Давайте посмотрим, как он работает. При загрузке апплет читает все ключи из раздела реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall (именно в этот раздел прописываются сведения об разинсталлировании программ). Из каждого ключа читается параметр DisplayName (для системных приложений – QuietDisplayName) и отображается его значение. Если пользователь нажал «Добавить/удалить…», то из параметра UninstallString считывается и выполняется командная строка.

     А теперь реализуем нечто подобное в Delphi, но с некоторыми отличиями: добавим возможность удаления сведений о программе из реестра (если она была удалена «вручную») и удаления компонентов Windows (в «Удаление и установка программ» для этого нужно перейти на закладку «Установка Windows»).

    Создайте новый проект и разместите на форме три кнопки (TButton) и ListBox: TListBox как показано на рисунке 1:

Установка и удаление программ (Delphi)

    В разделе Var несколько глобальных переменных:

var
  Reg: TRegistry; //для работы с реестром
  PathList: TStrings; //командные строки
  DirList: TStrings; //"отфильтрованные" ключи реестра

Для события формы OnShow запишите процедуру:
procedure TForm1.FormShow(Sender: TObject);
var
  i: Integer;
  //список ключей раздела /Uninstall
  StrList: TStrings;
  a, b: String;
begin
  //создаем объекты для хранения строк
  StrList := TStringList.Create;
  //очищаем ListBox
  ListBox1.Clear;
  //создаем объект для работы с реестром
  reg := TRegistry.Create;
  //будем работать в разделе реестра HKEY_LOCAL_MACHINE
  reg.RootKey := Windows.HKEY_LOCAL_MACHINE;
  //открываем нужный ключ реестра
  reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Uninstall', False);
  //получаем все подразделы этого ключа
  reg.GetKeyNames(StrList); 
  for i := 0 to StrList.Count - 1 do
  begin
    reg.CloseKey;
    //перебираем все подразделы
    reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Uninstall\'+strlist[i], False);
    //читаем из каждого раздела параметр DisplayName
    a := reg.ReadString('DisplayName');
    //если а - пустая строка, то читаем параметр QuietDisplayName
    if (a = '') then
      a := reg.ReadString('QuietDisplayName');
    //если a снова пуста, то записываем в нее имя подраздела
    if (a = '') then
      a := StrList[i];
    //читаем командную строку для запуска Uninstall
    b := reg.ReadString('UninstallString');
    //если b - пустая строка, то читаем параметр QuietUninstallString
    if (b = '') then
      b := reg.ReadString('QuietUninstallString');
    //если строка b не пустая, то добавляем параметры в списки: имя ключа, название программы, командная строка
    if (b <> '') then
    begin
      ListBox1.Items.Add(a);
      PathList.Add(b);
      DirList.Add(StrList[i]);
    end;
  end;
 //уничтожаем объект reg
 reg.Free;
end;

При показе формы в ListBox’е отобразятся доступные для удаления\установки программы. Теперь для кнопки «Удалить программу» запишите процедуру для события OnClick:

procedure TForm1.Button1Click(Sender: TObject);
var
 si: TStartupInfo;
 p: TProcessinformation;
 //командная строка
 exe: String;
begin
  //если в ListBox'e выделена строка, то продолжаем
  if (ListBox1.ItemIndex = -1) then
    exit;
  //получаем командную строку для выбранного элемента
  exe := PathList.Strings[ListBox1.ItemIndex];
  //сворачиваем окно нашей программы, запускаем командную строку,
  //дожидаемся завершения удаления\установки приложения и восстанавливаем окно нашей программы
  FillChar( Si, SizeOf(Si), 0);
  with Si do
  begin
    cb := SizeOf(Si);
    dwFlags := startf_UseShowWindow;
    wShowWindow := 4;
  end;
  Application.Minimize;
  Createprocess(nil,pchar(copy(exe, pos(';',exe)+1, length(exe))), nil, nil, false,
                Create_default_error_mode, nil, nil, si, p);
  Waitforsingleobject(p.hProcess, infinite);
  Application.Restore;
  //обновляем данные об установке\удалении программ
  Form1.OnShow(Self);
end;

Событие OnClick кнопки «Удалить из списка»:
procedure TForm1.Button2Click(Sender: TObject);
var
  Dir: String; //имя ключа
begin
  //если в ListBox'e выбран какой-нибудь элемент, то продолжаем
  if (ListBox1.ItemIndex = -1) then
    exit;
  //получаем имя ключа, который нужно удалить
  Dir := DirList[ListBox1.ItemIndex];
  //удаляем нужный ключ
  reg := TRegistry.Create;
  reg.RootKey := Windows.HKEY_LOCAL_MACHINE;
  reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Uninstall', False);
  reg.DeleteKey(Dir);
  reg.Free;
  //удаляем из ListBox'a выбранный элемент
  ListBox1.Items.Delete(ListBox1.ItemIndex);
end;

Основная часть на этом завершена. Теперь осталось добавить несколько мелочей для повышения удобства при работе с программой:

  1. Выделите кнопку «Обновить» и на вкладке Events Инспектора объектов, напротив события OnShow из раскрывающегося списка выберите процедуру FormShow.

  2. Таким же образом для события OnDblClick ListBox’a выберите процедуру Button1Click. Теперь при двойном щелчке мыши по выбранной программе, для неё запустится Uninstall.

  3. Для события OnKeyPress ListBox’a запишите процедуру:
    procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      //если нажата клавиша Delete, то удаляем информацию о выбранной программе из реестра
      if (Key = VK_DELETE) then
        Button2.OnClick(self);
    end;

Действия при создании и закрытии формы:
procedure TForm1.FormCreate(Sender: TObject);
begin
  //создаем объекты для хранения строк
  DirList := TStringList.Create;
  PathList := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DirList.Free;
  PathList.Free;
end;

Вот и всё. Предложения по поводу тем следующих статей этого цикла присылайте мне по E-mail.Иван Ширко
ishyrko@gmail.com

30 Replies to “Сделай сам на Delphi: Установка и удаление программ”

  1. Приятная статья, мне даже очень и очень понравилось!

  2. Огромное, даже непередаваемое тебе СПАСИБИЩЕ!!!! Мне это очень помогло — у меня курсач по этой теме, и мне его сегодня надо сдать! Одну скачал, а там Дэлфи ругается мол нет дополнительных пакетов(потом нашел, но скачать 140мег не успеваю!) Еще раз спасибо! надеюсь прокатит!!! +1000000000

  3. Получается, чтобы добавить свою прогу в Установка и удаление программ» надо прописаться в реестре?

  4. Да реально автору спасибо за статейку, все доступно и понятно пошел побывать

  5. Статья просто супер!!! ОЧень понравилось! Полезно!

  6. твой блог мне полезен, практика по делфи, дуб дубом, разбираюсь сижу:(

  7. Скачал программу, спасибки, буду юзать!

  8. спасибо за совет!!Delphi со школы плохо идет, нознать и научиться хочу:))нашел блог твой. Спасибо:))

  9. Delphi вобще сложная вещь…ну по крайне мере мне, как начинающему:))а вообще после подумываю изучить Java…говорят ууххх:)сложная хренька:)

  10. Надо попробовать , спасибо за программу.

  11. Статья хорошая и нужная, спасибо автору.

  12. Познавательно и интересно. Но, сложно для восприятия моими мозгами. Это мне так показалось или вам тоже? Прошу автора не обижаться.

  13. Спасибо за информацию, она помогла в решении очень важной для меня проблемы!!! Ура =)))

  14. А я вот мучаюсь с идентификацией нажатия клавиши Delete на клавиатуре… Использовал для события OnKeyPress условие if Key=#46; Key=VK_DELETE (как у вас в примере вроде) и ничего, сколько раз не нажми на эту клавишу — никакой реакции. Можете подсказать чего-нибудь?

  15. Дайте ссылку на Делфи плиз очень нужна!!!!!!=)))))

  16. немного можно подправить например добавить инфу об авторе программы читать параметр в реесторе ‘Publisher’ ну и версию проги ‘DisplayVersion’

  17. Вадим, с onkeypress действительно что-то не работает, зато на KeyUp например, работает на ура

  18. В свое время зять пытался приобщить меня к дэлфи, ну мне как то не очень!

  19. Хороший пример, очень полезный. Как говорить респект и уважуха!

  20. Немного добавлю.. В раздел USES следует прописать Registry, т.к. без этого компилятор ругается на: ——— Reg: TRegistry; //для работы с реестром ——— Спасибо за внимание..

  21. Спасибо, есть одна задумка, статья помогла в реализации

  22. Существует ли возможность выводить именно исполняемые *.exe файлы и потом например выделеные импортировать в рег файл?

  23. киньте ссылку на исходник плиз, а то в новости не работает

  24. Интересный способ удаления програм но для этого нужно уметь работать с реестром.

  25. Данные о программе хранятся не только в HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall но и в: HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

Comments are closed.