NSIS学習ノート(Qt 4プログラムパッケージを例に)


Qt 4プログラムをインストール(パブリッシュ)すると、次のような構造になるはずです(Qtプログラムのwindowsでのパブリケーションを参照できます).
|-- sample.exe
|-- QtCore4.dll
|-- QtGui4.dll
|-- imageformats/
|       |-- qjpeg4.dll

次にnsisを使用して、この機能を実現するインストーラを作成します(少し完備しています)
まだnsisをインストールしていない場合は、すぐにダウンロードしてください.
最初のスクリプト
nsisを使用するには、簡単なxxxを書くだけです.nsiファイル:
;A simple nsis script file: sample.nsi
!define QTDIR "D:/Qt/4.7.0"

outfile "sample-installer.exe"
installDir "$PROGRAMFILES/sample" 
RequestExecutionLevel admin

section
setOutPath $INSTDIR
file sample.exe
file ${QTDIR}/bin/QtCore4.dll
file ${QTDIR}/bin/QtGui4.dll

setOutPath $INSTDIR/imageformats
file ${QTDIR}/plugins/imageformats/qjpeg4.dll
sectionEnd

このファイルと私たちのsampleをexeは同じフォルダに配置し、右クリックして「NSISスクリプトのコンパイル」を選択します.ちょっと待って、インストーラsample-installer.exeは生成されます.
インテリジェントポイント
  • コメント
  • はセミコロンで";"または井戸番号「#」の先頭の行はすべて注釈で、C言語の「/**/」
  • を使用することもできます.
  • コンパイル期間コマンド(Compile Time Commands)
  • は「!最初のコマンドをコンパイル期間コマンド(名前は変ですが、C、C++のマクロと理解しています)
  • と言います.
  • は、この点を明らかにしなければなりません.それは拡張にすぎません.

  • outfile
  • インストーラに名前を指定する
  • installDir
  • デフォルトでファイルをインストールする場所
  • RequestExecutionLevel
  • VistaおよびWin 7ユーザに対して、プログラムのインストール作業時に実行権限
  • を申請する必要がある.
  • section
  • nsisスクリプトごとに少なくとも1つのsectionセグメントが必要です.セグメント内で必要なインストール操作
  • を実行します.
  • setOutPath
  • ファイルの出力先を指定する
  • file
  • インストールファイル


  • 質問はありますか?私たちは最初にinstallDirを設定しましたが、後ろにはINstdIRが使われています.installDirとINstdIRはどんな関係ですか?!
    INstdIRの値取得方法:
  • スクリプトのコンパイル時に/Dオプションでパスが指定された場合、このパスが使用されます.そうでなければ、
  • レジストリからInstallDirRegKeyにパスを読み込むと、このパスが使用されます.そうでなければ、
  • installDirで指定されたパス
  • のみが使用されます.
    注意:ユーザーはインタフェースを通じてインストールパスを選択することができ、影響するINstdIRの値でもある.
    2番目のスクリプト
    前のスクリプトの機能が弱すぎます.
  • ユーザはインストールディレクトリ
  • を選択できない.
  • インストールのみ、アンインストール機能はありません
  • ショートカットを作成できません
  • 改善する
    インストールパス
    インストーラはwizardマルチページプログラムに相当し、対応するページを追加すればいいです.最初のsectionの上に2行を直接追加します.
    Page directory
    Page instfiles

    これらはnsisが提供する標準ページです.
    アンインストール機能の追加
    アンインストール機能を追加すると、アンインストールプログラムが生成され、このプログラムがインストールされると自動的に生成されます.これを実現するには、前のsectionに一言追加するだけです.
    writeUninstaller $INSTDIR/uninstaller.exe

    では、アンインストールプログラムはどのような動作を実行しますか?新しいセグメントを追加する必要があります.
    section "Uninstall"
    rmDir /r "$INSTDIR"
    sectionEnd

    ショートカット
    一般的な2種類:
    一つはデスクトップに
    createShortCut "$DESKTOP/sample.lnk" "$INSTDIR/sample.exe"

    一つはスタートメニューの「プログラム」で.
    createShortCut "$SMPROGRAMS/sample.lnk" "$INSTDIR/sample.exe"

    直感的にsectionセグメントに直接置けばいいです.プログラムのアンインストール時にショートカットを削除する必要があるため、uninstallセグメントにシャドウの削除命令を追加する必要があります.
    createShortCutの詳細についてはManualを参照してください.
    link.lnk target.file [parameters [icon.file [icon_index_number [start_options [keyboard_shortcut [description]]]]]]

    アイコン、コマンドラインパラメータ、ショートカットキー、説明などを設定できます.
    完全なコード
     
    !define QTDIR "D:/Qt/4.7.0"
    
    outfile "sample-installer.exe"
    installDir "$PROGRAMFILES/sample" 
    RequestExecutionLevel admin
    
    Page directory
    Page instfiles
    
    section
    setOutPath $INSTDIR
    file sample.exe
    file ${QTDIR}/bin/QtCore4.dll
    file ${QTDIR}/bin/QtGui4.dll
    
    setOutPath $INSTDIR/imageformats
    file ${QTDIR}/plugins/imageformats/qjpeg4.dll
    
    createShortCut "$DESKTOP/sample.lnk" "$INSTDIR/sample.exe"
    createShortCut "$SMPROGRAMS/sample.lnk" "$INSTDIR/sample.exe"
    
    writeUninstaller $INSTDIR/uninstaller.exe
    sectionEnd
    
    section "Uninstall"
    rmDir /r "$INSTDIR"
    delete "$DESKTOP/sample.lnk"
    delete "$SMPROGRAMS/sample.lnk"
    sectionEnd

    インテリジェントポイント
    page
  • ページを追加するための
  • さらに柔軟なpageExコマンド
  • アンインストールプログラムのページはuninstPageコマンドを使用して
  • を指定できます.
    section
  • NSISインストールスクリプトは、少なくとも1つのsection
  • を含む.
  • 各sectionは、0個以上の命令
  • を含む.
  • 各sectionは、順次実行する(実行中に一部のsectionの有効化を無効にすることができる)
  • .
  • 名前は「Uninstall」または「un.」プレフィックスであるsectionは、アンインストールプログラム
  • に属する.
    3番目のスクリプト
    第2の例は仕事をすることができて、しかしとても不快な点があって、私达はまだずっと言っていません:インターフェースは丑くて、とても古い土です!
    nsisが元に持っていたインタフェースは面白くありませんが、マクロ拡張によって実現された新しいインストールインタフェースも提供されています.使用も便利です.どうすればいいか見てみましょう.
    新しいヘッダファイルが含まれています(最初から言いましたが、感嘆符の先頭にあるC、C++のマクロを類比することができます)
    !include "MUI2.nsh"

    新しいページを挿入
    !insertmacro MUI_PAGE_DIRECTORY
    !insertmacro MUI_PAGE_INSTFILES

    アンインストールページ類似(PAGEとUNPAGEの違い)
    !insertmacro MUI_UNPAGE_CONFIRM
    !insertmacro MUI_UNPAGE_INSTFILES

    新しいページは友好的な多言語サポートを提供しているので、簡体字中国語を選択します.
    !insertmacro MUI_LANGUAGE "SimpChinese"

    完全なコード
     
    !include "mui2.nsh"
    
    !define QTDIR "D:/Qt/4.7.0"
    
    outfile "sample-installer.exe"
    installDir "$PROGRAMFILES/sample" 
    RequestExecutionLevel admin
    
    ;Page directory
    ;Page instfiles
    !insertmacro MUI_PAGE_DIRECTORY
    !insertmacro MUI_PAGE_INSTFILES
    !insertmacro MUI_LANGUAGE "SimpChinese"
    
    section
    setOutPath $INSTDIR
    file sample.exe
    file ${QTDIR}/bin/QtCore4.dll
    file ${QTDIR}/bin/QtGui4.dll
    
    setOutPath $INSTDIR/imageformats
    file ${QTDIR}/plugins/imageformats/qjpeg4.dll
    
    createShortCut "$DESKTOP/sample.lnk" "$INSTDIR/sample.exe"
    createShortCut "$SMPROGRAMS/sample.lnk" "$INSTDIR/sample.exe"
    
    writeUninstaller $INSTDIR/uninstaller.exe
    sectionEnd
    
    section "Uninstall"
    rmDir /r "$INSTDIR"
    delete "$DESKTOP/sample.lnk"
    delete "$SMPROGRAMS/sample.lnk"
    sectionEnd

    関数#カンスウ#
    前はもうよく働いていましたが、他の要求があるかもしれません.次に、コードクリップと重要な概念だけを見ます.
    以前はnsisのもう一つの重要な概念である関数(functions)については触れていなかった.
  • 関数は、sectionが直接実行される点ではなく、私たちの前のセグメントと似ています.実行する必要がある命令が含まれています.関数を呼び出す必要があります.
  • 呼び出し方式では、直接呼び出される関数とコールバック関数と呼ばれる2つのクラスに分けられます.

  • ダイレクトコール
    簡単です.次のコードクリップを見てみましょう.
    Function func
      ;some commands
    FunctionEnd
    
    Section
      Call func
    SectionEnd

    コールバック
    コールバック関数は、特定の場合にインストーラによって呼び出す.onInitは初期化時に呼び出されます.
    ダイアログボックスを開きます
     Function .onInit
       MessageBox MB_YESNO "This will install. Continue?" IDYES NoAbort
         Abort ;
       NoAbort:
     FunctionEnd

    ユーザーに続行するかどうかをプロンプトします.
    さらに役に立つのは、同じ時点で1つのインストーラだけが実行されることを望んでいることです.
    Function .onInit
     System::Call 'kernel32::CreateMutexA(i 0, i 0, t "SAMPLE_MUTEX") i .r1 ?e'
     Pop $R0
     
     StrCmp $R0 0 +3
       MessageBox MB_OK|MB_ICONEXCLAMATION "Another Installer is Running!"
       Abort
    FunctionEnd

    ここでsystemを使いました::call、これは何ですか.
    プラグイン
    前述したように、Windowsのカーネルオブジェクト(反発量)を作成するためにシステムapiを呼び出しました.呼び出しシステムapiはnsisのSystemプラグインを使用しています(追加の操作が必要ないため、プラグインであることに気づかないかもしれません).
    Callの使い方を見てみましょう.
    Call PROC [( PARAMS ) [RETURN [? OPTIONS]]]

    対照して!
    i 0, i 0, t "SAMPLE_MUTEX"
    PARAMS
    関数パラメータ(タイプと値)
    i .r1
    RETURN
    戻り値
    ?e
    ? OPTIONS
    オプションe、実行可能プログラムのパス
    なお、パラメータと戻り値は、いずれも3つの値のセット(タイプ、(source)値、(destination)値)である.戻り値の.source値を無視することを表します.
    システムプラグインのほか、nsisには数学演算を行うmath、インタフェースをカスタマイズするnsDialogプラグインなどがあります.
    LogicLib
    StrCmp$R 0 0+3についてお話ししましたが、これは神馬の使い方ですか?
    プロセス制御は本当に頭が痛くて、ラベルと相対的な位置でジャンプして、アセンブリ言語の感じを与えます.次の例を見てみましょう.
    StrCmp $0 'some value' 0 +3
      MessageBox MB_OK '$$0 is some value'
      Goto done
    StrCmp $0 'some other value' 0 +3
      MessageBox MB_OK '$$0 is some other value'
      Goto done
    # else
      MessageBox MB_OK '$$0 is "$0"'
    done:

    うっかり行を数え間違えたり、文を増減したりするのは、小さなことではありません.
    幸いなことに、nsisはマクロのようなメカニズムで拡張することができ、logiclibも提供されている.nshファイル.これにより、ブランチやループの処理が簡単になります(文法が少ないのは少し違和感がありますが、仕方がありません.内蔵サポートされているものではありません)
     
    ${If} $0 == 'some value'
      MessageBox MB_OK '$$0 is some value'
    ${ElseIf} $0 == 'some other value'
      MessageBox MB_OK '$$0 is some other value'
    ${Else}
      MessageBox MB_OK '$$0 is "$0"'
    ${EndIf}

    その他
    テキストはただの学習ノートで、多くのものが関連していません(manualでは詳しく、問題が発生したらまずmanualを調べるべきです).
  • http://nsis.sourceforge.net/Docs/