В Панели управления 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;
Основная часть на этом завершена. Теперь осталось добавить несколько мелочей для повышения удобства при работе с программой:
Выделите кнопку "Обновить" и на вкладке 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;