我正在使用NSIS为程序创build安装程序,检测此程序是否已安装的最佳方法是什么? 另外,由于我从autorun.inf运行安装程序,如果find已安装的副本,是否可以立即退出安装程序? 有一个更好的方法吗?
这个怎么样。 我在一个旧的NSIS脚本中放置了这个。
; Check to see if already installed ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<YOUR-APP-NAME>" "UninstallString" IfFileExists $R0 +1 NotInstalled messagebox::show MB_DEFBUTTON4|MB_TOPMOST "<YOUR-APP-NAME>" \ "0,103" \ "<YOUR-APP-NAME> is already installed." \ "Launch Uninstall" "Cancel" Pop $R1 StrCmp $R1 2 Quit +1 Exec $R0 Quit: Quit NotInstalled:
我一直在使用一个稍微复杂的测试,它也检查已安装软件的版本:
!define PRODUCT_VERSION "1.2.0" !include "WordFunc.nsh" !insertmacro VersionCompare Var UNINSTALL_OLD_VERSION ... Section "Core System" CoreSystem StrCmp $UNINSTALL_OLD_VERSION "" core.files ExecWait '$UNINSTALL_OLD_VERSION' core.files: ... WriteRegStr HKLM "Software\${PRODUCT_REG_KEY}" "" $INSTDIR WriteRegStr HKLM "Software\${PRODUCT_REG_KEY}" "Version" "${PRODUCT_VERSION}" ... SectionEnd ... Function .onInit ;Check earlier installation ClearErrors ReadRegStr $0 HKLM "Software\${PRODUCT_REG_KEY}" "Version" IfErrors init.uninst ; older versions might not have "Version" string set ${VersionCompare} $0 ${PRODUCT_VERSION} $1 IntCmp $1 2 init.uninst MessageBox MB_YESNO|MB_ICONQUESTION "${PRODUCT_NAME} version $0 seems to be already installed on your system.$\nWould you like to proceed with the installation of version ${PRODUCT_VERSION}?" \ IDYES init.uninst Quit init.uninst: ClearErrors ReadRegStr $0 HKLM "Software\${PRODUCT_REG_KEY}" "" IfErrors init.done StrCpy $UNINSTALL_OLD_VERSION '"$0\uninstall.exe" /S _?=$0' init.done: FunctionEnd
你当然必须填写细节,这只会给你一个粗略的骨架。
创建卸载程序后,在注册表中创建一个产品名称条目
!define PRODUCT_UNINST_ROOT_KEY "HKLM" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANY_NAME} ${PRODUCT_NAME}" Section -Post SetShellVarContext current WriteUninstaller "${UNINST_PATH}\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
看看是否安装了产品
Function IsProductInstalled ClearErrors ReadRegStr $2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" StrCmp $2 "" exit
在卸载你应该做的
Section Uninstall DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
这通常是通过让NSIS在安装时为您的产品插入注册表项来完成的。 这是一个简单的方法来检测,如果该注册表项是否存在,如果是的话,保释