Delphi-Help

Главная Статьи Windows Установка и удаление программ на Delphi

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

Оцените материал
(1 Голосовать)


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

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

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

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

u_u_p

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

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

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

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

· Для события 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;
Прочитано 6983 раз

Авторизация



Счетчики