Форум: "WinAPI";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
ВнизУдаление программы из системы Найти похожие ветки
← →
begin...end © (2004-09-14 19:56) [0]Уважаемые Мастера!
Понадобилось тут написать программулину, среди функций которой будет запуск удаления выбранной программы - из тех, список которых приведён в Панели управления ("Установка и удаление программ").
Получение самого списка не представляет затруднений. В секции реестра HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall для каждой установленной проги есть подсекция с параметром DisplayName. Список значений этих параметров и даёт список установленных программ.
Там же есть и параметр UninstallString, который вроде бы содержит путь к деинсталлятору, и, иногда - параметры его запуска.
Но проблема в том, что значения этого параметра для разных программ имеют совершенно разные форматы: путь к деинсталлятору может быть полным или неполным, параметры могут быть в кавычках или без, и т.д.
Т.е. каким-то однотипным способом обработать каждое значение, чтобы потом вызывать ShellExecute (или что-то вроде этого) для запуска деинсталлятора, не получается.
В общем, у меня впечатление, что я вообще не в ту сторону копаю.
Кто-нибудь решал такую задачу?
Как это удалось сделать?
Спасибо.
← →
Cobalt © (2004-09-14 23:30) [1]А что, возникали проблемы с запуском этой строки, еслим её просто "втупую" запускать через ShellExecute?
← →
begin...end © (2004-09-15 07:43) [2]Конечно, возникали.
Вот, например, такая строка:
MsiExec.exe /I{B7886D87-ADA4-46A0-8A8D-02AB16B9F95A}
Т.е., по-видимому, это какой-то стандартный деинсталлятор, но где его искать?
Т.е. его (конкретно) найти-то, конечно, ещё можно, но где гарантия, что в остальных строках будут полные пути?
← →
Александр1 (2004-09-15 10:57) [3]Во во, я тут тоже как-то с этим разбирался и так нифига и не понял. чё такое
> MsiExec.exe /I{B7886D87-ADA4-46A0-8A8D-02AB16B9F95A}
← →
simpson © (2004-09-15 12:50) [4]Тоже как-то были подобные проблемы...
Содержимое параметра UninstallString остается на совести программы-инсталлятора. Поэтому, теоретически, то, что в эту строку поместили при установке программы, является необходимым и достаточным для ее удаления.
Поскольку инсталляторы - разные, то и способы хранения информации для удаления программы, и содержимое UninstallString разнится.
Если инсталлятор помещает свой "uninstall", например, в папке C:\Windows\System32, то в "UninstallString" полного пути нет - нет смысла его там хранить. Так, например, поступает MSIEXEC, который приведен в качестве примера.
> так нифига и не понял. чё такое
> MsiExec.exe /I{B7886D87-ADA4-46A0-8A8D-02AB16B9F95A}
MSIEXEC (a.k.a. Windows Installer) каждой устанавливаемой им программе присваивает GUID. Он и передается MSIEXEC для идентификации той или иной программы. Соответственно, в реестре хранится ключ {B7886D87-ADA4-46A0-8A8D-02AB16B9F95A}, в значениях которого имеется информация о текущем состоянии установленной программы.
← →
begin...end © (2004-09-15 21:46) [5]Итак.
Уже собирался я эти строки каким-то заумным способом парсить, как вдруг выяснилось, что всё прекрасно запускается с использованием старой доброй функции WinExec (не бейте меня, пожалуйста, я в курсе, что она не рекомендуется :-) Т.е. достаточно передать ей всю эту строку. Она сама в случае необходимости поищет деинсталлятор и в WindowsDirectory, и в SystemDirectory. По-видимому, не хуже дело будет обстоять и с рекомендуемой функцией CreateProcess :-)
Всем - огромное спасибо за внимание.
← →
Александр1 (2004-09-16 03:47) [6]
> ключ {B7886D87-ADA4-46A0-8A8D-02AB16B9F95A}, в значениях
> которого имеется информация о текущем состоянии установленной
> программы.
Ну замутили! Получается всётаки в реестре прописан полный путь к программе? Чё-то фигня какая-то. Ну прописали бы сразу?
← →
Александр1 (2004-09-16 03:49) [7]
> begin...end © (15.09.04 21:46) [5]
> Итак.
>
> Уже собирался я эти строки каким-то заумным способом парсить,
> как вдруг выяснилось, что всё прекрасно запускается с использованием
> старой доброй функции WinExec (не бейте меня, пожалуйста,
> я в курсе, что она не рекомендуется :-) Т.е. достаточно
> передать ей всю эту строку. Она сама в случае необходимости
> поищет деинсталлятор и в WindowsDirectory, и в SystemDirectory.
> По-видимому, не хуже дело будет обстоять и с рекомендуемой
> функцией CreateProcess :-)
Круто! Можно ни очём не думать, просто взять WinExec... Хотя вообще-то это не дело надо разобраться. Где же всё таки путь?
← →
begin...end © (2004-09-16 08:51) [8]
> [6] Александр1 (16.09.04 03:47)
> Ну замутили! Получается всётаки в реестре прописан полный путь к программе?
Нет. Вызывается MsiExec.exe, в качестве параметра передаётся /I{B7886D87-ADA4-46A0-8A8D-02AB16B9F95A}, а уж MsiExec дальше на основании этого параметра разбирается, что и откуда надо удалять. Т.е. не обязательно в качестве параметра к деинсталлятору должен быть путь к удаляемой программе. Должен быть путь к информации для удаления.
> [7] Александр1 (16.09.04 03:49)
> Где же всё таки путь?
Путь к деинсталлятору, ты имеешь в виду?
В случае MsiExec в реестре путь к нему не указан. Там указано только его имя - MsiExec.exe. А WinExec() ищет этот файл в каталоге Windows, системном каталоге и ещё некоторых местах. В частности, MsiExec.exe можно найти в X:\Windows\System32 (ну или X:\WinNT\System32).
Вот отрывок из описания WinExec:
If the name of the executable file in the lpCmdLine parameter does not contain a directory path, Windows searches for the executable file in this sequence:
1. The directory from which the application loaded.
2. The current directory.
3. The Windows system directory. The GetSystemDirectory function retrieves the path of this directory.
4. The Windows directory. The GetWindowsDirectory function retrieves the path of this directory.
5. The directories listed in the PATH environment variable.
← →
begin...end © (2004-09-16 08:53) [9]
> [8] begin...end © (16.09.04 08:51)
Пардон, вместо Должен быть путь к информации для удаления читать: Должен быть путь к информации, необходимой для удаления программы.
← →
Александр1 (2004-09-21 18:23) [10]
> I{B7886D87-ADA4-46A0-8A8D-02AB16B9F95A}
А ктонибуть пробовал расшифровывать, что скрывается под этим номером. Как его расшифровать?
← →
simpson © (2004-09-21 18:28) [11]> Александр1 (21.09.04 18:23) [10]
:)
Да нечего там расшифровывать. За ним ничего не скрывается - это просто уникальный идентификатор конкретного дистрибутива. Таким (присвоением GUDI"ов дистрибутивам) страдает не только Windows Installer - например, еще такое любит делать Ghost Installer.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.05 c