Скачать программу 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;
Основная часть на этом завершена. Теперь осталось добавить несколько мелочей для повышения удобства при работе с программой:
-
Выделите кнопку «Обновить» и на вкладке 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;
ishyrko@gmail.com
Приятная статья, мне даже очень и очень понравилось!
Мне это пригодится.
Огромное, даже непередаваемое тебе СПАСИБИЩЕ!!!! Мне это очень помогло — у меня курсач по этой теме, и мне его сегодня надо сдать! Одну скачал, а там Дэлфи ругается мол нет дополнительных пакетов(потом нашел, но скачать 140мег не успеваю!) Еще раз спасибо! надеюсь прокатит!!! +1000000000
>>San Удачной сдачи курсача)
Получается, чтобы добавить свою прогу в Установка и удаление программ» надо прописаться в реестре?
Да реально автору спасибо за статейку, все доступно и понятно пошел побывать
Статья просто супер!!! ОЧень понравилось! Полезно!
твой блог мне полезен, практика по делфи, дуб дубом, разбираюсь сижу:(
Скачал программу, спасибки, буду юзать!
спасибо за совет!!Delphi со школы плохо идет, нознать и научиться хочу:))нашел блог твой. Спасибо:))
Delphi вобще сложная вещь…ну по крайне мере мне, как начинающему:))а вообще после подумываю изучить Java…говорят ууххх:)сложная хренька:)
Надо попробовать , спасибо за программу.
Статья хорошая и нужная, спасибо автору.
О сейчас буду пробовать.
Познавательно и интересно. Но, сложно для восприятия моими мозгами. Это мне так показалось или вам тоже? Прошу автора не обижаться.
Спасибо за информацию, она помогла в решении очень важной для меня проблемы!!! Ура =)))
А я вот мучаюсь с идентификацией нажатия клавиши Delete на клавиатуре… Использовал для события OnKeyPress условие if Key=#46; Key=VK_DELETE (как у вас в примере вроде) и ничего, сколько раз не нажми на эту клавишу — никакой реакции. Можете подсказать чего-нибудь?
Дайте ссылку на Делфи плиз очень нужна!!!!!!=)))))
немного можно подправить например добавить инфу об авторе программы читать параметр в реесторе ‘Publisher’ ну и версию проги ‘DisplayVersion’
Вадим, с onkeypress действительно что-то не работает, зато на KeyUp например, работает на ура
В свое время зять пытался приобщить меня к дэлфи, ну мне как то не очень!
Хороший пример, очень полезный. Как говорить респект и уважуха!
А это не нада?) listbox1.Items:=strlist;
емае я тупой наверно))
Немного добавлю.. В раздел USES следует прописать Registry, т.к. без этого компилятор ругается на: ——— Reg: TRegistry; //для работы с реестром ——— Спасибо за внимание..
Спасибо, есть одна задумка, статья помогла в реализации
Существует ли возможность выводить именно исполняемые *.exe файлы и потом например выделеные импортировать в рег файл?
киньте ссылку на исходник плиз, а то в новости не работает
Интересный способ удаления програм но для этого нужно уметь работать с реестром.
Данные о программе хранятся не только в HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall но и в: HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall