Talk:NSIS Service Lib: Difference between revisions
No edit summary |
No edit summary |
||
Line 57: | Line 57: | ||
: Correct. I've applied the fix, thanks. | : Correct. I've applied the fix, thanks. | ||
: --[[User:Kichik|kichik]] 10:34, 23 February 2006 (PST) | : --[[User:Kichik|kichik]] 10:34, 23 February 2006 (PST) | ||
I use this patch to avoid some possible quote problem and that add a setdesc to set description | |||
(CreateService threat empty dependencies and empty password as NULLs) | |||
Also I used some Unicode versions instead of ANSI | |||
--- C:\myprog\srv\PopupService\installer\mao.nsh Thu Dec 14 15:27:41 2006 | |||
+++ C:\myprog\srv\PopupService\installer\servicelib.nsh Thu Dec 14 15:25:31 2006 | |||
@@ -20,10 +20,11 @@ | |||
; interact - interact with the desktop ie. 1|0 | |||
; depend - service dependencies | |||
; user - user that runs the service | |||
; password - password of the above user | |||
; display - display name in service's console | |||
+; setdesc - set service description | |||
; | |||
; delete - deletes a windows service | |||
; start - start a stopped windows service | |||
; stop - stops a running windows service | |||
; pause - pauses a running windows service | |||
@@ -164,11 +165,11 @@ | |||
StrCpy $0 "false" | |||
System::Call 'advapi32::OpenSCManagerA(n, n, i ${SC_MANAGER_ALL_ACCESS}) i.r4' | |||
IntCmp $4 0 lbl_done | |||
StrCmp $3 "create" lbl_create | |||
- System::Call 'advapi32::OpenServiceA(i r4, t r2, i ${SERVICE_ALL_ACCESS}) i.r5' | |||
+ System::Call 'advapi32::OpenServiceW(i r4, w r2, i ${SERVICE_ALL_ACCESS}) i.r5' | |||
IntCmp $5 0 lbl_done | |||
lbl_select: | |||
StrCmp $3 "delete" lbl_delete | |||
StrCmp $3 "start" lbl_start | |||
@@ -176,10 +177,11 @@ | |||
StrCmp $3 "pause" lbl_pause | |||
StrCmp $3 "continue" lbl_continue | |||
StrCmp $3 "installed" lbl_installed | |||
StrCmp $3 "running" lbl_running | |||
StrCmp $3 "status" lbl_status | |||
+ StrCmp $3 "setdesc" lbl_setdesc | |||
Goto lbl_done | |||
; create service | |||
lbl_create: | |||
Push $R1 ;depend | |||
@@ -187,25 +189,24 @@ | |||
Push $R3 ;password | |||
Push $R4 ;interact | |||
Push $R5 ;autostart | |||
Push $R6 ;path | |||
Push $R7 ;display | |||
+ Push $R8 ;user type | |||
- !insertmacro CALL_GETPARAM $R1 "depend" "n" "lbl_depend" | |||
- StrCpy $R1 't "$R1"' | |||
+ !insertmacro CALL_GETPARAM $R1 "depend" "" "lbl_depend" | |||
lbl_depend: | |||
- StrCmp $R1 "n" 0 lbl_machine ;old name of depend param | |||
- !insertmacro CALL_GETPARAM $R1 "machine" "n" "lbl_machine" | |||
- StrCpy $R1 't "$R1"' | |||
+ StrCmp $R1 "" 0 lbl_machine ;old name of depend param | |||
+ !insertmacro CALL_GETPARAM $R1 "machine" "" "lbl_machine" | |||
lbl_machine: | |||
+ StrCpy $R8 "n" | |||
!insertmacro CALL_GETPARAM $R2 "user" "n" "lbl_user" | |||
- StrCpy $R2 't "$R2"' | |||
+ StrCpy $R8 "w R2" | |||
lbl_user: | |||
- !insertmacro CALL_GETPARAM $R3 "password" "n" "lbl_password" | |||
- StrCpy $R3 't "$R3"' | |||
+ !insertmacro CALL_GETPARAM $R3 "password" "" "lbl_password" | |||
lbl_password: | |||
!insertmacro CALL_GETPARAM $R4 "interact" "0x10" "lbl_interact" | |||
StrCpy $6 0x10 | |||
IntCmp $R4 0 +2 | |||
@@ -224,21 +225,32 @@ | |||
lbl_path: | |||
!insertmacro CALL_GETPARAM $R7 "display" "$2" "lbl_display" | |||
lbl_display: | |||
- System::Call 'advapi32::CreateServiceA(i r4, t r2, t R7, i ${SERVICE_ALL_ACCESS}, \ | |||
- i R4, i R5, i 0, t R6, n, n, $R1, $R2, $R3) i.r6' | |||
+ System::Call 'advapi32::CreateServiceW(i r4, w r2, w R7, i ${SERVICE_ALL_ACCESS}, \ | |||
+ i R4, i R5, i 0, w R6, n, n, w R1, $R8, w R3) i.r6' | |||
+ Pop $R8 | |||
Pop $R7 | |||
Pop $R6 | |||
Pop $R5 | |||
Pop $R4 | |||
Pop $R3 | |||
Pop $R2 | |||
Pop $R1 | |||
StrCmp $6 0 lbl_done lbl_good | |||
+ ; set description | |||
+ lbl_setdesc: | |||
+ Push $R1 | |||
+ System::Call '*(w r1) i.R1' | |||
+ StrCpy $6 '1' | |||
+ System::Call 'advapi32::ChangeServiceConfig2W(i r5, i 1, i $R1) i.r6' | |||
+ System::Free $R1 | |||
+ Pop $R1 | |||
+ StrCmp $6 0 lbl_done lbl_good | |||
+ | |||
; delete service | |||
lbl_delete: | |||
System::Call 'advapi32::DeleteService(i r5) i.r6' | |||
StrCmp $6 0 lbl_done lbl_good |
Revision as of 14:34, 14 December 2006
I noticed that I couldn't create an "interactive" service using your otherwise excellent lib...here's the fix!
Old code:
199 !insertmacro CALL_GETPARAM $R4 "interact" "0x10" "lbl_interact" 200 StrCpy $6 0x10 201 IntCmp $R4 0 +2 202 IntOp $R4 $6 | 0x100 203 StrCpy $R4 $6 204 lbl_interact:
New code:
199 !insertmacro CALL_GETPARAM $R4 "interact" "0x10" "lbl_interact" 200 StrCpy $6 0x10 201 IntCmp $R4 0 +2 202 IntOp $6 $6 | 0x100 203 StrCpy $R4 $6 204 lbl_interact:
The (very slight) change is on line 202.
Thanks again,
Nathan Probst
- You're correct. I've applied the fix, thanks.
- --kichik 09:12, 5 January 2006 (PST)
There is a tiny bug that makes the original registers swapped after the function Old code:
321 Pop $5 322 Pop $6 323 Pop $7 324 Exch $0 325 !macroend
New code:
321 Pop $5 322 Pop $7 323 Pop $6 324 Exch $0 325 !macroend
--Charlesb 05:25, 22 February 2006 (PST)
- Correct. I've applied the fix, thanks.
- --kichik 10:34, 23 February 2006 (PST)
I use this patch to avoid some possible quote problem and that add a setdesc to set description (CreateService threat empty dependencies and empty password as NULLs) Also I used some Unicode versions instead of ANSI
--- C:\myprog\srv\PopupService\installer\mao.nsh Thu Dec 14 15:27:41 2006 +++ C:\myprog\srv\PopupService\installer\servicelib.nsh Thu Dec 14 15:25:31 2006 @@ -20,10 +20,11 @@
; interact - interact with the desktop ie. 1|0 ; depend - service dependencies ; user - user that runs the service ; password - password of the above user ; display - display name in service's console
+; setdesc - set service description
; ; delete - deletes a windows service ; start - start a stopped windows service ; stop - stops a running windows service ; pause - pauses a running windows service
@@ -164,11 +165,11 @@
StrCpy $0 "false" System::Call 'advapi32::OpenSCManagerA(n, n, i ${SC_MANAGER_ALL_ACCESS}) i.r4' IntCmp $4 0 lbl_done StrCmp $3 "create" lbl_create
- System::Call 'advapi32::OpenServiceA(i r4, t r2, i ${SERVICE_ALL_ACCESS}) i.r5' + System::Call 'advapi32::OpenServiceW(i r4, w r2, i ${SERVICE_ALL_ACCESS}) i.r5'
IntCmp $5 0 lbl_done lbl_select: StrCmp $3 "delete" lbl_delete StrCmp $3 "start" lbl_start
@@ -176,10 +177,11 @@
StrCmp $3 "pause" lbl_pause StrCmp $3 "continue" lbl_continue StrCmp $3 "installed" lbl_installed StrCmp $3 "running" lbl_running StrCmp $3 "status" lbl_status
+ StrCmp $3 "setdesc" lbl_setdesc
Goto lbl_done ; create service lbl_create: Push $R1 ;depend
@@ -187,25 +189,24 @@
Push $R3 ;password Push $R4 ;interact Push $R5 ;autostart Push $R6 ;path Push $R7 ;display
+ Push $R8 ;user type
- !insertmacro CALL_GETPARAM $R1 "depend" "n" "lbl_depend" - StrCpy $R1 't "$R1"' + !insertmacro CALL_GETPARAM $R1 "depend" "" "lbl_depend"
lbl_depend:
- StrCmp $R1 "n" 0 lbl_machine ;old name of depend param - !insertmacro CALL_GETPARAM $R1 "machine" "n" "lbl_machine" - StrCpy $R1 't "$R1"' + StrCmp $R1 "" 0 lbl_machine ;old name of depend param + !insertmacro CALL_GETPARAM $R1 "machine" "" "lbl_machine"
lbl_machine:
+ StrCpy $R8 "n"
!insertmacro CALL_GETPARAM $R2 "user" "n" "lbl_user"
- StrCpy $R2 't "$R2"' + StrCpy $R8 "w R2"
lbl_user:
- !insertmacro CALL_GETPARAM $R3 "password" "n" "lbl_password" - StrCpy $R3 't "$R3"' + !insertmacro CALL_GETPARAM $R3 "password" "" "lbl_password"
lbl_password: !insertmacro CALL_GETPARAM $R4 "interact" "0x10" "lbl_interact" StrCpy $6 0x10 IntCmp $R4 0 +2
@@ -224,21 +225,32 @@
lbl_path: !insertmacro CALL_GETPARAM $R7 "display" "$2" "lbl_display" lbl_display:
- System::Call 'advapi32::CreateServiceA(i r4, t r2, t R7, i ${SERVICE_ALL_ACCESS}, \ - i R4, i R5, i 0, t R6, n, n, $R1, $R2, $R3) i.r6' + System::Call 'advapi32::CreateServiceW(i r4, w r2, w R7, i ${SERVICE_ALL_ACCESS}, \ + i R4, i R5, i 0, w R6, n, n, w R1, $R8, w R3) i.r6' + Pop $R8
Pop $R7 Pop $R6 Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 StrCmp $6 0 lbl_done lbl_good
+ ; set description + lbl_setdesc: + Push $R1 + System::Call '*(w r1) i.R1' + StrCpy $6 '1' + System::Call 'advapi32::ChangeServiceConfig2W(i r5, i 1, i $R1) i.r6' + System::Free $R1 + Pop $R1 + StrCmp $6 0 lbl_done lbl_good +
; delete service lbl_delete: System::Call 'advapi32::DeleteService(i r5) i.r6' StrCmp $6 0 lbl_done lbl_good