Add uninstall information to Add/Remove Programs: Difference between revisions
No edit summary |
|||
Line 1: | Line 1: | ||
{{PageAuthor|Konrad}} | {{PageAuthor|Konrad}} | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
== How To Use == | == How To Use == | ||
Line 9: | Line 11: | ||
Write a value using the WriteRegStr command (for strings) or WriteRegDWORD command (for DWORD values). | Write a value using the WriteRegStr command (for strings) or WriteRegDWORD command (for DWORD values). | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
Example: | Example: | ||
Line 16: | Line 22: | ||
"DisplayName" "Application Name" | "DisplayName" "Application Name" | ||
</highlight-nsis> | </highlight-nsis> | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
== Required values == | == Required values == | ||
Line 23: | Line 33: | ||
Consider this example. Your company is called 'Great Northern Software Co' and you are installing their latest super software 'Image Maker'. What you want to do is to have a new key created in the Software\Microsoft\Windows\CurrentVersion\Uninstall section of HKLM. The key will be the name of the software, and it will have two subkeys, one with the display name of the software and the other the location of the uninstall program. | Consider this example. Your company is called 'Great Northern Software Co' and you are installing their latest super software 'Image Maker'. What you want to do is to have a new key created in the Software\Microsoft\Windows\CurrentVersion\Uninstall section of HKLM. The key will be the name of the software, and it will have two subkeys, one with the display name of the software and the other the location of the uninstall program. | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
<highlight-nsis> | <highlight-nsis> | ||
Line 34: | Line 48: | ||
Two things to point out. First, you must use backslashes. I do a lot of Java/Unix work, so I need to make this clear. And second, you should add a delete key command to your uninstaller section, so the name will be removed from the list when your uninstaller completes. If you don't do this your name will still be there, but windows will see this as a problem (ie it will say the entry is corrupt). | Two things to point out. First, you must use backslashes. I do a lot of Java/Unix work, so I need to make this clear. And second, you should add a delete key command to your uninstaller section, so the name will be removed from the list when your uninstaller completes. If you don't do this your name will still be there, but windows will see this as a problem (ie it will say the entry is corrupt). | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
<highlight-nsis> | <highlight-nsis> | ||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ImageMaker" | DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ImageMaker" | ||
</highlight-nsis> | </highlight-nsis> | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
== Recommended values == | == Recommended values == | ||
*''QuietUninstallString'' (string) - Path and filename of the uninstaller and also a switch that uninstalls without a visible window. Most corporations need to install and uninstall silently. This ability should be included whenever possible. Similar to UninstallString, you should '''always''' quote the path to make sure spaces in the path will not disrupt Windows to find the uninstaller. | *''QuietUninstallString'' (string) - Path and filename of the uninstaller and also a switch that uninstalls without a visible window. Most corporations need to install and uninstall silently. This ability should be included whenever possible. Similar to UninstallString, you should '''always''' quote the path to make sure spaces in the path will not disrupt Windows to find the uninstaller. | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
<highlight-nsis> | <highlight-nsis> | ||
Line 46: | Line 72: | ||
"QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" | "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" | ||
</highlight-nsis> | </highlight-nsis> | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
== Optional values == | == Optional values == | ||
Line 92: | Line 122: | ||
*''ParentKeyName'' (string) - If the program is an update of a parent program, specify the parent program subkey name. If "OperatingSystem", it's an update for Windows. | *''ParentKeyName'' (string) - If the program is an update of a parent program, specify the parent program subkey name. If "OperatingSystem", it's an update for Windows. | ||
*''ParentDisplayName'' (string) - If the program is an update of a parent program, specify the parent program name (as specified on the parent's "DisplayName"). | *''ParentDisplayName'' (string) - If the program is an update of a parent program, specify the parent program name (as specified on the parent's "DisplayName"). | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
== Computing EstimatedSize == | == Computing EstimatedSize == | ||
Line 99: | Line 133: | ||
'''Method 1:''' Use ${GetSize} to fill in the EstimatedSize value. | '''Method 1:''' Use ${GetSize} to fill in the EstimatedSize value. | ||
This assumes the simple case where there is one main directory with most of your files (including subdirs): | This assumes the simple case where there is one main directory with most of your files (including subdirs): | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
<highlight-nsis> | <highlight-nsis> | ||
Line 114: | Line 152: | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | </highlight-nsis> | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
'''Method 2:''' Compute the sum of all components installed sizes. This method is much faster, especialy for a large program, but it requires correct size info stored in the section itself. For example, if the section generates large data files in the install directory, and these files are not included via ''File'' but generated at installer runtime, then you need to account for the extra space using ''AddSize'' | '''Method 2:''' Compute the sum of all components installed sizes. This method is much faster, especialy for a large program, but it requires correct size info stored in the section itself. For example, if the section generates large data files in the install directory, and these files are not included via ''File'' but generated at installer runtime, then you need to account for the extra space using ''AddSize'' | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
<highlight-nsis> | <highlight-nsis> | ||
Line 146: | Line 192: | ||
FunctionEnd | FunctionEnd | ||
</highlight-nsis> | </highlight-nsis> | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
== With a MultiUser Installer == | == With a MultiUser Installer == | ||
Line 179: | Line 229: | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | </highlight-nsis> | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
Key points (see also [http://forums.winamp.com/showthread.php?t=289071 this forum thread]): | Key points (see also [http://forums.winamp.com/showthread.php?t=289071 this forum thread]): | ||
* use SHCTX (SHELL_CONTEXT) instead of HKLM; SHCTX will be either HKLM (when installing for all users) or HKCU (when installing for the current user) | * use SHCTX (SHELL_CONTEXT) instead of HKLM; SHCTX will be either HKLM (when installing for all users) or HKCU (when installing for the current user) | ||
* the $MultiUser.InstallMode variable is either AllUsers or CurrentUser; passing it as part of the uninstall string lets the uninstaller know whether it should remove the uninstall key from HKLM or HKCU; in order to make this work, you have to define MULTIUSER_INSTALLMODE_COMMANDLINE | * the $MultiUser.InstallMode variable is either AllUsers or CurrentUser; passing it as part of the uninstall string lets the uninstaller know whether it should remove the uninstall key from HKLM or HKCU; in order to make this work, you have to define MULTIUSER_INSTALLMODE_COMMANDLINE | ||
'''Source(s):''' [http://www.downloadranking.com Programs solutions] | |||
[[Category:Tutorials]] | [[Category:Tutorials]] |
Revision as of 02:10, 30 March 2013
Author: Konrad (talk, contrib) |
Source(s): Programs solutions
How To Use
Create a key with your product name under HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall to add entries to the "Add/Remove Programs" section in the Control Panel.
For Windows NT (NT4/2000/XP), it's also possible to create the key in the HKCU hive, so it will only appear for the current user.
There are several values you can write to the key to give additional information about your application and the uninstaller.
Write a value using the WriteRegStr command (for strings) or WriteRegDWORD command (for DWORD values).
Source(s): Programs solutions
Example:
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Product" \ "DisplayName" "Application Name"
Source(s): Programs solutions
Required values
- DisplayName (string) - Name of the application
- UninstallString (string) - Path and filename of the uninstaller. You should always quote the path to make sure spaces in the path will not disrupt Windows to find the uninstaller. To escape quotes, use single quotes unless a variables is included, in which case an escape sequence will have to be used. The escape sequence is this: $\
Consider this example. Your company is called 'Great Northern Software Co' and you are installing their latest super software 'Image Maker'. What you want to do is to have a new key created in the Software\Microsoft\Windows\CurrentVersion\Uninstall section of HKLM. The key will be the name of the software, and it will have two subkeys, one with the display name of the software and the other the location of the uninstall program.
Source(s): Programs solutions
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ImageMaker" \ "DisplayName" "Image Maker -- super software from Great Northern" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ImageMaker" \ "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
Once these are executed you will see the display name appear in the Add/Remove programs section of control panel.
Two things to point out. First, you must use backslashes. I do a lot of Java/Unix work, so I need to make this clear. And second, you should add a delete key command to your uninstaller section, so the name will be removed from the list when your uninstaller completes. If you don't do this your name will still be there, but windows will see this as a problem (ie it will say the entry is corrupt).
Source(s): Programs solutions
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ImageMaker"
Source(s): Programs solutions
Recommended values
- QuietUninstallString (string) - Path and filename of the uninstaller and also a switch that uninstalls without a visible window. Most corporations need to install and uninstall silently. This ability should be included whenever possible. Similar to UninstallString, you should always quote the path to make sure spaces in the path will not disrupt Windows to find the uninstaller.
Source(s): Programs solutions
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ImageMaker" \ "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
Source(s): Programs solutions
Optional values
See here for a more detailed description and hints.
Supported on: Windows XP, but note that it is perfectly allowed to add these entries to older versions of windows also, the additional info just does not show up.
- InstallLocation (string) - Installation directory ($INSTDIR)
- DisplayIcon (string) - Path, filename and index of of the icon that will be displayed next to your application name
- Publisher (string) - (Company) name of the publisher
- ModifyPath (string) - Path and filename of the application modify program
- InstallSource (string) - Location where the application was installed from
- ProductID (string) - Product ID of the application
- Readme (string) - Path (File or URL) to readme information
- RegOwner (string) - Registered owner of the application
- RegCompany (string) - Registered company of the application
- HelpLink (string) - Link to the support website
- HelpTelephone (string) - Telephone number for support
- URLUpdateInfo (string) - Link to the website for application updates
- URLInfoAbout (string) - Link to the application home page
- DisplayVersion (string) - Displayed version of the application
- VersionMajor (DWORD) - Major version number of the application
- VersionMinor (DWORD) - Minor version number of the application
- NoModify (DWORD) - 1 if uninstaller has no option to modify the installed application
- NoRepair (DWORD) - 1 if the uninstaller has no option to repair the installation
- SystemComponent (DWORD) - Set 1 to prevents display of the application in the Programs List of the Add/Remove Programs in the Control Panel.
- EstimatedSize (DWORD) - The size of the installed files (in KB)
- Comments (string) - A comment describing the installer package
If both NoModify and NoRepair are set to 1, the button displays "Remove" instead of "Modify/Remove".
Supported on: Windows XP Service Pack 2.
- ParentKeyName (string) - If the program is an update of a parent program, specify the parent program subkey name. If "OperatingSystem", it's an update for Windows.
- ParentDisplayName (string) - If the program is an update of a parent program, specify the parent program name (as specified on the parent's "DisplayName").
Source(s): Programs solutions
Computing EstimatedSize
It's strongly recomended to include an EstimatedSize field in your unninstall entry, so that correct size information appears in the "Add or Remove Programs" applet. Without such an entry Windows will turn to guessing, and the heuristics involved are quite fragile.
Method 1: Use ${GetSize} to fill in the EstimatedSize value. This assumes the simple case where there is one main directory with most of your files (including subdirs):
Source(s): Programs solutions
!define ARP "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" !include "FileFunc.nsh" Section "Install" ; [...copy all files here, before GetSize...] ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 IntFmt $0 "0x%08X" $0 WriteRegDWORD HKLM "${ARP}" "EstimatedSize" "$0" SectionEnd
Source(s): Programs solutions
Method 2: Compute the sum of all components installed sizes. This method is much faster, especialy for a large program, but it requires correct size info stored in the section itself. For example, if the section generates large data files in the install directory, and these files are not included via File but generated at installer runtime, then you need to account for the extra space using AddSize
Source(s): Programs solutions
!include LogicLib.nsh ; Return on top of stack the total size of the selected (installed) sections, formated as DWORD ; Assumes no more than 256 sections are defined Var GetInstalledSize.total Function GetInstalledSize Push $0 Push $1 StrCpy $GetInstalledSize.total 0 ${ForEach} $1 0 256 + 1 ${if} ${SectionIsSelected} $1 SectionGetSize $1 $0 IntOp $GetInstalledSize.total $GetInstalledSize.total + $0 ${Endif} ; Error flag is set when an out-of-bound section is referenced ${if} ${errors} ${break} ${Endif} ${Next} ClearErrors Pop $1 Pop $0 IntFmt $GetInstalledSize.total "0x%08X" $GetInstalledSize.total Push $GetInstalledSize.total FunctionEnd
Source(s): Programs solutions
With a MultiUser Installer
For an MultiUser installer (that is, one that can install the application for all users or for only the current user), you can't always write to HKLM. To get around this, you can do something like the following:
!define UNINST_KEY \ "Software\Microsoft\Windows\CurrentVersion\Uninstall\ImageMaker" ; ... !define MULTIUSER_INSTALLMODE_COMMANDLINE ; ... !include "MultiUser.nsh" ; ... Section "Install" ; ... WriteRegStr SHCTX "${UNINST_KEY}" "DisplayName" "Image Maker" WriteRegStr SHCTX "${UNINST_KEY}" "UninstallString" \ "$\"$INSTDIR\uninstall.exe$\" /$MultiUser.InstallMode" WriteRegStr SHCTX "${UNINST_KEY}" "QuietUninstallString" \ "$\"$INSTDIR\uninstall.exe$\" /$MultiUser.InstallMode /S" WriteUninstaller $INSTDIR\uninstall.exe ; ... SectionEnd Section "Uninstall" ; ... DeleteRegKey SHCTX "${UNINST_KEY}" SectionEnd
Source(s): Programs solutions
Key points (see also this forum thread):
- use SHCTX (SHELL_CONTEXT) instead of HKLM; SHCTX will be either HKLM (when installing for all users) or HKCU (when installing for the current user)
- the $MultiUser.InstallMode variable is either AllUsers or CurrentUser; passing it as part of the uninstall string lets the uninstaller know whether it should remove the uninstall key from HKLM or HKCU; in order to make this work, you have to define MULTIUSER_INSTALLMODE_COMMANDLINE
Source(s): Programs solutions