Программирование на Delphi и не только » Архив блога Сделай сам на Delphi: Установка и удаление программ | Программирование на Delphi и не только

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

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

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

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

    В разделе 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