NSIS学習ノート(Qt 4プログラムパッケージを例に)
Qt 4プログラムをインストール(パブリッシュ)すると、次のような構造になるはずです(Qtプログラムのwindowsでのパブリケーションを参照できます).
次にnsisを使用して、この機能を実現するインストーラを作成します(少し完備しています)
まだnsisをインストールしていない場合は、すぐにダウンロードしてください.
最初のスクリプト
nsisを使用するには、簡単なxxxを書くだけです.nsiファイル:
このファイルと私たちの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行を直接追加します.
これらはnsisが提供する標準ページです.
アンインストール機能の追加
アンインストール機能を追加すると、アンインストールプログラムが生成され、このプログラムがインストールされると自動的に生成されます.これを実現するには、前のsectionに一言追加するだけです.
では、アンインストールプログラムはどのような動作を実行しますか?新しいセグメントを追加する必要があります.
ショートカット
一般的な2種類:
一つはデスクトップに
一つはスタートメニューの「プログラム」で.
直感的にsectionセグメントに直接置けばいいです.プログラムのアンインストール時にショートカットを削除する必要があるため、uninstallセグメントにシャドウの削除命令を追加する必要があります.
createShortCutの詳細についてはManualを参照してください.
アイコン、コマンドラインパラメータ、ショートカットキー、説明などを設定できます.
完全なコード
インテリジェントポイント
pageページを追加するための さらに柔軟なpageExコマンド アンインストールプログラムのページはuninstPageコマンドを使用して を指定できます.
section NSISインストールスクリプトは、少なくとも1つのsection を含む.各sectionは、0個以上の命令 を含む.各sectionは、順次実行する(実行中に一部のsectionの有効化を無効にすることができる) .名前は「Uninstall」または「un.」プレフィックスであるsectionは、アンインストールプログラム に属する.
3番目のスクリプト
第2の例は仕事をすることができて、しかしとても不快な点があって、私达はまだずっと言っていません:インターフェースは丑くて、とても古い土です!
nsisが元に持っていたインタフェースは面白くありませんが、マクロ拡張によって実現された新しいインストールインタフェースも提供されています.使用も便利です.どうすればいいか見てみましょう.
新しいヘッダファイルが含まれています(最初から言いましたが、感嘆符の先頭にあるC、C++のマクロを類比することができます)
新しいページを挿入
アンインストールページ類似(PAGEとUNPAGEの違い)
新しいページは友好的な多言語サポートを提供しているので、簡体字中国語を選択します.
完全なコード
関数#カンスウ#
前はもうよく働いていましたが、他の要求があるかもしれません.次に、コードクリップと重要な概念だけを見ます.
以前はnsisのもう一つの重要な概念である関数(functions)については触れていなかった.関数は、sectionが直接実行される点ではなく、私たちの前のセグメントと似ています.実行する必要がある命令が含まれています.関数を呼び出す必要があります. 呼び出し方式では、直接呼び出される関数とコールバック関数と呼ばれる2つのクラスに分けられます.
ダイレクトコール
簡単です.次のコードクリップを見てみましょう.
コールバック
コールバック関数は、特定の場合にインストーラによって呼び出す.onInitは初期化時に呼び出されます.
ダイアログボックスを開きます
ユーザーに続行するかどうかをプロンプトします.
さらに役に立つのは、同じ時点で1つのインストーラだけが実行されることを望んでいることです.
ここでsystemを使いました::call、これは何ですか.
プラグイン
前述したように、Windowsのカーネルオブジェクト(反発量)を作成するためにシステムapiを呼び出しました.呼び出しシステムapiはnsisのSystemプラグインを使用しています(追加の操作が必要ないため、プラグインであることに気づかないかもしれません).
Callの使い方を見てみましょう.
対照して!
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についてお話ししましたが、これは神馬の使い方ですか?
プロセス制御は本当に頭が痛くて、ラベルと相対的な位置でジャンプして、アセンブリ言語の感じを与えます.次の例を見てみましょう.
うっかり行を数え間違えたり、文を増減したりするのは、小さなことではありません.
幸いなことに、nsisはマクロのようなメカニズムで拡張することができ、logiclibも提供されている.nshファイル.これにより、ブランチやループの処理が簡単になります(文法が少ないのは少し違和感がありますが、仕方がありません.内蔵サポートされているものではありません)
その他
テキストはただの学習ノートで、多くのものが関連していません(manualでは詳しく、問題が発生したらまずmanualを調べるべきです). http://nsis.sourceforge.net/Docs/
|-- 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は生成されます.
インテリジェントポイント
質問はありますか?私たちは最初にinstallDirを設定しましたが、後ろにはINstdIRが使われています.installDirとINstdIRはどんな関係ですか?!
INstdIRの値取得方法:
注意:ユーザーはインタフェースを通じてインストールパスを選択することができ、影響する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
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)については触れていなかった.
ダイレクトコール
簡単です.次のコードクリップを見てみましょう.
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を調べるべきです).