Справка сценария NSIS - установка без убийства проводника

Когда я попытался удалить и установить исполняемый файл foo.exe, я получил следующую ошибку:

Error opening file for writing
click abort to stop the installation

Я обнаружил, что некоторые файлы не удалось удалить при деинсталляции. И с помощью проводника процесса я вижу, что explorer.exe все еще ссылается на некоторые dll-файлы foo.exe даже после их отмены.

и убив explorer.exe и перезапустив его снова, пока деинсталляция решает проблему. (через установочный скрипт NSIS).

или установив флаг rebook ok в скрипте и попросив пользователя перезагрузить компьютер перед повторной установкой foo.exe.

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

Может ли кто-нибудь помочь мне, как я могу убедиться, что моя установка проходит нормально, вместо перезапуска explorer.exe


person Anees    schedule 14.11.2010    source источник
comment
Как вы выполняете деинсталлятор?   -  person kichik    schedule 14.11.2010
comment
У меня есть деинсталлятор. Я выполняю со всеми разрешениями с плагином UAC .. это не проблема с моим UAC. (С использованием XP)   -  person Anees    schedule 14.11.2010
comment
На самом деле я не думал о UAC, а скорее о вашем методе выполнения, который не дожидается, пока деинсталлятор завершится должным образом, и продолжает установку только тогда, когда это действительно сделано. Это очень распространенная проблема с программами удаления NSIS.   -  person kichik    schedule 14.11.2010
comment
Привет, kichik, я читал один из ваших комментариев на форуме .. о перемещении dll в temp и переименовании .. это нормально .. Я использую RMDir / r / REBOOTOK $ INSTDIR в качестве последней строки сценария удаления. это после вызова exec дождитесь зарегистрированных dll..deleteregkey все ..   -  person Anees    schedule 14.11.2010
comment
Все еще не то, что я имел в виду ... :) nsis.sourceforge.net/   -  person kichik    schedule 14.11.2010
comment
извините за bein pig head .. но я не использую execwait. Я создаю деинсталлятор в разделе - Post WriteUninstaller $ INSTDIR \ uninst.exe и из сокращенного набора я вызываю этот деинсталлятор CreateShortCut $ SMPROGRAMS \ Foo \ Uninstall.lnk $ INSTDIR \ uninst .exe $ INSTDIR \ uninst.exe 0   -  person Anees    schedule 14.11.2010
comment
Итак, вы запускаете деинсталлятор через проводник? Если это так, не обращайте внимания на мой комментарий.   -  person kichik    schedule 14.11.2010
comment
Зарегистрированы ли эти расширения оболочки .dll в реестре?   -  person Anders    schedule 14.11.2010
comment
Привет, Андерс, ты прав .. это расширения оболочки .. зарегистрированные   -  person Anees    schedule 14.11.2010


Ответы (1)


Для зарегистрированных расширений оболочки действительно нет чистого способа удалить dll, кроме принудительной перезагрузки (или выхода из системы, если они зарегистрированы в HKCU \ Software \ Classes)

Если этого недостаточно, у вас есть два варианта:

  • Переименуйте .dll и удалите его позже.
  • <HACKALERT>Внедрить поток, который вызывает CoFreeUnusedLibraries () в каждый процесс, в который загружена ваша dll</HACKALERT>

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

person Anders    schedule 14.11.2010
comment
Андерс, попытался переименовать остатки, существующие после деинсталляции, но безуспешно. Можете ли вы предоставить мне какой-нибудь фрагмент кода? - person Anees; 20.11.2010