Skip to content
⌘ NSIS Forum Archive

Migrating from MSI: uninstall previous version of application

12 posts

joostn#

Migrating from MSI: uninstall previous version of application

Hi,

I'm sure I'm not the first one migrating from MSI to NSIS.. Anyone have an example how to uninstall the previous version of my application, that was installed using MSI, from an NSIS installer which installs the new version of my application?

Thanks
Joost
psyke#
Hi Joost. 🙂

Hmmm I can't say for certain if this will help, but you should be able to at least start the uninstall from NSIS with the following command:
ExecWait '"msiexec.exe" /x Example.msi' 
The reason I emphasized start is that, provided everything is ok the uninstaller will launch, but if msiexec simply does a little bit and then forks or starts doing the real uninstall work from some temp executable, execwait will return 'early' as far as you're concerned.

This is actually correct behaviour, ExecWait will wait for msiexec.exe to finish... but you want the *uninstaller* to finish, and msiexec.exe may not be active for the entire duration of the uninstall.

Anyway, just test out the command and see how it goes. 🙂

If you need more info on MSI (which I doubt since you made the MSI installer, but anyway) here's where I found info on the command line parameters to msiexec.

Salaam/Peace.
joostn#
Hi Psyke,

Thanks for the feedback. I need to do a few more things:

1. find out whether msiexec actually exists on the computer (older Windows versions didn't have MSI)

2. find out whether my program was installed or not

Both could probably be determined from the registry, but before I try to reinvent the wheel, I hope that someone has a ready-cooked example..

Thanks
Joost
joostn#
Okay, it wasn't that difficult after all:

Function UninstallMSI
; $R0 should contain the GUID of the application
push $R1
ReadRegStr $R1 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$R0" \
"UninstallString" ;UninstallString
StrCmp $R1 "" UninstallMSI_nomsi
MessageBox MB_YESNOCANCEL|MB_ICONQUESTION \
"A previous version of ${MUI_PRODUCT} was found.\
It is recommended that you uninstall it first.$\n$\n\
Do you want to do that now?" IDNO UninstallMSI_nomsi IDYES UninstallMSI_yesmsi
Abort
UninstallMSI_yesmsi:
ExecWait '"msiexec.exe" /x $R0'
MessageBox MB_OK|MB_ICONINFORMATION \
"Click OK to continue upgrading your version of ${MUI_PRODUCT}"
UninstallMSI_nomsi:
pop $R1
FunctionEnd
From the main Section I then do the following:

push $R0
StrCpy $R0 "{48E5A72D-whatever-xxxx}"
Call UninstallMSI
pop $R0
In my case I had to do this for every product code for each previous version of my application.

NSIS is really great!!

Joost
psyke#
hey Joost, you're quite welcome, wish I could've been more help. 🙂

NSIS is indeed, great. 😁 I'm glad to see you were able to come up with a straightforward way to do what you needed.

There wasn't a cooked example ready for you, but now that you've done the 'cooking' someone down the road will probably benefit from it. 😉

Salaam/Peace.
kichik#
Thank you for your addition. To make your code easier to use, and more standard you can use Exch instead of Push, StrCpy, Call, Pop. For example:

Function PrintParm
  Exch $0 # parm
  DetailPrint $0
  Pop $0
FunctionEnd
#...
Push "print this"
Call PrintParm 
RossW#edited
Thanks Jason, but what section can I find this code?

Never mind. Found it at http://nsis.sourceforge.net/Uninstalling_a_previous_MSI
onad#
This included delphi file might be of help for some...
at least it is of help for me uninstalling MSI 😉