如何在 NSIS 脚本中使用 REMOVE 或 REPAIR 功能?
Posted
技术标签:
【中文标题】如何在 NSIS 脚本中使用 REMOVE 或 REPAIR 功能?【英文标题】:How to use REMOVE or REPAIR feature in NSIS script? 【发布时间】:2012-11-15 09:16:49 【问题描述】:我已经使用 nsis 脚本来创建安装程序。当我以相同的名称第二次运行我的安装程序时,应该检查 REPAIR 和 REMOVE 并执行相应的操作。我发现我的应用程序已经安装或未使用以下代码,
Function checkinstall
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My app" "UninstallString"
IfFileExists $R0 +1 NotInstalled
call nsDialogpage
NotInstalled:
FunctionEnd
Function nsDialogpage
nsDialogs::Create 1018
Pop $Dialog
$If $Dialog == error
Abort
$EndIf
$NSD_CreateRadioButton 0 5u 100% 10u "Repair"
Pop $hwnd
$NSD_AddStyle $hwnd $WS_GROUP
$NSD_OnClick $hwnd ???
$NSD_CreateRadioButton 0 25u 100% 56u "Remove"
Pop $hwnd
$NSD_OnClick $hwnd ???
nsDialogs::Show
如果用户选择修复按钮,它应该覆盖现有的安装路径,否则卸载现有的安装并继续使用新的。我需要做什么来替换上述代码的 (???)
page custom checkinstall
!insertmacro MUI_PAGE_DIRECTORY
我的下一页是目录选择。所以我需要调用这个页面吗?如何做到这一点?
1.如果用户选择删除按钮,我如何调用uninstaller函数?
Function un.Init, section /o -un.Main UNSEC000,section -un.post UNSE001
这些是安装程序的功能。我如何调用这些功能?我尝试过调用方法,但它不起作用。
【问题讨论】:
【参考方案1】:您需要指定一个回调函数,如nsDialogs documentation,在此示例中查找nsDialogsPageLeave
函数:
!include nsDialogs.nsh
!include LogicLib.nsh
Name nsDialogs
OutFile nsDialogs.exe
XPStyle on
Var Dialog
Var Label
Var Text
Page custom nsDialogsPage nsDialogsPageLeave
Page instfiles
Function nsDialogsPage
nsDialogs::Create 1018
Pop $Dialog
$If $Dialog == error
Abort
$EndIf
$NSD_CreateLabel 0 0 100% 12u "Hello, welcome to nsDialogs!"
Pop $Label
$NSD_CreateText 0 13u 100% -13u "Type something here..."
Pop $Text
$NSD_OnChange $Text nsDialogsPageTextChange
nsDialogs::Show
FunctionEnd
Function nsDialogsPageLeave
$NSD_GetText $Text $0
MessageBox MB_OK "You typed:$\n$\n$0"
FunctionEnd
Function nsDialogsPageTextChange
Pop $1 # $1 == $ Text
$NSD_GetText $Text $0
$If $0 == "hello"
MessageBox MB_OK "right back at ya!"
$EndIf
FunctionEnd
Section
DetailPrint "hello world"
SectionEnd
【讨论】:
thanks.but 如果用户选择删除按钮,我如何调用卸载程序功能?因为 un.Init,section /o -un.Main UNSEC000 这些都是非安装程序的乐趣。我试过 $NSD_OnClick $hwnd un.Init.it 返回错误消息。我也编辑了我的问题。 我猜你不能从安装程序调用 un.Init,但是如果你用WriteUninstaller unistaller.exe
创建卸载程序,你可以用ExecWait "$INSTDIR\uninstall.exe"
调用它以上是关于如何在 NSIS 脚本中使用 REMOVE 或 REPAIR 功能?的主要内容,如果未能解决你的问题,请参考以下文章