NSIS/Examples/functions.htm
kichik 3e9e73ec59 This commit was generated by cvs2svn to compensate for changes in r2,
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
2002-08-02 10:01:35 +00:00

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>