如何在重新安装期间显示带有 CPack NSIS 的卸载程序窗口?

Posted

技术标签:

【中文标题】如何在重新安装期间显示带有 CPack NSIS 的卸载程序窗口?【英文标题】:How do I show an uninstaller window with CPack NSIS during re-installation? 【发布时间】:2021-12-03 19:21:07 【问题描述】:

我有以下CMakeLists.txt(目录中唯一的东西):

cmake_minimum_required(VERSION 3.0.0)

project(CPackUninstallerTest)

set(CPACK_GENERATOR NSIS)
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
"DetailPrint \\\"Sleeping...\\\"
Sleep 3000"
)

file(WRITE "$CMAKE_CURRENT_BINARY_DIR/test.txt" "Some output\n")
install(FILES "$CMAKE_CURRENT_BINARY_DIR/test.txt" TYPE DATA)

include(CPack)

运行cmakecpack 工作正常,并生成.../build/CPackUninstallerTest-0.1.1-win64.exe

运行安装程序按预期工作:

运行卸载程序(安装目录中的Uninstall.exe)也可以,睡眠需要三秒钟:

但是,如果我尝试在现有安装之上进行安装,则不会显示此卸载窗口。在此处单击是后:

在新的安装程序运行之前,该窗口会消失三秒钟(因为它正在卸载)。

这是一种糟糕的用户体验,导致他们在等待隐藏的卸载程序时重新运行安装程序,从而导致结果混乱。

如何配置 NSIS 或 CMake/CPack 以在使用 CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL 并重新安装时显示卸载程序进度条?

【问题讨论】:

我认为这是 CPACK 正在做的事情。不确定它是否是用户可配置的。 【参考方案1】:

CMake 的 NSIS 接口无法解决您的问题。

CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL 也有类似的问题。手动卸载时用户无法再次安装。

这里的问题是手动运行卸载程序不会从 Windows 注册表项中删除安装标志。

我的建议是您可以使用 CMake 的 NSIS 模板脚本来创建您的 NSIS 脚本。您可以轻松地将删除命令添加到新脚本的卸载程序部分。

然后您可以将新脚本作为模板提供给 CMake。

【讨论】:

以上是关于如何在重新安装期间显示带有 CPack NSIS 的卸载程序窗口?的主要内容,如果未能解决你的问题,请参考以下文章

CPack:如何执行多个 CPACK_NSIS_EXTRA_INSTALL_COMMANDS?

如何在 NSIS 安装(CMake)中设置图标

如何使用 CPACK_NSIS_WELCOME_TITLE 和 CPACK_NSIS_FINISH_TITLE?

cpack:如何在安装过程中将程序与文件扩展名关联?

向 cpack 添加额外的命令 - NSIS 打包程序/安装程序

如何通过 CMake/CPack 在 NSIS 中设置向导图像?