1

インストーラーの作成にnsisスクリプトを使用しました。同じ名前でインストーラーを2回実行する場合、REPAIRとREMOVEを確認して対応する操作を実行する必要があります。アプリケーションが既にインストールされているか、次のコードを使用していないことがわかりました。

Function checkinstall
   ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My app" "UninstallString" 
   IfFileExists $R0 +1 NotInstalled
   call nsDialogpage
   NotInstalled:
FunctionEnd

Function nsDialogpage
   nsDialogs::Create 1018
    Pop $Dialog
    ${If} $Dialog == error
        Abort
    ${EndIf}
    ${NSD_CreateRadioButton} 0 5u 100% 10u "Repair"
        Pop $hwnd
        ${NSD_AddStyle} $hwnd ${WS_GROUP}
        ${NSD_OnClick} $hwnd ???
    ${NSD_CreateRadioButton} 0 25u 100% 56u "Remove"
        Pop $hwnd
        ${NSD_OnClick} $hwnd ???
    nsDialogs::Show

ユーザーが修復ボタンを選択した場合、既存のインストールパスを上書きする必要があります。そうでない場合は、既存のインストール済みパスをアンインストールして、新しいものを続行します。上記のコードの(???)を置き換えるにはどうすればよいですか。

page custom checkinstall
!insertmacro MUI_PAGE_DIRECTORY

次のページはディレクトリの選択です。このページを呼び出す必要がありますか?これを達成する方法は?

1.ユーザーが削除ボタンを選択した場合、どうすればアンインストーラー関数を呼び出すことができますか?

   Function un.Init, section /o -un.Main UNSEC000,section -un.post UNSE001

これらはアンインストーラー関数です。これらの関数を呼び出すにはどうすればよいですか?メソッドを呼び出してみましたが、機能しませんでした。

4

1 に答える 1

1

nsDialogsのドキュメントのように、コールバック関数を指定する必要があります。次のnsDialogsPageLeave例で関数を探してください。

!include nsDialogs.nsh
!include LogicLib.nsh

Name nsDialogs
OutFile nsDialogs.exe

XPStyle on

Var Dialog
Var Label
Var Text

Page custom nsDialogsPage nsDialogsPageLeave
Page instfiles

Function nsDialogsPage

    nsDialogs::Create 1018
    Pop $Dialog

    ${If} $Dialog == error
        Abort
    ${EndIf}

    ${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
    Pop $Label

    ${NSD_CreateText} 0 13u 100% -13u "Type something here..."
    Pop $Text
    ${NSD_OnChange} $Text nsDialogsPageTextChange

    nsDialogs::Show

FunctionEnd

Function nsDialogsPageLeave

    ${NSD_GetText} $Text $0
    MessageBox MB_OK "You typed:$\n$\n$0"

FunctionEnd

Function nsDialogsPageTextChange
    Pop $1 # $1 == $ Text
    ${NSD_GetText} $Text $0
    ${If} $0 == "hello"
        MessageBox MB_OK "right back at ya!"
    ${EndIf}
FunctionEnd

Section
    DetailPrint "hello world"
SectionEnd
于 2012-11-15T10:53:44.167 に答える