Почитайте!

Нас читают

Статьи о программировании и не только

Mail.Ru

Rambler's Top100

Programming Blogs - BlogCatalog Blog Directory

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

06.05.2008 от Иван Ширко

Скачать программу Установка и удаление программ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

Рубрики: Delphi, Сделай сам | Комментарии (30) »

Комментарии (30)

  1. Виктор пишет:

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

  2. Алексей Родионов пишет:

    Мне это пригодится.

  3. San пишет:

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

  4. Иван пишет:

    >>San
    Удачной сдачи курсача)

  5. Сергей пишет:

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

  6. открытая база пишет:

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

  7. majormo пишет:

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

  8. Тритон пишет:

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

  9. hevac пишет:

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

  10. lazy пишет:

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

  11. borland пишет:

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

  12. Коля пишет:

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

  13. Andrew пишет:

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

  14. Генри пишет:

    О сейчас буду пробовать.

  15. Domin пишет:

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

  16. multimedia пишет:

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

  17. Вадим пишет:

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

  18. Ильназ пишет:

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

  19. prays пишет:

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

  20. crystalbit пишет:

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

  21. sharik пишет:

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

  22. C0ffe1n пишет:

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

  23. Андрей пишет:

    А это не нада?)
    listbox1.Items:=strlist;

  24. Андрей пишет:

    емае я тупой наверно))

  25. Михаил Григорьев пишет:

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

    Спасибо за внимание..

  26. Артем пишет:

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

  27. Last_kamikadze пишет:

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

  28. andrew пишет:

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

  29. samsim пишет:

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

  30. инсталлятор пишет:

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