UninstallMSI Function: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
(Function to Uninstall an MSI installation)
 
No edit summary
Line 4: Line 4:


==Includes Required==
==Includes Required==
[https://nsis.sourceforge.io/Registry_plug-in Registry]
*[https://nsis.sourceforge.io/Registry_plug-in Registry]
[https://nsis.sourceforge.io/LogicLib LogicLib]
*[https://nsis.sourceforge.io/LogicLib LogicLib]
x64
*x64
StrFunc (Be sure to initialize StrRep earlier in your installer
*StrFunc (Be sure to initialize StrRep earlier in your installer)


==Function==
==Function==

Revision as of 20:12, 22 April 2020

Author: Faroguy (talk, contrib)


Description

I needed to have a robust function that would uninstall an arbitrary MSI installation. The other solution provided did not work because I did not know the GUID of the application, only its name.

Includes Required

  • Registry
  • LogicLib
  • x64
  • StrFunc (Be sure to initialize StrRep earlier in your installer)

Function

Function UninstallMSI
Exch $R0
Push $0
Push $1
Push $2
Push $3
Push $4
Push $5
Push $6
 
${If} ${RunningX64}
    Setregview 64
    StrCpy $0 "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
  ${Else}
    Setregview 32
    StrCpy $0 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
  ${EndIf}
  ${registry::Open} "$0" "/NI='$R0' /K=0 /T=REG_SZ" $1
  StrCpy $6 0
  ${While} $6 < 1
	  ${registry::Find} $1 $2 $3 $4 $5
	  ${If} $3 == "DisplayName"
	  ${AndIf} $4 == "$R0"
		StrCpy $6 1
	  ${EndIf}
	  ${If} $5 == ""
	    StrCpy $6 1
	  ${EndIf}
  ${EndWhile}
  ${registry::Read} "HKEY_LOCAL_MACHINE\$2" "UninstallString" $4 $5
  Push $4
  Push '/I'
  Push '/quiet /x'
  Call StrRep
  Pop $4
 
  ${If} $2 == ""
  ${OrIf} $4 == ""
    Goto msifail
  ${EndIf}
  ExecWait '$4'
  msifail:
  ${registry::Close} $1
 
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
Pop $R0
 
EndFunction

To call the function all you need to do is this:

Push "MyOldMSIName"
Call UninstallMSI