powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как запустить Uninstall программно?
7 сообщений из 7, страница 1 из 1
Как запустить Uninstall программно?
    #36984989
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пуск->Настройка->Панель Управления->Установка и удаление программ

Там прога TheProga X.Y.Z ,
где
TheProga-название программы-величина постоянная
X.Y.Z-номер версии, который может быть любым

Cмысл: при установке новой версии (да хоть бы старой или той же самой) текущую инсталляцию надо удалить. Известно только имя программы, понятно что
shell (uninstall.exe), только в общем случае непонятно куда программа была установлена юзером.

Рассчитывать на то, что юзер перед установкой новой версии прочтет хэлп и удалит предыдущую несколько наивно, обычно сразу жмут setup_new_version.exe.

Т.е. зная имя программы, проинициализировать правильный Uninstall (хотя бы), типа если не автоматически удалить, то хотя б носом ткнуть.

Можно конечно пытаться вычислять скажем через реестр:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TheProga X.Y.Z
Ключ UninstallString содержит точный путь к uninstall.exe

Можно конечно попытаться запихнуть в инсталлер всю логику un-инсталлера, но это слишком, да и непонятно что там де-инсталлить надо в завис. от установленной версии....

Но м.б. есть более грамотный способ?
...
Рейтинг: 0 / 0
Как запустить Uninstall программно?
    #36985321
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не претендуя на полноту ответа...

почти все инсталляторы умеют создавать ярлык для деинсталляции программы - то есть можно подсмотреть, как он устроен. Вычислить, где находится программа, можно, наверное, через реестр, ну или она сама прописывает это в определенное место после установки.

Для PDW я пользуюсь для деинсталляции такой строкой:

Код: plaintext
%systemroot%\st6unst.exe -n "C:\Program Files\MyProg\ST6UNST.LOG"
...
Рейтинг: 0 / 0
Как запустить Uninstall программно?
    #36986016
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proумеют создавать ярлык для деинсталляции программы... Вычислить, где находится программа, можно, наверное, через реестр...
Ну, на этот вопрос по сути уже ответил.
Димаскажем через реестр:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TheProga X.Y.Z
Ключ UninstallString содержит точный путь к uninstall.exe
Хотя, если это можно вычислить через какие-то API, предпочел бы API...
Shocker.ProДля PDW я пользуюсь для деинсталляции такой строкой...
Ну, ключ /s для своего (де)инсталлятора я нашел, т.е. зная путь к uninstall можно дать команду
Код: plaintext
Path/uninstall.exe /s
и усе тихо и красиво удалится, это радует.
Но:
1) я должен вычислить этот путь
2) я должен ждать завершения работы uninstall перед тем как начать install.
Пользуюсь Smart Install Maker.
п.(1) он сам не вычислит, а опция "запустить команду до распаковки, ждать завершения" работает криво, т.е. запускает uninstall и не дожидаясь бухает новые файлы поверх параллельно удаляемых старых, т.е. бардак по полной-не вариант.

Собственно, идея такая. Надо написать оболочку к Setup (менять основной Setup не хочу).
Что хотелось бы:
1) Один файл main.EXE
2) при нажатии на него получаем MyExtSetup.exe и Setup.exe(кот.собственно setup сейчас есть)
3) запускается MyExtSetup.exe кот. (а) вычисляет путь к предыдущей инсталяции; (б) запускает Path/uninstall.exe /s (в) по окончании запускает настоящий setup.exe (г) по окончании удаляется этот настоящмй setup.exe и MyExtSetup.exe -уборка мусора за собой

Можно было бы конечно просто наложить в zip несколько файлов, но хочется чтоб main.EXE
был единственным, распаковку производить напр. в %temp%, при этом конечно еще убрать за собой.

Как это реализовать?
...
Рейтинг: 0 / 0
Как запустить Uninstall программно?
    #36986031
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно конечно попытаться упаковать один setup в другой, используя один и тот же Smart Install Maker со всевозможными опциями, но это конечно надо играться, чтоб было красиво и чисто...
...
Рейтинг: 0 / 0
Как запустить Uninstall программно?
    #36987352
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно написать скрипт для MS'овского wscript
Я вот опять занялся скриптами для AutoIt.
С его помощью можно такое быстро сделать.
То есть инсталлятор разворачивается и запускает скрипт, скрипт находит, что нужно, и удаляет, затем запускает сетап инсталлятора...
...
Рейтинг: 0 / 0
Как запустить Uninstall программно?
    #36987509
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Можно конечно попытаться упаковать один setup в другой, используя один и тот же Smart Install Maker со всевозможными опциями, но это конечно надо играться, чтоб было красиво и чисто...
Я вот пока на этой идее остановился, предварительные опыты показывают что это работать будет.

Одна из проблем:
Дмитрий77опция "запустить команду до распаковки, ждать завершения" работает криво, т.е. запускает uninstall и не дожидаясь бухает новые файлы ...
Uninstall похоже хитро устроен. Запускаясь из папки программы он тупо копирует себя в %temp%, завершается, а оттуда уже похоже запускается на исполнение по нормальному, поэтому опции самого же инсталлера и всякие там ShellAndContinue не катят и срабатывают сразу же вместо чтоб дождаться реального окончания Uninstall.
Извернулся так (без вспомогательной проги-индикатора никак),ниже тест:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Sub main()
   Shell "c:\Program Files\TheProga\uninstall.exe /s", vbNormalFocus
   Form1.Timer1.Interval =  500 
   Form1.Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
    If IsProgaRun("Uninstall TheProga") = False Then
       Timer1.Enabled = False
        Unload Me
    End If
End Sub
'=================
Public TargetName As String
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" Alias _
    "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString _
    As String, ByVal cch As Long) As Long

' Return False to stop the enumeration.
Public Function WindowEnumerator(ByVal app_hwnd As Long, _
    ByVal lParam As Long) As Long
Dim buf As String *  256 
Dim title As String
Dim length As Long

    ' Get the window's title.
    length = GetWindowText(app_hwnd, buf, Len(buf))
    title = Left$(buf, length)

    ' See if the title contains the target.
    If InStr(title, TargetName) >  0  Then
        ' Save the hwnd and end the enumeration.
        TargetHwnd = app_hwnd
        WindowEnumerator = False
    Else
        ' Continue the enumeration.
        WindowEnumerator = True
    End If
End Function

Function IsProgaRun(proga As String) As Boolean
        TargetName = proga
        TargetHwnd =  0 
        ' Examine the window names.
        EnumWindows AddressOf WindowEnumerator,  0 
        ' See if we got an hwnd.
        If TargetHwnd =  0  Then
            IsProgaRun = False
        Else
            IsProgaRun = True
        End If
End Function

Осталось найти эту самую
"c:\Program Files\TheProga\uninstall.exe"

т.е.
1) Найти нужную папку реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ TheProga X.Y.Z
2) Прочитать в ней Ключ UninstallString

(2) не проблема,
Как перебрать папки реестра на предмет поиска TheProga X.Y.Z ???
...
Рейтинг: 0 / 0
Как запустить Uninstall программно?
    #36987639
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Как перебрать папки реестра на предмет поиска TheProga X.Y.Z ???
Ответ на этот вопрос как бы нашел.
Есть грамотный пример:
How To Enumerate the Subkeys of an Open Registry Key

Но сам задал себе вопрос...
Может быть несколько точек входа (как результат непродуманности предыдущих инсталляторов и деятельности наивных юзеров, жмущих тупо setup), например вот так:
Код: plaintext
1.
2.
TheProga  1 . 0 . 0  UninstallString=C:\Program Files\TheProga\uninstall.exe
TheProga  2 . 0 . 0  UninstallString=C:\Program Files\TheProga\uninstall.exe
TheProga  2 . 1 . 1  UninstallString=C:\TheProga\uninstall.exe
При этом надо удалять все что есть.
В приведенном примере с 2.1.1 все ясно.
А с 2.0.0 и 1.0.0 абсолютно не ясно, т.е.
1) неясно чего там сидит 1.0.0 или 2.0.0
2) понятно, что если удалить один раз, то второй раз C:\Program Files\TheProga\uninstall.exe
запустить уже не получится, при этом хорошо бы подчистить реестр (пункт в установка/удаление программ, ибо он будет ложный).

Т.е. наверно логика должна быть такой:
1) Для каждой уникальной UninstallString выясняем таки наличие там реальной установки (файл uninstall.exe присутствует) и реальную версию (для красоты хотя б) например по версии какого-либо характерного файла:
Get file version information
2) При наличии установки удаляем эту версию.
3) Тупо удаляем все ключи реестра кот. соответствуют этой UninstallString, если остались (это чтоб не было ложных отображений в установка/удаление программ).
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как запустить Uninstall программно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]