Что нового

Uninstall Manager - замена системному деинсталлятору

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
AutoIt: 3.3.4.0
Версия: 1.50
Категория: Система
Описание: Программа для замены стандартной, системной утилиты "Установка/Удаление программ"

Основные возможности:
  • Получение списка установленных программ, обновлений, системных компонентов
  • Расширенный просмотр свойств установленных порограмм
  • Сохранение отчёта об установленных программах в HTML, REG
  • Деинсталляция без подтверждения
  • Подсветка "особых" элементов
  • Определение типа инсталлятора
  • Определение точной даты установки
  • Портативность (все настройки сохраняются в папке с программой, а не в реестре)

Скачать - Исходники

Список изменений

1) Главное окно программы

uninstmgr.png


2) Редактирование данных

properties.png


3) Окно настроек

settings.png

Сайт программы: http://sforce5.narod.ru/uninstmgr
Автор(ы): [Nuker-Hoax] | (sforce5)

Делайте предложения по улучшению программы
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Re: Uninstall Manager - деинсталлятор

sforce5
А можно по-подробнее о том, что она делает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Re: Uninstall Manager - деинсталлятор

madmasles [?]
Как должно быть понятно из названия, позволяет деинсталлировать установленные в системе программы.

Хотя sforce5 мог бы конечно и по подробнее дать описания.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Re: Uninstall Manager - деинсталлятор

CreatoR [?]
деинсталлировать установленные в системе программы
Об этом я догадался :smile:. Просто я подозреваю, что она еще что-нибудь делает. Вот об этом что-нибудь и хотелось бы узнать, а то без доп. информации, как-то не хочу я ее проверять в действии.
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
sforce5 [?]
Делайте предложения по улучшению программы
Никак не сделать чтобы при изменении настроек не перечитывалось каждый раз с реестра... нет!? ну записать в память при первом запуске всю ветку реестра или еще как... :whistle:
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
sforce5
При запуске идет считывание реестра (1 раз)
При изменении настроек отображения (+еще каждый раз на любое изменение)

как то можно сделать чтобы считало один раз с реестра (в память) и с этим и работала?
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Guezt сказал(а):
sforce5
При запуске идет считывание реестра (1 раз)
При изменении настроек отображения (+еще каждый раз на любое изменение)

как то можно сделать чтобы считало один раз с реестра (в память) и с этим и работала?

При изменении настроек (таких как Показывать обновления) генерируется "другой" список, без обновления будет неправильно отображаться
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Хорошо сделал. Даже не верится, что код уместился в 1190 строк. Теперь несколько замечаний:

  • Если сама программа работает с реестром, не лучше бы сделать сохранение настроек в самом реестре? Лично мне .ini файлы напоминают времена Windows 3.1.
  • Если в настройках программы отменить показ иконок, то остаются пустые места, правда со следующим запуском список выглядит нормально.
  • Вместо RegEnumKey() я советую сделать так (~ в 158 раз быстрее):

    Код:
    #Include <Array.au3>
    #Include <WinAPIEx.au3>
    
    $hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall')
    $Count = _WinAPI_RegQueryInfoKey($hKey)
    Dim $aKey[$Count[0]]
    For $i = 0 To UBound($aKey) - 1
    	$aKey[$i] = _WinAPI_RegEnumKey($hKey, $i)
    Next
    _WinAPI_RegCloseKey($hKey)
    
    If IsArray($aKey) Then
    	_ArrayDisplay($aKey, '_WinAPI_RegEnumKey')
    EndIf

  • Вместо GUICtrlCreateListViewItem() лучше использовать _GUICtrlListView_AddItem(), опять же скорость будет намного выше.
  • Двойной клик на элементе, лучше связать не с "Деинсталировать", а с чем-нибудь другим, на всякий случай.
  • При вызове окна "Настройки" и его закрытия (без изменений), зачем-то обновляется список. Ну или что-то еще.
  • Зачем столько много "<пусто>"?
  • Если я ничего не меняю в "Просмотр / Редактирование данных", то зачем спрашивать "Хочу ли я выйти без сохранеия"?
  • Опять же, неправильно обновляется список, очень долго удаляются элементы, должно быть "мгновенно", возможно, это связано с GUICtrlCreateListViewItem().
  • Перед работой с программой, хорошо бы проверять наличие прав администратора.
  • Не всегда правильно отображаются иконки, это связано с индексами иконок и функцией GUICtrlCreateIcon() / GUICtrlSetImage(), баг(?). Советую использовать _SetIcon() или _SetHIcon() из Icons.au3 (эх, у меня уже давно версия 1.8, а я все никак не соберусь ее выложить, наверное, потому что мало интереса к ней проявлено на нашем форуме). Если ты все же настаиваешь на GUICtrl..., то индексы иконок, которые ты берешь из реестра нужно преобразовать следующим образом:

    Код:
    If $Index < 0 Then
    	$Index = -$Index
    Else
    	$Index = -$Index - 1
    EndIf

  • Зачем нужна функция _Mutex()? Она аналогична _Singleton(). Если ты не доверяешь последней, то можешь изменить название скрытого окна AutoIt на что-нибудь уникальное, и проверять наличие окна с этим именем (100% способ):

    Код:
    $Unique = 'Uninstall_Manager_1.0_ZdqXp'
    
    Opt('WinTitleMatchMode', 3)
    
    If WinExists($Unique) Then
    	WinActivate('[TITLE:Uninstall Manager v1.0;CLASS:AutoIt v3 GUI]')
    	Exit
    EndIf
    
    AutoItWinSetTitle($Unique)
    ...

  • При изменении размеров окна, размеры StatusBar'а тоже зачем-то меняются.
  • Хорошо бы добавить стиль LVS_EX_INFOTIP для списка.
  • Может быть цвета для некоторых элементов сделать не такими яркими, а то сильно глаза устают.
  • Если ты задался вопросами лицензирования, то по хорошему, нужно приложить файл с текстом лицензии, или, на худой конец, дать ссылку. Но возможно я и ошибаюсь.
  • Зачем искать в Google слово "<пусто>"?
  • В чем здесь смысл? Иконка у тебя и так не появляется, т.к. окно не имеет заголовка и является дочерним.

    Код:
    Local $hIcon = _WinAPI_GetClassLong($status_dlg, -14)
    _WinAPI_FreeIcon($hIcon)
    _WinAPI_SetClassLong($status_dlg, -14, 0)
    _WinAPI_SetClassLong($status_dlg, -34, 0)

  • К предыдущему пункту. Для того, чтобы не показывать иконку на панели задач, нет необходимости создавать дополнительное окно. Можно привязать основное окно, например к тому же скрытому окну AutoIt:

    Код:
    GUICreate(..., WinGetHandle(AutoItWinGetTitle()))

  • Вместо этого (это было у нас где-то на форуме)

    Код:
    GUISetState(@SW_ENABLE, $hWnd)
    _WinAPI_SetActiveWindow($hWnd)
    GUIDelete($settings_dlg)

    Лучше написать так:

    Код:
    GUISetState(@SW_ENABLE, $hWnd)
    GUIDelete($settings_dlg)

  • И самое неприятное, происходит утечка памяти, не очень большая, но есть. Где-то что-то ты не освободил...

Пока все.
 

TheBloodTear

Знающий
Сообщения
36
Репутация
9
To sforce5

Весь код не смотрел :smile:.. Но запустив exe-шник, могу сказать все здорово!!!..

А по поводу советов:
1) Переделай программу на работу с сетевым реестром.
2) Научи ее включать службу сетевого реестра.
3) Добавить в нее psexec.exe. Я думаю можно просто FileInstall (в сетевой путь и все)..

Просто как я все это представляю:
Есть один сисадмин (или какой-то тех.спец.), он запускает у себя на машине вот это дело.. Программа по-умолчанию считывает его софт.. Потом, нажав кнопку "Имя ПК" и вбив, собственно имя, программа убедилась что есть доступ к удаленному реестру этого ПК (если нет, то включила), потом считала все.. Если есть надобность удалить что-то, то нужно запустить на удаленной машине "exe" или "msi", вот для этого я и советую впаять psexec.exe..

Ну вот как-то так..

Ранее был опыт работы со службами и psexec.exe, поэтому, если что, то задавай вопросы, буду рад помочь ;)..
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Как сказал CreatoR: "Испытываю некоторые затруднения в понимании фразы...". Пока не посмотрел пример, так и не понял, что ты хочешь. Это из разряда "Казнить, нельзя, помиловать".

:smile:

У меня все работает как часы. В любом случае смотри в сторону IniRead(), других причин быть не может. _GUIColorPicker_Create() вообще по барабану что ты ей передаешь. Может лучше использовть IniReadSection(), а не читать сто раз подряд .ini файл? И не нужно при любом изменении производить запись в файл. Обычно делают так: при запуске прораммы считывают параметры и далее с ними работают, а при выходе - записывают все это хозяйство обратно, причем лучше с помощью IniWriteSection().

Мне кажется, что у тебя второй раз IniRead() просто не срабатывает, проверь.



Добавлено:
Сообщение автоматически объединено:

Кстати, похожая ситуация, связанная с проблемами вызова функции чтения файла в качестве параметра, обсуждалась здесь.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Что значит "легла"?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
А почему иконки не исправил? Вот простой пример .reg файла, посмотри что будет показыать Windows и твоя программа.

Код:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test]
"DisplayIcon"="C:\\WINDOWS\\system32\\shell32.dll,43"
"DisplayName"="@Test"
"UninstallString"="test.exe"

И если ты открываешь раздел реестра, то должен его закрыть (освободить).

Код:
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall')
...
_WinAPI_RegCloseKey($hKey)


sforce5 сказал(а):
Я НЕ ДОПРАВИЛ ТОЛЬКО ВЫБОР ЦВЕТОВ

Если бы ты вимательнее читал справку...
[box]Перед тем как удалить окно функцией GUIDelete(), необходимо удалить все элементы Color Picker, которые были созданы в этом окне.[/box]
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
sforce5 сказал(а):
Хммм, странно, у меня всё впорядке...

Нет, не в порядке, должно быть так:

uninstall.png


Вот еще один пример:

Код:
GUICreate('MyGUI', 400, 400)
GUICtrlCreateIcon('shell32.dll', 43, 20, 20, 32, 32)
GUICtrlCreateIcon('shell32.dll', _InvertIndex(43), 80, 20, 32, 32)
GUISetState()

Do
Until GUIGetMsg() = -3

Func _InvertIndex($iIndex)
	If $iIndex < 0 Then
		$iIndex = -$iIndex
	Else
		$iIndex = -$iIndex - 1
	EndIf
	Return $iIndex
EndFunc   ;==>_InvertIndex
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Uninstall Manager 1.20

Uninstall Manager 1.20 (26.03.10)
--------------------------
Добавлено: Сохранение позиций окна (и настройка для включения/отключения параметра)
Добавлено: Форматированное копирование текста (Копировать данные) в буфер
Добавлено: Определение типа инсталлятора (NSIS, Inno Setup и Windows Installer) .....Хе, Хе
Добавлено: Пункт в меню - "Восстановить"
Исправлено: Ошибки при выборе цвета (не сохранялись цвета)
Исправлено: Высвобождение ключа реестра после генерирования списка программ
Исправлено: Ошибка с индексом значков программ
Исправлено: Исправлена строка состояния (теперь обычная)
Исправлено: Неправильное отображение иконок некоторых MSI записей
Исправлено: Ошибка отображения значков в "Свойствах" при выключенном параметре "Загружать значки"
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
А зачем "обкусывать" UDF'ы? Разница получается ~40Кб. Из-за этого у тебе скрпт вылетает с ошибкой (я скачал только исходники). Тебе нужно добавить следующее (это присутствовало изначально в WinAPIEx.au3):

Код:
#Include <WinAPI.au3>
 

TheBloodTear

Знающий
Сообщения
36
Репутация
9
Начну с конца ;)
1) Получить список компьютеров можно вот таким способом :smile:... Функция LIST то, что нужно..
2) Не совсем понял вопрос по поводу удаленного реестра и какой-то подачи 8)..
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
TheBloodTear сказал(а):
Начну с конца ;)
1) Получить список компьютеров можно вот таким способом :smile:... Функция LIST то, что нужно..
2) Не совсем понял вопрос по поводу удаленного реестра и какой-то подачи 8)..

Ну к примеру у меня ужэ почти всё готово, мне осталось добавить определение когда пользователь вводит текущий компьютер (чтобы использовать _WinAPI_RegOpenKey), а когда вводит удалённый комп (чтобы использовать _RegConnectRegistry).... Вот так
 

TheBloodTear

Знающий
Сообщения
36
Репутация
9
Ну вот как я это представляю:
Программа запускается, и по-умолчанию переменная $Computer = @ComputerName. Потом, нажимается кнопка "Удаленный компьютер", вводится/выбирается другое рабочее имя и переменная $Computer изменяется.. А для того, что бы отличить когда пользоваться какой функцией, я бы использовал просто "If" ;)..

Код:
If $Computer = @ComputerName Then
	_WinAPI_RegOpenKey (...)
ElseIf $Computer <> "" And $Computer <> @ComputerName Then
	_RegConnectRegistry (...)
Else
	ConsoleWrite ("Error")
EndIf


Как-то так ;)..

P.S. Прости, нет возможности сейчас тестировать код, даже AutoIt'а нет сейчас на компьютере :(..
P.P.S. Скачал программу, она зависает на считывании "Nokia Ovi Suite" :(.. У меня Windows 7 64bit..
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
TheBloodTear сказал(а):
Код:
If $Computer = @ComputerName Then
	_WinAPI_RegOpenKey (...)
ElseIf $Computer <> "" And $Computer <> @ComputerName Then
	_RegConnectRegistry (...)
Else
	ConsoleWrite ("Error")
EndIf


Как-то так ;)..

Хех, я и сам так могу, но ведь пользователь может ввести и IP адрес

TheBloodTear сказал(а):
P.P.S. Скачал программу, она зависает на считывании "Nokia Ovi Suite" :(.. У меня Windows 7 64bit..

x64 не поддерживает (пока не поддерживает....... Хе Хе)
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Uninstall Manager 1.30 (28.03.10)

Uninstall Manager 1.30 (28.03.10)
--------------------------
Добавлено: Считывание с ключа реестра HKCU (и настройка для включения/отключения параметра)
Добавлено: Сообщение об ошибке если архитектура операционной системы не x86
Добавлено: Определение точной даты установки
Исправлено: Не копировались данные "Инсталлятор" в буфер обмена
Исправлено: Ошибки показа значков (неправильное отображение)
Исправлено: Ошибка открытия папок типа "x:\xxx.xxx\file.ext"
Исправлено: Ошибка показа сообщений с пустым именем программы
Исправлено: Небольшие изменения в строке состояния (убрано одно деление)
Исправлено: Удалены лишние участки кода
 
Верх