2011-11-28 66 views
3

目前,我有以下腳本代碼。避免在NSIS中複製功能代碼

Section "Uninstall" 
... 
... 
Call un.DeleteDirIfEmpty 
SectionEnd 


Function GetJRE 
    ; Call must not be used with functions starting with "un." in the non-uninstall sections. 
    Call 
FunctionEnd 


Function un.DeleteDirIfEmpty 
... 
... 
FunctionEnd 

Function DeleteDirIfEmpty 
... 
... 
FunctionEnd 

需要注意的是,我需要提供2個版本DeleteDirIfEmpty的,所以,同樣的操作可以在不卸載部分和卸載部分進行。

他們的代碼是相同的,只是命名是不同的。 un.DeleteDirIfEmptyDeleteDirIfEmpty

怎麼可能只有1個函數,但是可以被任何部分調用?

回答

5

看看\包括\ Util.nsh,它是用來把宏成一個函數:

!include Util.nsh 

!macro MyFunction 
MessageBox mb_ok "Hello World" 
!macroend 
!define MyFunction "${CallArtificialFunction} MyFunction" 

Section 
${MyFunction} 
SectionEnd 

注:要刪除空目錄,只需使用RMDir(無/ R開關)

+0

「要刪除一個空目錄,只需使用RMDir(不帶/ r開關)」也是一個很好的提示。謝謝:) –

+0

嗨安德斯,你可以編輯你的答案與如何調用共享功能的例子?當我從段中調用'$ {MyFunction}'時,出現錯誤「無效的函數命令從段調用」或類似的東西。同樣,我不確定代碼中'$ {CallArtificialFunction}'的作用是什麼。 – nawfal

+1

我對此感興趣,因爲您的解決方案看起來比我從[鏈接]提供的解決方案更清晰(http://nsis.sourceforge.net/Sharing_functions_between_Installer_and_Uninstaller)。你推薦哪種方法?我更喜歡可讀性比冗餘度更低,更靈活。謝謝 – nawfal

0

link也幫助我理解。它提供了一個演示如何在安裝程序和卸載程序之間共享功能的示例。比如,你有一個應該共享的函數myfunc,然後你創建一個宏來從卸載程序調用它。引用鏈接:

; Name of our installer. 
Name "Function Sharing Example" 
OutFile "FunctionShareExample.exe" 
InstallDir "$PROGRAMFILES\Function Sharing Example\" 

; We need some pages. 
Page directory 
Page instfiles 
; And uninstaller pages. 
UninstPage uninstconfirm 
UninstPage instfiles 

; Show the details. 
ShowInstDetails show 
ShowUninstDetails show 

; ******************* The shared function. ******************* 
!macro MYMACRO un 
    Function ${un}myfunc 
    MessageBox MB_OK "This is the function ${un}myfunc." 
    DetailPrint "Very ${un}funny text." 
    DetailPrint "More ${un}funny text." 
    FunctionEnd 
!macroend 

; Insert function as an installer and uninstaller function. 
!insertmacro MYMACRO "" 
!insertmacro MYMACRO "un." 

Section "Install" 
    ; ******************* Call the installer function. ******************* 
    Call myfunc 

    SetOutPath "$INSTDIR" 
    ; Write an uninstaller. 
    WriteUninstaller "$INSTDIR\uninstall.exe" 
    ShowWindow $HWNDPARENT 6 
    ; Show the install directory, so you can run the uninstaller straight away. 
    ExecShell open "$INSTDIR" 
    Sleep 1000 
    ShowWindow $HWNDPARENT 9 
SectionEnd 

Section "Uninstall" 
    ; ******************* Call the un.installer function. ******************* 
    Call un.myfunc 

    ; Clean up install directory (delete it). 
    Delete "$INSTDIR\uninstall.exe" 
    RMDir "$INSTDIR" 
SectionEnd 
+0

儘管此鏈接可能回答問題,但最好在此處包含答案的基本部分並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – rakhi4110

+0

@ rakhi4110好吧,我將包括必需品,但我覺得我不會僅僅因爲複製而對原作者公平。 – nawfal

+0

你仍然會提供鏈接,併爲它的原始作者信任。只是您在此提供摘錄,以確保每個人都可以得到答案,即使鏈接已關閉/過期/遷移。 – rakhi4110