Наиболее разумная стратегия для обновления / удаления расширения оболочки? - PullRequest
1 голос
/ 01 мая 2019

Я хочу создать установщик для расширения оболочки, которое устанавливается только для текущего пользователя. Я хочу, чтобы как обновление, так и удаление работали как можно более плавно для конечного пользователя.

Проблема в том, что загруженная DLL расширения оболочки может быть незарегистрированной, но не удаленной, поскольку она заблокирована Проводником. Затем установщик застрянет, когда попытается удалить DLL. Поскольку расширение оболочки установлено только для текущего пользователя, я не могу использовать любую опцию «удалить DLL при перезагрузке», требующую прав администратора. Я также не могу использовать жесткий перезапуск explorer.exe, поскольку он может привести компьютер в нерабочее состояние для конечного пользователя: часто при перезапуске проводник выключается, но не запускается снова.

После просмотра DLL некоторых других приложений кажется, что некоторые могут использовать скользящие номера версий, например, shell_ext_v5.dll, shell_ext_v6.dll и т. Д. Новые версии получают новый номер, поэтому старые файлы DLL не обязательно должны быть удаленным.

Если я пойду с этой стратегией:

  • При переустановке текущей версии я могу оставить DLL без изменений, поскольку она не изменилась.
  • При обновлении будет установлена ​​новая DLL, и реестр укажет на новую версию. Старый файл DLL останется в системе, хотя и не используется.
  • При удалении DLL-файл может быть оставлен без восстановления, если он заблокирован Проводником.

Так что плохо в том, что в системе останутся DLL-файлы. Но хорошо, что установка / удаление никогда не застрянет, если DLL заблокирована. Как вы думаете? Есть ли альтернатива?

1 Ответ

2 голосов
/ 11 мая 2019

Напишите небольшую программу для удаления устаревших файлов (каждый выпуск добавляется в список) в системе.

При обновлении приложения добавьте запись реестра в HKCU\Software\Microsoft\Windows\RunOnce, которая указывает на эту программу.

При следующем входе пользователя в систему эта программа будет выполнена (файлы будут разблокированы и, следовательно, удалены), а затем запись удаляется системой из реестра.

Убедитесь, что функция Main программы возвращает 0 в качестве кода выхода.

Это должно быть прозрачно для пользователя с возможной вспышкой окна консоли (зависит от настроек программы).

Все это выполняется в контексте пользователя, поэтому никаких прав администратора или UAC не требуется.

...