scriptable-client-installers/tools/Examples/System/System.nsi
2023-12-15 16:09:19 -05:00

162 lines
5.1 KiB
Plaintext

; This is just an example of System Plugin
;
; (c) brainsucker, 2002
; (r) BSForce
Name "System Plugin Example"
OutFile "System.exe"
RequestExecutionLevel User
Unicode True
!include "SysFunc.nsh"
Section "ThisNameIsIgnoredSoWhyBother?"
SetOutPath $TEMP
; ----- Sample 1 ----- Message box with custom icon -----
; there are no default beeps for custom message boxes, use sysMessageBeep
; in case you need it (see next message box example)
!insertmacro smMessageBox "i 0" "Message box with custom icon!" "System Example 1a" ${MB_OK} "i 103"
; i 0 - installer exe as module
; i 103 - icon ID
; The same example but using icon from resource.dll.
; You could use this dll for storing your resources, just replace FAR icon
; with something you really need.
File "Resource.dll"
System::Call '${sysMessageBeep} (${MB_ICONHAND})' ; custom beep
!insertmacro smMessageBox "`$TEMP\resource.dll`" "Message box with custom icon from resource.dll!" "System Example 1b" ${MB_OKCANCEL} "i 103"
Delete $TEMP\resource.dll
; ----- Sample 2 ----- Fixed disks size/space -----
StrCpy $7 ' Disk, Size, Free, Free for user:$\n$\n'
; Memory for paths
System::StrAlloc 1024
Pop $1
; Get drives
System::Call '${sysGetLogicalDriveStrings}(1024, r1)'
enumok:
; One more drive?
System::Call '${syslstrlen}(i r1) .r2'
IntCmp $2 0 enumex
; Is it DRIVE_FIXED?
System::Call '${sysGetDriveType} (i r1) .r3'
StrCmp $3 ${DRIVE_FIXED} 0 enumnext
; Drive space
System::Call '${sysGetDiskFreeSpaceEx}(i r1, .r3, .r4, .r5)'
; Pretty KBs will be saved on stack
System::Int64Op $3 / 1048576
System::Int64Op $5 / 1048576
System::Int64Op $4 / 1048576
; Get pretty drive path string
System::Call '*$1(&t1024 .r6)'
System::Call '${syswsprintf} (.r7, "%s%20s %20s mb %20s mb %20s mb$\n", tr7, tr6, ts, ts, ts)'
enumnext:
; Next drive path
IntOp $2 $2 * ${NSIS_CHAR_SIZE}
IntOp $1 $1 + $2
IntOp $1 $1 + ${NSIS_CHAR_SIZE}
goto enumok
enumex: ; End of drives or user cancel
; Free memory for paths
System::Free $1
; Message box
System::Call '${sysMessageBox}($HWNDPARENT, s, "System Example 2", ${MB_OKCANCEL})' "$7"
; ----- Sample 3 ----- Direct proc definition -----
; Direct specification demo
System::Call 'user32::MessageBox(p $HWNDPARENT, t "Just direct MessageBox specification demo ;)", t "System Example 3", i ${MB_OK}) i.s'
Pop $0
; ----- Sample 4 ----- Int64, mixed definition demo -----
; Long int demo
StrCpy $2 "12312312"
StrCpy $3 "12345678903"
System::Int64Op $2 "*" $3
Pop $4
; Cdecl demo (uses 3 definitions (simple example))
System::Call "${syswsprintf}(.R1, s,,, t, ir0) .R0 (,,tr2,tr3,$4_)" "Int64 ops and strange definition demo, %s x %s == %s, and previous msgbox result = %d"
MessageBox MB_OKCANCEL "Cool: '$R1'"
; ----- Sample 5 ----- Small structure example -----
; Create & Fill structure
System::Call "*(i 123123123, &t10 'Hello', &i1 0x123dd, &i2 0xffeeddccaa) i.s"
Pop $1
; Read data from structure
System::Call "*$1(i .r2, &t10 .r3, &i1 .r4, &i2 .r5, &l0 .r6)"
; Show data and delete structure
MessageBox MB_OK "Structure example: $\nint == $2 $\nstring == $3 $\nbyte == $4 $\nshort == $5 $\nsize == $6"
System::Free $1
; ----- Sample 6 ----- systemGetFileSysTime demo -----
Call GetInstallerExeName
pop $0
!insertmacro smGetFileSysTime $0
System::Call '*$R0${stSYSTEMTIME}(.r1, .r2, .r3, .r4, .r5, .r6, .r7, .r8)'
MessageBox MB_OK "GetFileSysTime example: file '$0', year $1, month $2, dow $3, day $4, hour $5, min $6, sec $7, ms $8"
; free memory from SYSTEMTIME
System::Free $R0
; ----- Sample 7 ----- systemSplash -> Callbacks demonstration -----
; Logo
File /oname=spltmp.bmp "${NSISDIR}\Contrib\Graphics\Header\orange-nsis.bmp"
; File /oname=spltmp.wav "d:\Windows\Media\tada.wav"
; I. systemSplash variant
!insertmacro smSystemSplash 2000 "$TEMP\spltmp"
; II. Splash Plugin variant
; splash::show 2000 $TEMP\spltmp
; Pop $R0 ; $R0 has '1' if the user closed the splash screen early,
; remove logo
Delete $TEMP\spltmp.bmp
; Delete $TEMP\spltmp.wav
; Display splash result
pop $0
MessageBox MB_OK "Splash (callbacks) demo result $R0"
SectionEnd
Section "Quoted path"
!define /IfNDef CSIDL_FONTS 0x14
StrCpy $9 "$PluginsDir\N(S # I)S" ; Directory with '(', ' ', '#' or ')' needs to be quoted
CreateDirectory "$9"
CopyFiles /Silent /FilesOnly "$sysdir\shfolder.dll" "$9\" ; This could fail on 95 & NT4?
System::Call '"$9\shfolder.dll"::SHGetFolderPathA(p $hWndParent, i ${CSIDL_FONTS}, p 0, i 0, m "?" r1) ?u'
DetailPrint Fonts=$1
SectionEnd
Section "Ordinal"
System::Call 'OLEAUT32::#2(w "OLE string")p.r0' ; SysAllocString
System::Call 'USER32::MessageBoxW(p $hWndParent, p r0, w "OLE:", i 0)'
System::Call 'OLEAUT32::#6(p r0)'
SectionEnd
; eof