简体   繁体   中英

NSIS Installer failed to start/stop service

I'm using WindowsXP, NSIS 2.46 with nsSCM plug-in, and have 4 machines with nearly the same environment(hardware + software) since they come from a same GHOST image but with very limited changes on application layer(no any system settings changed).

I'm using NSIS installer to install my application to them, detail process are:

  1. Stop 'Apache2.2' service.
  2. Copy files to Apache root folder.
  3. CreateShortCut
    With script:
  CreateShortCut "$SMPROGRAMS\\MyApp\\Stop.lnk" "$SYSDIR\\sc.exe" "stop MyAppService" "C:\\WINDOWS\\system32\\SHELL32.dll" 27 SW_SHOWMINIMIZED CreateShortCut "$SMPROGRAMS\\MyApp\\ShowDemo.lnk" "$PROGRAMFILES\\MyAppPath\\MyAppShowDemoHelper.exe" "-b 102" "C:\\WINDOWS\\system32\\SHELL32.dll" 24 SW_SHOWMINIMIZED 
  1. Start 'Apache2.2' service.

    With script:

  nsSCM::Start /NOUNLOAD "Apache2.2" Pop $0 ; return error/success ${If} $0 == "success" MessageBox MB_ICONINFORMATION|MB_OK "Successfully started 'Apache2.2' service" ${Else} MessageBox MB_ICONSTOP|MB_OK "Failed to start 'Apache2.2' service with result: $0, Contact help desk or start it manually!" ${EndIf} 

===========================

Now the problem is the step 4 , in two of those machines , it always popup ERROR and always need manually to start the service(with no error), but meantime, the shortcuts are created successfully.

I've checked system logs, Apache logs, but no error logs/message could be found.

I spend one day and tried everything, at last, I found once I remove the Step 3, everything is fine, so any idea Why?

[Edit0]:

For work around, I have to switch Step 3 and 4, at least now it works good.

CreateShortcut should have no impact on plugins so this is rather strange. It would be nice if we could narrow this down to a problem with the plugin API in NSIS or a problem in the plugin itself. Maybe you could try the SimpleSC plugin?

Here is some code that does it manually with the system plugin. It is not pretty but should display a relevant error code if it fails.

Section
!define MyServiceName "Spooler" ;"stisvc" 
ExecWait '"$SysDir\cmd.exe" /c net stop "${MyServiceName}"' ; Hack to make sure the service is stopped so we can try starting it again
Sleep 1111

InitPluginsDir
CreateShortcut "$PluginsDir\Test1.lnk" "$ExePath" ; Create some dummy shortcuts to possibly trigger the bug
CreateShortcut "$PluginsDir\Test2.lnk" "$ExePath"

!include LogicLib.nsh
!include Util.nsh
!define ERROR_SERVICE_ALREADY_RUNNING 1056
!define SC_MANAGER_CONNECT 0x0001
!define SERVICE_QUERY_STATUS 0x0004
!define SERVICE_START 0x0010
!define SERVICE_PAUSE_CONTINUE 0x0040
!define SERVICE_CONTROL_CONTINUE 3
!define SERVICE_STOPPED 1
!define SERVICE_START_PENDING 2
!define SERVICE_STOP_PENDING 3
!define SERVICE_RUNNING 4
!define SERVICE_CONTINUE_PENDING 5
!define SERVICE_PAUSE_PENDING 6
!define SERVICE_PAUSED 7

!macro WaitForServiceRunningStatus_
System::Store S
Pop $6
Pop $1
System::Call KERNEL32::GetTickCount()i.r7
System::Call '*(i,i,i,i,i,i,i)i.r2'
loop:
    System::Call 'ADVAPI32::QueryServiceStatus(ir1, ir2)i.r3'
    System::Call '*$2(i,i.r4)'
    ${If} $3 <> 0
        ${If} $4 = ${SERVICE_RUNNING}
            DetailPrint 'Service is now running.'
        ${Else}
            Sleep 250
            System::Call KERNEL32::GetTickCount()i.r8
            ${IfThen} $8 < $7 ${|} StrCpy $7 $8 ${|} ; Reset on GetTickCount rollover
            IntOp $8 $8 - $7
            IntCmpU $8 $6 "" loop
            DetailPrint 'Timeout! Service status is $4'
        ${EndIf}
    ${EndIf}
System::Free $2
System::Store L
!macroend
!macro WaitForServiceRunningStatus hSC MsTimeout
Push ${hSC}
Push ${MsTimeout}
${CallArtificialFunction} WaitForServiceRunningStatus_
!macroend

System::Call 'ADVAPI32::OpenSCManager(t"", i0, i${SC_MANAGER_CONNECT})i.r0 ?e'
Pop $9
${If} $0 = 0
    DetailPrint 'OpenSCManager(t"", i0, i${SC_MANAGER_CONNECT}) failed with error $9'
${Else}
    System::Call 'ADVAPI32::OpenService(ir0, t"${MyServiceName}", i${SERVICE_QUERY_STATUS}|${SERVICE_START}|${SERVICE_PAUSE_CONTINUE})i.r1 ?e'
    Pop $9
    ${If} $1 = 0
        DetailPrint 'OpenService("${MyServiceName}") failed with error $9'
    ${Else}
        System::Call '*(i,i,i,i,i,i,i)i.r2'
        System::Call 'ADVAPI32::QueryServiceStatus(ir1, ir2)i.r3 ?e'
        Pop $9
        ${If} $3 = 0
            DetailPrint 'QueryServiceStatus failed with error $9'
            StrCpy $4 0 ; We failed, set to unused code so we stop processing
        ${Else}
            System::Call '*$2(i.r3,i.r4,i.r5,i,i,i,i)'
            IntFmt $3 "%#x" $3
            IntFmt $4 "%#x" $4
            IntFmt $5 "%#x" $5
            DetailPrint 'QueryServiceStatus: Type=$3, CurrentState=$4 ControlsAccepted=$5'
        ${EndIf}
        ${If} $4 = ${SERVICE_PAUSE_PENDING}
        ${OrIf} $4 = ${SERVICE_PAUSED}
            System::Call 'ADVAPI32::ControlService(ir1, i${SERVICE_CONTROL_CONTINUE}, ir2)i.r3 ?e'
            Pop $9
            ${If} $3 = 0
                DetailPrint 'ControlService(SERVICE_CONTROL_CONTINUE) failed with error $9'
            ${Else}
                DetailPrint 'Resuming "${MyServiceName}"...'
                !insertmacro WaitForServiceRunningStatus $1 5000
            ${EndIf}
        ${ElseIf} $4 = ${SERVICE_CONTINUE_PENDING}
            !insertmacro WaitForServiceRunningStatus $1 5000
        ${ElseIf} $4 >= ${SERVICE_STOPPED}
            ${If} $4 = ${SERVICE_RUNNING}
                DetailPrint "Service already running"
            ${Else}
                System::Call 'ADVAPI32::StartService(ir1, i0, i0)i.r3 ?e'
                Pop $9
                ${If} $3 = 0
                    DetailPrint 'StartService failed with error $9'
                ${Else}
                    DetailPrint 'Starting "${MyServiceName}"...'
                    !insertmacro WaitForServiceRunningStatus $1 9000
                ${EndIf}
            ${EndIf}
        ${EndIf}
        System::Free $2
        System::Call 'ADVAPI32::CloseServiceHandle(i.r1)'
    ${EndIf}
    System::Call 'ADVAPI32::CloseServiceHandle(i.r0)'
${EndIf}
SectionEnd

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM