Чистое удаление Inno Setup невозможно с расширениями оболочки

Я использую Inno Setup 6.0.5 и регистрирую две библиотеки DLL расширения оболочки, которые аналогичны тем, что взяты из ownCloud. Одна DLL регистрирует динамическое контекстное меню, другая DLL добавляет оверлейные значки.

Я использую средства, которые Inno Setup предоставляет для выполнения этого шага. Это означает:

[Setup]
ChangesAssociations=true
ChangesEnvironment=true

[Files]
...
Source: "shell-integration\*"; DestDir: "{app}\shell-integration"; Flags: regserver 64bit; Check: IsAdminInstallMode;

Я наблюдаю следующее:

  • После завершения настройки значки наложения не активны. Они появляются только после принудительного перезапуска explorer.exe вручную. Есть такие источники, как это, которые утверждают, что это возможно, вызывая SHChangeNotify и SendMessageTimeoutW, но они явно ошибаются, так как я делает именно это (см. ChangesAssociations и ChangesEnvironment, которые должны это делать).
  • После удаления каталог приложения не удаляется, поскольку файлы 2 DLL по-прежнему заблокированы. Это также препятствует обновлению моего приложения. Предполагается, что Inno Setup обнаруживает заблокированные файлы и предлагает закрыть приложения, которые их блокируют, но этот механизм, похоже, не работает ... Кроме того, флаг uninsrestartdelete бесполезен, так как это заставляет Inno Setup удалять файлы только после перезагрузка, но я не хочу заставлять пользователя перезагружать машину на случай, если он обновит приложение.

Что я должен сделать? Единственный выход, который я вижу, это делать все самому, а не полагаться на флаг [Files] и regserver. В частности, для удаления требуется сначала отменить регистрацию DLL, затем принудительно перезапустить explorer.exe, а затем фактически удалить файлы и папки. Я бы сделал это в CurUninstallStepChanged в блоке if CurUninstallStep = usUninstall. И чтобы перезапустить explorer.exe, я бы изменил CurStepChanged в блоке if (CurStep = ssDone).


person MShekow    schedule 24.09.2020    source источник
comment
Спасибо за разъяснение. Дайте мне знать, если вы видите какой-либо другой способ решить мою проблему, кроме того, который я предложил в последнем абзаце моего поста.   -  person MShekow    schedule 25.09.2020
comment
Проблема в процессе обновления. AFAIK, Inno Setup обычно просто устанавливает приложение поверх предыдущей версии, не вызывая деинсталлятор, верно? Если я оставлю такие вещи, то действительно обновление приложения работает - установщик при вызове 2-го раза обнаруживает, что explorer.exe блокирует библиотеки DLL и закрывает explorer.exe и перезапускает его. Но если я вручную добавлю код в CurStepChanged -> ssInstall, чтобы сначала вызвать деинсталлятор (чтобы получить чистый лист), explorer.exe не запустится Inno Setup после завершения установки.   -  person MShekow    schedule 25.09.2020
comment
Я пошел с stackoverflow.com/questions/62725866/, чтобы выполнить чистую деинсталляцию DLL без перезагрузки. Перезапуск проводника вручную с использованием taskkill и start explorer.exe был ненадежным.   -  person MShekow    schedule 25.09.2020