2013-07-25 42 views
1

你好,我有NSIS卸載程序的問題。Nsis服務刪除

我安裝了軟件並創建了一項服務。服務名稱由用戶命名(例如troll

Soo我有服務troll它正在運行並且正常工作一切正常。

如果我想要卸載軟件,我必須刪除此服務;我已經嘗試了幾種方式與插件simpleSCnsSCM,沒有什麼幫助我。

如果我寫了前:

  • nsSCM::Remove "troll"服務被刪除
  • 但是當我寫nsSCM::Remove "$0" - >沒有發生

哪裏是我的錯?從堆棧獲取服務名稱?我不知道該服務的名稱,因爲它是自定義的,任何幫助都將有所幫助:D

+0

如何獲得已安裝的服務名稱?顯示代碼,問題可能在另一端。 – Seki

+0

我在tomcat服務上測試它,我以這種方式安裝了服務:'nsExec :: ExecToLog'「$ INSTDIR \ TamasAppServer \ bin \ tomcat7.exe」// IS // tomcat7' +其他有關description,logPath,JVM的信息.. .etc – exofus

+0

安裝後您是否存儲該名稱?你如何回讀*這個名字? – Seki

回答

0

安裝程序中的變量內容不會在卸載程序中自動恢復。您必須在註冊表或安裝程序中的.INI文件中寫入服務名稱,然後在卸載程序中讀取該值。

0

我沒有任何聲望,否則就會發表評論。無論如何,你說這個服務的名字是「」,用戶名爲

你是說最終用戶指定服務名稱還是隻是最終用戶的用戶名?

如果是後者,你可以使用這個沒有任何插件,不包括ExecDos:如果它是第一個選項,那麼你需要做這樣的事情在你的安裝程序,只要用戶指定服務的

Var User 

!define SVC `$User` 
!define SC `$SYSDIR\sc.exe` 

System::Call "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})i" 
StrCpy $User $0 
ClearErrors 
ExecDos::Exec /TOSTACK `"${SC}" stop "${SVC}"` 
Sleep 50 
ExecDos::Exec /TOSTACK `"${SC}" delete "${SVC}"` 

名稱。希望這不是太複雜。

;= VARIABLES 
;= ################ 
Var Bit 
Var UserService 

;= DEFINES 
;= ################ 
!define SVC   `$UserService` 
!define SCKEY  SYSTEM\CurrentControlSet\services\${SVC} 
!define HKLM  HKLM\${SCKEY} 
!define SC   `$SYSDIR\sc.exe` 
!define GETCURRPROC `kernel32::GetCurrentProcess()i.s` 
!define WOW   `kernel32::IsWow64Process(is,*i.r0)` 

;= MACROS 
;= ################ 
;=# 
;= Service::Example 
; ${Service::CMD} "ServiceName" /DISABLEFSR $0 $1 
;  ::CMD  = Either QueryConfig, Stop, or Remove. 
;  ServiceName = The service name to be handled 
;  /DISABLEFSR = Disables file-system redirection if running on x64. Use "" to skip. 
;  $0   = Return after call 
;  $1   = ''  '' '' 
!define Service::QueryConfig `!insertmacro _Service::QueryConfig` 
!macro _Service::QueryConfig _SVC _FSR _ERR1 _ERR2 
    ReadEnvStr $R0 COMSPEC 
    StrCmpS $Bit 64 0 +4 
    StrCmp "${_FSR}" /DISABLEFSR 0 +3 
    ExecDos::Exec /TOSTACK /DISABLEFSR `"$R0" /c "${SC} qc "${_SVC}" | FIND "BINARY_PATH_NAME""` 
    Goto +2 
    ExecDos::Exec /TOSTACK `"$R0" /c "${SC} qc "${_SVC}" | FIND "BINARY_PATH_NAME""` 
    Pop ${_ERR1} 
    Pop ${_ERR2} 
    StrCmpS ${_ERR1} 0 0 +4 
    StrCpy $R1 ${_ERR2} "" 29 
    WriteINIStr "$EXEDIR\InstallData.ini" "Service" Path "$R1" 
    ReadRegStr $R1 HKLM `${SVCKEY}` ImagePath 
    WriteINIStr "$EXEDIR\InstallData.ini" "Service" Path "$R1" 
    WriteINIStr "$EXEDIR\InstallData.ini" "Service" Name "${_SVC}" 
!macroend 
!define Service::Stop `!insertmacro _Service::Stop` 
!macro _Service::Stop _SVC _FSR _ERR1 _ERR2 
    StrCmpS $Bit 64 0 +4 
    StrCmp "${_FSR}" /DISABLEFSR 0 +3 
    ExecDos::Exec /TOSTACK /DISABLEFSR `"${SC}" stop "${_SVC}"` 
    Goto +2 
    ExecDos::Exec /TOSTACK `"${SC}" stop "${_SVC}"` 
    Pop ${_ERR1} 
    Pop ${_ERR2} 
!macroend 
!define Service::Remove `!insertmacro _Service::Remove` 
!macro _Service::Remove _SVC _FSR _ERR1 _ERR2 
    StrCmpS $Bit 64 0 +4 
    StrCmp "${_FSR}" /DISABLEFSR 0 +3 
    ExecDos::Exec /TOSTACK /DISABLEFSR `"${SC}" delete "${_SVC}"` 
    Goto +2 
    ExecDos::Exec /TOSTACK `"${SC}" delete "${_SVC}"` 
    Pop ${_ERR1} 
    Pop ${_ERR2} 
!macroend 

Function ".onInit" 
    System::Call `${GETCURRPROC}` 
    System::Call `${WOW}` 
    StrCmpS $0 0 +3 
    StrCpy $Bit 64 
    Goto +2 
    StrCpy $Bit 32 
FunctionEnd 

;=# 
;= I don't know the code you're using but let's assume 
;= after the end-user specifies the service's name you 
;= copy the name to the variable $UserService. This is 
;= somewhere in the install process. 


StrCpy $UserService $0 
;#=# 
;# This will write to an INI file | $EXEDIR\InstallData.ini 
;#  [Service] 
;#  Path=X:\Path\to\service\exe 
;#  Name=ServiceName 
;#=# 
${Service::QueryConfig} ${SVC} /DISABLEFSR $0 $1 

;=# 
;= Then in your uninstaller you could simply implement 
;= this into your code for easy removal. I usually use 
;= this method in my projects and it works pretty good 
;= without the need for any extra plugins. 
ReadINIStr $0 "$EXEDIR\InstallData.ini" "Service" Name 
${Service::Stop} "$0" /DISABLEFSR $0 $1 
Sleep 50 
${Service::Remove} "$0" /DISABLEFSR $0 $1 

/DISABLEFSR參數應該只在x64機器。但是,如果你搞砸了宏中有一個失敗保險,它會爲你避開這顆子彈。男孩,這很多,是吧?對我來說,這絕對不會幫助你。大聲笑。希望這可以幫助別人。