
which included commits to RCS files with non-trunk default branches. git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@625 212acab6-be3b-0410-9dea-997c60f758d6
614 lines
14 KiB
HTML
614 lines
14 KiB
HTML
<HTML><HEAD><TITLE>NSIS utility functions</TITLE>
|
|
<BODY>
|
|
<H1>NSIS utility functions</H1>
|
|
<H3>Contents:</H3>
|
|
<UL>
|
|
<li><a href="#General">General utility</a>
|
|
<ul>
|
|
<li><a href="#GetParent">GetParent</a>
|
|
<li><a href="#TrimNewlines">TrimNewlines</a>
|
|
<li><a href="#GetParameters">GetParameters</a>
|
|
<li><a href="#StrStr">StrStr</a>
|
|
</ul>
|
|
<LI><A href="#Versions">System version checking</A>
|
|
<UL>
|
|
<LI><A href="#GetWindowsVersion">GetWindowsVersion</A>
|
|
<LI><A href="#GetIEVersion">GetIEVersion</A>
|
|
<LI><A href="#IsFlashInstalled">IsFlashInstalled</A>
|
|
</UL>
|
|
<LI><A href="#SharedDLL">Shared DLL functions</A>
|
|
<UL>
|
|
<LI><A href="#un.RemoveSharedDLL">un.RemoveSharedDLL</A>
|
|
<LI><A href="#AddSharedDLL">AddSharedDLL</A>
|
|
<LI><A href="#UpgradeDLL">UpgradeDLL</A> (macro)
|
|
</UL>
|
|
|
|
<LI><A href="#Winamp">Winamp functions</A>
|
|
<UL>
|
|
<LI><A href="#GetWinampInstPath">GetWinampInstPath</A>
|
|
<LI><A href="#GetWinampVisPath">GetWinampVisPath</A>
|
|
<LI><A href="#GetWinampDSPPath">GetWinampDSPPath</A>
|
|
<LI><A href="#GetWinampSkinPath">GetWinampSkinPath</A>
|
|
<LI><A href="#CloseWinamp">CloseWinamp</A>
|
|
</UL>
|
|
<LI><A href="#Netscape">Netscape functions</A>
|
|
<UL>
|
|
<LI><A href="#InstallNetscapePlugin">InstallNetscapePlugin</A>
|
|
<LI><A href="#un.RemoveNetscapePlugin">un.RemoveNetscapePlugin</A>
|
|
</UL>
|
|
</UL>
|
|
|
|
<hr>
|
|
<A name=General>General utility: <PRE>
|
|
;<A name=GetParent>------------------------------------------------------------------------------
|
|
; GetParent
|
|
; input, top of stack (i.e. C:\Program Files\Poop)
|
|
; output, top of stack (replaces, with i.e. C:\Program Files)
|
|
; modifies no other variables.
|
|
;
|
|
; Usage:
|
|
; Push "C:\Program Files\Directory\Whatever"
|
|
; Call GetParent
|
|
; Pop $0
|
|
; ; at this point $0 will equal "C:\Program Files\Directory"
|
|
|
|
|
|
Function GetParent
|
|
Exch $0 ; old $0 is on top of stack
|
|
Push $1
|
|
Push $2
|
|
StrCpy $1 -1
|
|
loop:
|
|
StrCpy $2 $0 1 $1
|
|
StrCmp $2 "" exit
|
|
StrCmp $2 "\" exit
|
|
IntOp $1 $1 - 1
|
|
Goto loop
|
|
exit:
|
|
StrCpy $0 $0 $1
|
|
Pop $2
|
|
Pop $1
|
|
Exch $0 ; put $0 on top of stack, restore $0 to original value
|
|
FunctionEnd
|
|
|
|
;<A name=TrimNewlines>------------------------------------------------------------------------------
|
|
; TrimNewlines
|
|
; input, top of stack (i.e. whatever$\r$\n)
|
|
; output, top of stack (replaces, with i.e. whatever)
|
|
; modifies no other variables.
|
|
;
|
|
Function TrimNewlines
|
|
Exch $0
|
|
Push $1
|
|
Push $2
|
|
StrCpy $1 0
|
|
loop:
|
|
IntOp $1 $1 - 1
|
|
StrCpy $2 $0 1 $1
|
|
StrCmp $2 "$\r" loop
|
|
StrCmp $2 "$\n" loop
|
|
IntOp $1 $1 + 1
|
|
|
|
StrCpy $0 $0 $1
|
|
Pop $2
|
|
Pop $1
|
|
Exch $0
|
|
FunctionEnd
|
|
|
|
|
|
|
|
;<A name=GetParameters>------------------------------------------------------------------------------
|
|
; GetParameters
|
|
; input, none
|
|
; output, top of stack (replaces, with i.e. whatever)
|
|
; modifies no other variables.
|
|
|
|
Function GetParameters
|
|
Push $0
|
|
Push $1
|
|
Push $2
|
|
StrCpy $0 $CMDLINE 1
|
|
StrCpy $1 '"'
|
|
StrCpy $2 1
|
|
StrCmp $0 '"' loop
|
|
StrCpy $1 ' ' ; we're scanning for a space instead of a quote
|
|
loop:
|
|
StrCpy $0 $CMDLINE 1 $2
|
|
StrCmp $0 $1 loop2
|
|
StrCmp $0 "" loop2
|
|
IntOp $2 $2 + 1
|
|
Goto loop
|
|
loop2:
|
|
IntOp $2 $2 + 1
|
|
StrCpy $0 $CMDLINE 1 $2
|
|
StrCmp $0 " " loop2
|
|
StrCpy $0 $CMDLINE "" $2
|
|
Pop $2
|
|
Pop $1
|
|
Exch $0
|
|
FunctionEnd
|
|
|
|
;<a name=StrStr>------------------------------------------------------------------------------
|
|
; StrStr
|
|
; input, top of stack = string to search for
|
|
; top of stack-1 = string to search in
|
|
; output, top of stack (replaces with the portion of the string remaining)
|
|
; modifies no other variables.
|
|
;
|
|
; Usage:
|
|
; Push "this is a long ass string"
|
|
; Push "ass"
|
|
; Call StrStr
|
|
; Pop $0
|
|
; ($0 at this point is "ass string")
|
|
|
|
Function StrStr
|
|
Exch $1 ; st=haystack,old$1, $1=needle
|
|
Exch ; st=old$1,haystack
|
|
Exch $2 ; st=old$1,old$2, $2=haystack
|
|
Push $3
|
|
Push $4
|
|
Push $5
|
|
StrLen $3 $1
|
|
StrCpy $4 0
|
|
; $1=needle
|
|
; $2=haystack
|
|
; $3=len(needle)
|
|
; $4=cnt
|
|
; $5=tmp
|
|
loop:
|
|
StrCpy $5 $2 $3 $4
|
|
StrCmp $5 $1 done
|
|
StrCmp $5 "" done
|
|
IntOp $4 $4 + 1
|
|
Goto loop
|
|
done:
|
|
StrCpy $1 $2 "" $4
|
|
Pop $5
|
|
Pop $4
|
|
Pop $3
|
|
Pop $2
|
|
Exch $1
|
|
FunctionEnd
|
|
|
|
</PRE>
|
|
<HR>
|
|
<A name=Versions>System version checking: <PRE>
|
|
<A name=GetWindowsVersion>;------------------------------------------------------------------------------
|
|
; GetWindowsVersion
|
|
;
|
|
; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
|
|
; Returns on top of stack
|
|
;
|
|
; Windows Version (95, 98, ME, NT x.x, 2000)
|
|
; or
|
|
; '' (Unknown Windows Version)
|
|
;
|
|
; Usage:
|
|
; Call GetWindowsVersion
|
|
; Pop $0
|
|
; ; at this point $0 is "NT 4.0" or whatnot
|
|
|
|
Function GetWindowsVersion
|
|
Push $0
|
|
Push $9
|
|
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
|
|
StrCmp $0 "" 0 lbl_winnt
|
|
; we are not NT.
|
|
ReadRegStr $0 HKLM SOFTWARE\Microsoft\Windows\CurrentVersion VersionNumber
|
|
|
|
StrCpy $9 $0 1
|
|
StrCmp $9 '4' 0 lbl_error
|
|
|
|
StrCpy $9 $0 3
|
|
|
|
StrCmp $9 '4.0' lbl_win32_95
|
|
StrCmp $9 '4.9' lbl_win32_ME lbl_win32_98
|
|
|
|
lbl_win32_95:
|
|
StrCpy $0 '95'
|
|
Goto lbl_done
|
|
|
|
lbl_win32_98:
|
|
StrCpy $0 '98'
|
|
Goto lbl_done
|
|
|
|
lbl_win32_ME:
|
|
StrCpy $0 'ME'
|
|
Goto lbl_done
|
|
|
|
lbl_winnt:
|
|
|
|
StrCpy $9 $0 1
|
|
StrCmp $9 '3' lbl_winnt_x
|
|
StrCmp $9 '4' lbl_winnt_x
|
|
StrCmp $9 '5' lbl_winnt_5 lbl_error
|
|
|
|
lbl_winnt_x:
|
|
StrCpy $0 "NT $0" 6
|
|
Goto lbl_done
|
|
|
|
lbl_winnt_5:
|
|
Strcpy $0 '2000'
|
|
Goto lbl_done
|
|
|
|
lbl_error:
|
|
Strcpy $0 ''
|
|
lbl_done:
|
|
Pop $9
|
|
Exch $0
|
|
FunctionEnd
|
|
|
|
<A name=GetIEVersion>;------------------------------------------------------------------------------
|
|
; GetIEVersion
|
|
;
|
|
; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
|
|
; Returns on top of stack
|
|
; 1-6 (Installed IE Version)
|
|
; or
|
|
; '' (IE is not installed)
|
|
;
|
|
; Usage:
|
|
; Call GetIEVersion
|
|
; Pop $0
|
|
; ; at this point $0 is "5" or whatnot
|
|
|
|
Function GetIEVersion
|
|
Push $0
|
|
ClearErrors
|
|
ReadRegStr $0 HKLM "Software\Microsoft\Internet Explorer" "Version"
|
|
IfErrors lbl_123 lbl_456
|
|
|
|
lbl_456: ; ie 4+
|
|
Strcpy $0 $0 1
|
|
Goto lbl_done
|
|
|
|
lbl_123: ; older ie version
|
|
ClearErrors
|
|
ReadRegStr $0 HKLM "Software\Microsoft\Internet Explorer" "IVer"
|
|
IfErrors lbl_error
|
|
|
|
StrCpy $0 $0 3
|
|
StrCmp $0 '100' lbl_ie1
|
|
StrCmp $0 '101' lbl_ie2
|
|
StrCmp $0 '102' lbl_ie2
|
|
|
|
StrCpy $0 '3' ; default to ie3 if not 100, 101, or 102.
|
|
Goto lbl_done
|
|
lbl_ie1:
|
|
StrCpy $0 '1'
|
|
Goto lbl_done
|
|
lbl_ie2:
|
|
StrCpy $0 '2'
|
|
Goto lbl_done
|
|
lbl_error:
|
|
StrCpy $0 ''
|
|
lbl_done:
|
|
Exch $0
|
|
FunctionEnd
|
|
|
|
|
|
<A name=IsFlashInstalled>;------------------------------------------------------------------------------
|
|
; IsFlashInstalled
|
|
;
|
|
; By Yazno, http://yazno.tripod.com/powerpimpit/
|
|
; Returns on top of stack
|
|
; 0 (Flash is not installed)
|
|
; or
|
|
; 1 (Flash is installed)
|
|
;
|
|
; Usage:
|
|
; Call IsFlashInstalled
|
|
; Pop $0
|
|
; ; $0 at this point is "1" or "0"
|
|
|
|
Function IsFlashInstalled
|
|
Push $0
|
|
ClearErrors
|
|
ReadRegStr $0 HKCR "CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}" ""
|
|
IfErrors lbl_na
|
|
StrCpy $0 1
|
|
Goto lbl_end
|
|
lbl_na:
|
|
StrCpy $0 0
|
|
lbl_end:
|
|
Exch $0
|
|
FunctionEnd
|
|
|
|
|
|
</PRE>
|
|
<HR>
|
|
<A name=SharedDLL>Shared DLL functions:
|
|
<PRE><A name="un.RemoveSharedDLL">;------------------------------------------------------------------------------
|
|
; un.RemoveSharedDLL
|
|
;
|
|
; Decrements a shared DLLs reference count, and removes if necessary.
|
|
; Use by passing one item on the stack (the full path of the DLL).
|
|
; Note: for use in the main installer (not the uninstaller), rename the
|
|
; function to RemoveSharedDLL.
|
|
;
|
|
; Usage:
|
|
; Push $SYSDIR\myDll.dll
|
|
; Call un.RemoveShareDLL
|
|
;
|
|
|
|
Function un.RemoveSharedDLL
|
|
Exch $9
|
|
Push $0
|
|
ReadRegDword $0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9
|
|
StrCmp $0 "" remove
|
|
IntOp $0 $0 - 1
|
|
IntCmp $0 0 rk rk uk
|
|
rk:
|
|
DeleteRegValue HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9
|
|
goto Remove
|
|
uk:
|
|
WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9 $0
|
|
Goto noremove
|
|
remove:
|
|
Delete /REBOOTOK $9
|
|
noremove:
|
|
Pop $0
|
|
Pop $9
|
|
FunctionEnd
|
|
|
|
|
|
<A name=AddSharedDLL>;------------------------------------------------------------------------------
|
|
; AddSharedDLL
|
|
;
|
|
; Increments a shared DLLs reference count.
|
|
; Use by passing one item on the stack (the full path of the DLL).
|
|
;
|
|
; Usage:
|
|
; Push $SYSDIR\myDll.dll
|
|
; Call AddSharedDLL
|
|
;
|
|
|
|
Function AddSharedDLL
|
|
Exch $9
|
|
Push $0
|
|
ReadRegDword $0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9
|
|
IntOp $0 $0 + 1
|
|
WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9 $0
|
|
Pop $0
|
|
Pop $9
|
|
FunctionEnd
|
|
|
|
|
|
<A name=UpgradeDLL>;------------------------------------------------------------------------------
|
|
; UpgradeDLL (macro)
|
|
;
|
|
; Updates a DLL (or executable) based on version resource information.
|
|
;
|
|
; Input: param = input source file.
|
|
; top of stack = full path on system to install file to.
|
|
;
|
|
; Output: none (removes full path from stack)
|
|
;
|
|
; Usage:
|
|
;
|
|
; Push "$SYSDIR\atl.dll"
|
|
; !insertmacro UpgradeDLL "atl.dll"
|
|
;
|
|
|
|
!macro UpgradeDLL DLL_NAME
|
|
Exch $0
|
|
Push $1
|
|
Push $2
|
|
Push $3
|
|
Push $4
|
|
ClearErrors
|
|
GetDLLVersionLocal ${DLL_NAME} $1 $2
|
|
GetDLLVersion $0 $3 $4
|
|
IfErrors upgrade_${DLL_NAME}
|
|
IntCmpU $1 $3 "" noupgrade_${DLL_NAME} upgrade_${DLL_NAME}
|
|
IntCmpU $2 $4 noupgrade_${DLL_NAME} noupgrade_${DLL_NAME}
|
|
upgrade_${DLL_NAME}:
|
|
UnRegDLL $0
|
|
File /oname=$0 ${DLL_NAME}
|
|
RegDLL $0
|
|
noupgrade_${DLL_NAME}:
|
|
Pop $4
|
|
Pop $3
|
|
Pop $2
|
|
Pop $1
|
|
Pop $0
|
|
!macroend
|
|
|
|
</PRE>
|
|
<HR>
|
|
<A name=Winamp>Winamp functions: <PRE><A name=GetWinampInstPath>;------------------------------------------------------------------------------
|
|
; GetWinampInstPath
|
|
;
|
|
; takes no parameters
|
|
; returns with the winamp install directory on the stack (it will be
|
|
; an empty string if winamp is not detected).
|
|
;
|
|
; modifies no other variables
|
|
;
|
|
; Usage:
|
|
; Call GetWinampInstPath
|
|
; Pop $0
|
|
; MessageBox MB_OK "Winamp installed at: $0"
|
|
|
|
Function GetWinampInstPath
|
|
Push $0
|
|
Push $1
|
|
Push $2
|
|
ReadRegStr $0 HKLM \
|
|
"Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \
|
|
"UninstallString"
|
|
StrCmp $0 "" fin
|
|
|
|
StrCpy $1 $0 1 0 ; get firstchar
|
|
StrCmp $1 '"' "" getparent
|
|
; if first char is ", let's remove "'s first.
|
|
StrCpy $0 $0 "" 1
|
|
StrCpy $1 0
|
|
rqloop:
|
|
StrCpy $2 $0 1 $1
|
|
StrCmp $2 '"' rqdone
|
|
StrCmp $2 "" rqdone
|
|
IntOp $1 $1 + 1
|
|
Goto rqloop
|
|
rqdone:
|
|
StrCpy $0 $0 $1
|
|
getparent:
|
|
; the uninstall string goes to an EXE, let's get the directory.
|
|
StrCpy $1 -1
|
|
gploop:
|
|
StrCpy $2 $0 1 $1
|
|
StrCmp $2 "" gpexit
|
|
StrCmp $2 "\" gpexit
|
|
IntOp $1 $1 - 1
|
|
Goto gploop
|
|
gpexit:
|
|
StrCpy $0 $0 $1
|
|
|
|
StrCmp $0 "" fin
|
|
IfFileExists $0\winamp.exe fin
|
|
StrCpy $0 ""
|
|
fin:
|
|
Pop $2
|
|
Pop $1
|
|
Exch $0
|
|
FunctionEnd
|
|
|
|
|
|
<A name=GetWinampVisPath>;------------------------------------------------------------------------------
|
|
; GetWinampVisPath
|
|
;
|
|
; requires $INSTDIR to point to the Winamp directory.
|
|
; sets $OUTDIR with vis plug-in path
|
|
;
|
|
; modifies no other variables
|
|
|
|
Function GetWinampVisPath
|
|
ReadINIStr $OUTDIR $INSTDIR\winamp.ini Winamp VisDir
|
|
StrCmp $OUTDIR "" NoINISetting
|
|
IfFileExists $OUTDIR Good
|
|
NoINISetting:
|
|
StrCpy $OUTDIR $INSTDIR\Plugins
|
|
Good:
|
|
FunctionEnd
|
|
|
|
|
|
<A name=GetWinampDSPPath>;------------------------------------------------------------------------------
|
|
; GetWinampDSPPath
|
|
;
|
|
; requires $INSTDIR to point to the Winamp directory.
|
|
; sets $OUTDIR with dsp plug-in path
|
|
;
|
|
; modifies no other variables
|
|
|
|
Function GetWinampDSPPath
|
|
ReadINIStr $OUTDIR $INSTDIR\winamp.ini Winamp DSPDir
|
|
StrCmp $OUTDIR "" NoINISetting
|
|
IfFileExists $OUTDIR Good
|
|
NoINISetting:
|
|
StrCpy $OUTDIR $INSTDIR\Plugins
|
|
Good:
|
|
FunctionEnd
|
|
|
|
<A name=GetWinampSkinPath>;------------------------------------------------------------------------------
|
|
; GetWinampSkinPath
|
|
;
|
|
; requires $INSTDIR to point to the Winamp directory.
|
|
; sets $OUTDIR with skin plug-in path
|
|
;
|
|
; modifies no other variables
|
|
|
|
Function GetWinampSkinPath
|
|
ReadINIStr $OUTDIR $INSTDIR\winamp.ini Winamp SkinDir
|
|
StrCmp $OUTDIR "" NoINISetting
|
|
IfFileExists $OUTDIR Good
|
|
NoINISetting:
|
|
StrCpy $OUTDIR $INSTDIR\Skins
|
|
Good:
|
|
FunctionEnd
|
|
|
|
<A name=CloseWinamp>;------------------------------------------------------------------------------
|
|
; CloseWinamp
|
|
;
|
|
; Closes all running instances of Winamp 1.x/2.x
|
|
;
|
|
; modifies no other variables
|
|
Function CloseWinamp
|
|
Push $0
|
|
loop:
|
|
FindWindow $0 "Winamp v1.x"
|
|
IntCmp $0 0 done
|
|
SendMessage $0 16 0 0
|
|
Sleep 100
|
|
Goto loop
|
|
done:
|
|
Pop $0
|
|
FunctionEnd
|
|
|
|
|
|
</PRE>
|
|
<HR>
|
|
<A name=Netscape>Netscape functions: <PRE>
|
|
<A name=InstallNetscapePlugin>;------------------------------------------------------------------------------
|
|
; InstallNetscapePlugin
|
|
;
|
|
; Replace 'mynetscapeplugin.dll' with the name of your DLL to extract.
|
|
;
|
|
; (pretty much untested, but should work)
|
|
;
|
|
; you may want to add is-netscape-running and error checking (if the file isn't writable)
|
|
|
|
Function InstallNetscapePlugin
|
|
Push $OUTDIR
|
|
Push $0
|
|
Push $1
|
|
StrCpy $0 0
|
|
outer_loop:
|
|
EnumRegKey $1 HKLM "Software\Netscape\Netscape Navigator" $0
|
|
StrCmp $1 "" abort
|
|
ReadRegStr $1 HKLM "Software\Netscape\Netscape Navigator\$1\Main" "Plugins Directory"
|
|
StrCmp $1 "" abort
|
|
SetOutPath $1
|
|
File mynetscapeplugin.dll
|
|
IntOp $0 $0 + 1
|
|
Goto outer_loop
|
|
abort:
|
|
Pop $1
|
|
Pop $0
|
|
Pop $OUTDIR
|
|
FunctionEnd
|
|
|
|
<A name=RemoveNetscapePlugin>;------------------------------------------------------------------------------
|
|
; un.RemoveNetscapePlugin
|
|
;
|
|
; input: top of stack = dll name of plugin to remove
|
|
; output: none
|
|
;
|
|
; Usage:
|
|
; Push mynetscapepluging.dll
|
|
; Call un.RemoveNetscapePlugin
|
|
;
|
|
; you may want to add is-netscape-running and error checking (if the delete doesn't work).
|
|
|
|
|
|
Function un.RemoveNetscapePlugin
|
|
Exch $2
|
|
Push $0
|
|
Push $1
|
|
StrCpy $0 0
|
|
outer_loop:
|
|
EnumRegKey $1 HKLM "Software\Netscape\Netscape Navigator" $0
|
|
StrCmp $1 "" abort
|
|
ReadRegStr $1 HKLM "Software\Netscape\Netscape Navigator\$1\Main" "Plugins Directory"
|
|
StrCmp $1 "" abort
|
|
Delete /REBOOTOK $1\$2
|
|
IntOp $0 $0 + 1
|
|
Goto outer_loop
|
|
abort:
|
|
Pop $1
|
|
Pop $0
|
|
Pop $2
|
|
FunctionEnd
|
|
|
|
|
|
</PRE></A></BODY></HTML>
|