Что нового

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

sforce5

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

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

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

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

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



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



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


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

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

madmasles

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

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

CreatoR

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

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

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

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
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 705
Хорошо сделал. Даже не верится, что код уместился в 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 705
Как сказал CreatoR: "Испытываю некоторые затруднения в понимании фразы...". Пока не посмотрел пример, так и не понял, что ты хочешь. Это из разряда "Казнить, нельзя, помиловать".

:smile:

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

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



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

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

Yashied

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
А почему иконки не исправил? Вот простой пример .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 705
sforce5 сказал(а):
Хммм, странно, у меня всё впорядке...
Нет, не в порядке, должно быть так:



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

Код:
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 705
А зачем "обкусывать" 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"
Исправлено: Ошибка показа сообщений с пустым именем программы
Исправлено: Небольшие изменения в строке состояния (убрано одно деление)
Исправлено: Удалены лишние участки кода
 
Верх