フリーソフト

« 2009年7月 | トップページ | 2011年7月 »

I. License - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

付録 I: ライセンス

I.1 著作権

[原文]

Copyright (C) 1995-2009 Contributors

より詳細な著作権情報については、個々のソースコードファイルに記載されています。

I.2 適用されるライセンス

[原文]

  • All NSIS source code, plug-ins, documentation, examples, header files and graphics, with the exception of the compression modules and where otherwise noted, are licensed under the zlib/libpng license.
  • The zlib compression module for NSIS is licensed under the zlib/libpng license.
  • The bzip2 compression module for NSIS is licensed under the bzip2 license.
  • The lzma compression module for NSIS is licensed under the Common Public License version 1.0.

I.3 zlib/libpng ライセンス

[原文]

This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.

Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

I.4 bzip2 ライセンス

[原文]

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
  3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
  4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Julian Seward, Cambridge, UK.

jseward@acm.org

I.5 Common Public License version 1.0

[原文]

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor:

i) changes to the Program, and

ii) additions to the Program;

where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.

2. GRANT OF RIGHTS

a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.

b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.

c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.

d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:

a) it complies with the terms and conditions of this Agreement; and

b) its license agreement:

i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;

ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;

iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and

iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

When the Program is made available in source code form:

a) it must be made available under this Agreement; and

b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the Program.

Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.

I.6 LZMA 圧縮モジュールにおける特例

[原文]

Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for NSIS, expressly permit you to statically or dynamically link your code (or bind by name) to the files from the LZMA compression module for NSIS without subjecting your linked code to the terms of the Common Public license version 1.0. Any modifications or additions to files from the LZMA compression module for NSIS, however, are subject to the terms of the Common Public License version 1.0.

前へ | 目次 | 次へ


 
SourceForge Logo

H. Credits - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

付録 H: クレジット

H.1 プログラマ

[原文]

Justin Frankel aka 0xDEADBEEF

  • Creating the all mighty NSIS

Amir "make me stop" Szekely aka KiCHiK

  • Multilingual NSIS
  • RTF license text
  • The new paging system
  • Full color support for icons and bitmaps
  • Branding image
  • Customizable UI
  • One makensis.exe for both zlib and bzip2

Joost Verburg

  • Modern User Interface
  • NSIS website
  • NSIS Menu
  • System for DLL/TLB library setup
  • NSIS Update for NSIS distribution (original version by Nathan Purciful)

Robert Rainwater

  • MakeNSISW
  • New documentation format
  • Enhancing the TreeView
  • Reorganizing NSIS directory structure

Dave "bit-by-bit" Laundon aka eccles

  • Massive optimizing

Ximon Eighteen aka Sunjammer

  • The new plug-ins system
  • "Copy to clipboard" context menu for the Details window
  • License text initial focus

Ramon aka Ramon18

  • Version information resource commands
  • Named user variables
  • Lots of UI fixes
  • InstallOptions improvements

Jim Park

  • Unicode support

Olivier Marcoux

nnop@newmail.ru

Ryan Geiss

Andras Varga

Drew Davidson

Peter Windridge

Yaroslav Faybishenko

Jeff Doozan

  • NSIS 2's new TreeView

Nike (nike@sendmail.ru)

  • HTML Help support for Halibut

Diego Pedroso aka deguix

  • New NSIS Wiki

Shengalts Aleksander aka Instructor

Stuart Welch aka Afrow UK

David Weiss aka Comm@nder21

Anders Kjersem

H.2 デザイナ

[原文]

Nikos Adamamas

  • The new modern icons

Jan T. Sott / whyEye.org

  • Lots of icons and check marks

H.3 翻訳者

[原文]

Albanian - Besnik Bleta

Afrikaans - Friedel Wolff

Arabic - asdfuae, Rami Kattan

Asturian - Marcos (marcoscostales@gmail.com)

Basque - Iñaki San Vicente

Belarusian - Sitnikov Vjacheslav

Bosnian - Salih CAVKIC

Breton - Korvigelloù An Drouizig

Bulgarian - Asparouh Kalyandjiev, Plamen Penkov

Catalan - falanko

Croatian - Igor Ostriz, Vedran "RIV@NVX" Miletic

Czech - T.V. Zuggy, SELiCE

Danish - Christopher, Casper Bergenstoff, Claus Futtrup

Dutch - Hendri Adriaens, Joost Verburg

Esperanto - Felipe Castro

Estonian - izzo

Farsi - Masoud Alinaqian, FzerorubigD, Elnaz Sarbar

Finnish - AKX, Eclipser

French - veekee, Sebastien Delahaye, Jerome Charaoui

Galician - Ramon Flores

German - L.King, K. Windszus, R. Bisswanger, M. Simmack, Tim Kosse

Greek - Makidis N. Michael

Hebrew - Amir Szekely (aka KiCHiK), Yaron Shahrabani

Hungarian - Soft-Trans Bt., Jozsef Tamas Herczeg, Lajos Molnar (Orfanik)

Icelandic - Gretar Orri Kristinsson

Indonesian - ariel825010106

Italian - Orfanik, sanface, Alessandro Staltari, Lorenzo Bevilacqua

Japanese - Dnanako, Takahiro Yoshimura

Korean - dTomoyo, linak, koder

Kurdish - Erdal Ronahi

Latvian - Valdis Griíis, Kristaps Meòìelis

Lithuanian - NorCis, Vytautas Krivickas, Danielius Scepanskis

Luxembourgish - Jo Hoeser

Macedonian - Sasko Zdravkin

Mongolian - Bayarsaikhan Enkhtaivan

Norwegian - Jonas Christoffer Lindstrom, Jan Ivar Beddari

Norwegian Nynorsk - Vebjørn Sture

Polish - Piotr Murawski, Rafa³ Lampe, cube, SYSTEMsoft Group

Portuguese - DragonSoull, Dre', Ramon

Portuguese Brasil - Layout do Brasil, deguix

Romanian - Sorin Sbarnea, Cristian Pirvu, George Radu, Vlad Rusu

Russian - Sergey `Timon` Kusnetsov, Nik Medved, Scam, THRaSH, Dmitry Yerokhin

Serbian - Srdjan Obucina

Serbian Latin - Srdjan Obucina, Vladan Obradovic

Slovak - trace, Kypec, Marián Hikaník

Slovenian - Janez Dolinar, Martin Sebotnjak

Spanish - MoNKi, Lobo Lunar, Darwin Rodrigo Toledo Cáceres

Swedish - Peter Gustafsson, Magnus Bonnevier, Rickard Angbratt

Thai - SoKoOLz, TuW@nNu (asdfuae)

Traditional & Simplified Chinese - Kii Ali

Turkish - Bertan Kodamanoglu, Cagatay Dilsiz, Fatih BOY

Ukrainian - Yuri Holubow, Nash-Soft

Uzbek - Emil Garipov (emil.garipov@gmail.com)

Valencian - Bernardo Arlandis Mañó

Welsh - Rhoslyn Prys, Meddal.com

H.4 著者

[原文]

Sebastian Armbrust aka flizebogen

  • Tutorial

前へ | 目次 | 次へ


SourceForge Logo

AppendixG

[原文]

AppendixF

[原文]

AppendixE

[原文]

D. Useful Information

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

付録 D: 役に立つ情報

D.1 エラーレベル

[原文]

他のアプリケーションと同様に、NSIS インストーラは実行結果としてエラーレベルを返します。他のアプリケーションや他のインストーラから、 NSIS インストーラを呼び出した場合には、エラーレベルをチェックすることは有用です。

  • 0 - 通常の実行 (エラーなし)
  • 1 - ユーザによるインストールの中断 (キャンセルボタン)
  • 2 - スクリプトによるインストールの中断

NSIS 2.01 以降では、SetErrorLevel を利用して、エラーレベルを設定することができます。

注意: アンインストーラ自身を削除できるようにするため、アンインストーラは自分自身を一時フォルダにコピーした後、そこから実行します。そのため、アンインストーラが設定したエラーレベルは実行プロセスから利用することができません。エラーレベルを得るためには、このコピー処理をシミュレートして、実行する必要があります。具体的には、以下のようにします。

CopyFiles $INSTDIR\uninstaller.exe $TEMP
ExecWait '"$TEMP\uninstaller.exe" _?=$INSTDIR' $0
DetailPrint "uninstaller set error level $0"

このようにしないと、アンインストーラは自分自身を一時ディレクトリにコピーすることができません。

D.2 プログラムの追加と削除へのアンインストール情報の追加

HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall の下に、製品名のキーを作成すると、コントロールパネルの「プログラムの追加と削除」にエントリーを追加することができます。Windows NT (NT4/2000/XP) においては、HKCUにキーを作成することで、カレントユーザにのみ表示されるようにすることもできます。いくつかの値をキーに記述することによって、アプリケーションやアンインストーラに関する情報を与えることができます。WriteRegStr コマンド(文字列用)や WriteRegDWORD コマンド(DWORD 値用)を利用して値を書き込みます。例を示します。

WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Product" "DisplayName" "Application Name"

記述が必要な値

DisplayName (string) - アプリケーションの名前
UninstallString (string) - アンインストーラのパスとファイル名。空白でパスが分割されないようにするため、パスは常にクォートすべきです。

オプション値

以下の値のうちのいくつかは、古い Windows では使用されません。

InstallLocation (string) - インストールディレクトリ ($INSTDIR)
DisplayIcon (string) - アプリケーション名の次に表示される、パス、ファイル名、アイコンのインデクス

Publisher (string) - 発行元の(会社の)名前

ModifyPath (string) - アプリケーション更新プログラムのパスとファイル名
InstallSource (string) - アプリケーションのインストール元の場所

ProductID (string) - アプリケーションの製品 ID
RegOwner (string) - アプリケーションの登録ユーザ
RegCompany (string) - アプリケーションの登録企業

HelpLink (string) - サポートのウェブサイトへのリンク
HelpTelephone (string) - サポートのための電話番号

URLUpdateInfo (string) - アプリケーションのアップデートのためのウェブサイトへのリンク
URLInfoAbout (string) - アプリケーションのホームページへのリンク

DisplayVersion (string) - アプリケーションの表示バージョン
VersionMajor (DWORD) - アプリケーションのメジャーバージョン番号
VersionMinor (DWORD) - アプリケーションのマイナーバージョン番号

NoModify (DWORD) - アンインストーラがアプリケーションを更新するためのオプションを持っていない場合は 1
NoRepair (DWORD) - アンインストーラがインストールを修復するためのオプションを持っていない場合は 1

NoModify と NoRepair の両方が 1 に設定された場合、「変更/削除」の代わりに「削除」というボタンが表示されます。

D.3 System.dll プラグインを利用した外部 DLL の呼び出し

インストール処理において、サードパーティの DLL を内部に含む関数を呼び出す必要がある場合があります。代表的な例は、Palm(TM) コンジットをインストールするときです。

System.dll について
System.dll プラグイン(Brainsucker 氏)によって、外部の DLL を "Call" 関数で呼び出すことが可能となります。System.dll には、そのほかにも沢山の関数が含まれていますが、ここでは取り上げません。その他の関数の詳細については、System readme を参照してください。

データ型
System.dll は以下のデータ型を認識します。

  • v - void 型(返り値として一般的)
  • i - 整数型 (char, byte, short, ハンドル, ポインタなどを含む)
  • l - 大きな整数型 (int64 として知られているもの)
  • t - テキスト、文字列型 (LPCSTR、一文字目へのポインタ)
  • b - 論理型 ('true'、'false') - 実際は、この型は無意味です -> 普通の整数を使うこともできます('0'、'1')
  • k - コールバック型。system.html のコールバックの節を参照してください。
  • * - ポインタ指定子 -> 型へのポインタ、次の文字(引数)に影響します [例: '*i' - 整数へのポインタ]

System.dll 変数の NSIS スクリプト変数へのマッピング
外部の関数を呼び出すことができたとしても、返り値を取得することができないと意味がありません。System.dll は、次のように、関数の変数を NSIS スクリプト変数にマップします。

NSIS の $0..$9 は、System.dll の r0..r9 に、NSIS の $R0..$R9 は、 System.dll の r10..r19 になります。

各引数は、型や入力、出力によって特定されます。入力や出力をスキップするには、ドットを利用します。例を示します。

文字列(文字配列へのポインタ)。入力は 'happy calling'。

t 'happy calling'

文字列(文字配列へのポインタ)。入力は $5 から取得し、呼び出しによる変更は $R8 に保存する。

t r5R8

整数へのポインタ。 $1 から値を取得し $2 に格納する。

*i r1r2

64 ビット整数へのポインタ。出力はスタックにプッシュ。入力はなし。

*l .s

System.dll::Call を利用すると、サードパーティの DLL 内にある関数を呼び出すことができます。Call 関数は次のように使用します。

System::Call 'YourDllName::YourDllFunction(i, *i, t) i(r0, .r1, r2) .r3'

最後の '(r0, .r1, r2) .r3' の部分は、DLL と NSIS スクリプトの間で渡されるパラメータです。このパラメータリストから分かるように、型と入力、出力を分けることができます。"(parms list) return value" の各ブロックは最後のもので、上書きされたり追加されたりします。上記の例では、最初のブロックは型を指定し、2番目は入力と出力を指定しています。

NSIS スクリプトをコーディングし始める前に
NSIS スクリプトをコーディングするには、呼び出そうとしている関数の完全なプロトタイプを知っている必要があります。例として、Palm の 'CondMgr.dll' から、'CmGetHotSyncExecPath' を利用する場合を考えます。この関数は、'HotSync.exe' のフルパスを返すために利用されます。

関数の定義

int CmGetHotSyncExecPath(TCHAR *pPath, int *piSize);

ここで、

  • pPath は、文字バッファへのポインタです。HotSync マネージャのパスとファイル名が返されます。
  • piSize は、pPath 引数によって参照されるバッファの(TCHAR での)サイズを指定します。

返り値

  • 0: エラーなし
  • -1: 特定できないエラーが発生
  • ERR_REGISTRY_ACCESS(-1006):Palm コンフィギュレーションエントリにアクセスできない
  • ERR_BUFFER_TOO_SMALL(-1010): 要求された情報を格納するには、バッファが小さすぎる
  • ERR_INVALID_POINTER(-1013):指定されたポインタは、有効なポインタではない

また、バッファが小さすぎる場合は、必要なバッファサイズが *int の値に設定されます(TCHAR でのサイズ)。

この関数定義は、以下の System.dll 定義にマップされます。

CmGetHotSyncExecPath(t, *i) i

つまり、これは、テキスト変数と、整数へのポインタを引数として、整数値を返します。

外部 DLL 関数の使用
Now that we've sorted out what the function does, and how it maps to the System.dll format, we can use the function in a NSIS script.

First, you have to change the output directory to that where the DLL you want to use is. It may also work if the DLL is on the system path, but this hasn't been tested.

The following code fragment will install 'condmgr.dll' to a temporary directory, execute the CmGetHotSyncExecPath function and display returned data. Save this script

; **** snip ****
Function loadDll

  SetOutPath $TEMP\eInspect             ; create temp directory
  File bin\CondMgr.dll                  ; copy dll there
  StrCpy $1 ${NSIS_MAX_STRLEN}          ; assign memory to $0
  System::Call 'CondMgr::CmGetHotSyncExecPath(t, *i) i(.r0, r1r1).r2'
  DetailPrint 'Path: "$0"'
  DetailPrint "Path length: $1"
  DetailPrint "Return value: $2"

FunctionEnd
; **** snip ****

and this function produces the following output in the 'details' page:

Output folder: c:\windows\TEMP\eInspect
Extract: CondMgr.dll
Path: "C:\Dave\palm\Hotsync.exe"
Path length: 24
Return value: 0

Written by djc

Acknowledgements & Thanks
Lots of thanks go to kichik and Sunjammer for spending a lot of time assisting in solving this problem. Also to brainsucker for creating the System.dll plug-in in the first place. Good Luck!

D.4 Dump Content of Log Window to File

This function will dump the log of the installer (installer details) to a file of your choice. I created this function for Afrow_UK who requested a way to dump the log to a file in this forum thread.

To use it, push a file name and call it. It will dump the log to the file specified. For example:

GetTempFileName $0
Push $0
Call DumpLog

Here is the function:

!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x102D

Function DumpLog
  Exch $5
  Push $0
  Push $1
  Push $2
  Push $3
  Push $4
  Push $6

  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1016
  StrCmp $0 0 error
  FileOpen $5 $5 "w"
  StrCmp $5 0 error
    SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6
    System::Alloc ${NSIS_MAX_STRLEN}
    Pop $3
    StrCpy $2 0
    System::Call "*(i, i, i, i, i, i, i, i, i) i \
      (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1"
    loop: StrCmp $2 $6 done
      System::Call "User32::SendMessageA(i, i, i, i) i \
        ($0, ${LVM_GETITEMTEXT}, $2, r1)"
      System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)"
      FileWrite $5 "$4$\r$\n"
      IntOp $2 $2 + 1
      Goto loop
    done:
      FileClose $5
      System::Free $1
      System::Free $3
      Goto exit
  error:
    MessageBox MB_OK error
  exit:
    Pop $6
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Pop $0
    Exch $5
FunctionEnd

written by KiCHiK

D.5 How to Read REG_MULTI_SZ Values

I wrote this script to help rpetges in this forum thread. It reads a registry value of the type REG_MULTI_SZ and prints it out. Don't forget to edit where it says "Edit this!" when you test this script. The values must point to a REG_MULTI_SZ value or the example will spit out an error.

OutFile "REG_MULTI_SZ Reader.exe"

Name "REG_MULTI_SZ Reader"

ShowInstDetails show

!define HKEY_CLASSES_ROOT        0x80000000
!define HKEY_CURRENT_USER        0x80000001
!define HKEY_LOCAL_MACHINE       0x80000002
!define HKEY_USERS               0x80000003
!define HKEY_PERFORMANCE_DATA    0x80000004
!define HKEY_PERFORMANCE_TEXT    0x80000050
!define HKEY_PERFORMANCE_NLSTEXT 0x80000060
!define HKEY_CURRENT_CONFIG      0x80000005
!define HKEY_DYN_DATA            0x80000006

!define KEY_QUERY_VALUE          0x0001
!define KEY_ENUMERATE_SUB_KEYS   0x0008

!define REG_NONE                 0
!define REG_SZ                   1
!define REG_EXPAND_SZ            2
!define REG_BINARY               3
!define REG_DWORD                4
!define REG_DWORD_LITTLE_ENDIAN  4
!define REG_DWORD_BIG_ENDIAN     5
!define REG_LINK                 6
!define REG_MULTI_SZ             7

!define RegOpenKeyEx     "Advapi32::RegOpenKeyExA(i, t, i, i, *i) i"
!define RegQueryValueEx  "Advapi32::RegQueryValueExA(i, t, i, *i, i, *i) i"
!define RegCloseKey      "Advapi32::RegCloseKeyA(i) i"

####### Edit this!

!define ROOT_KEY         ${HKEY_CURRENT_USER}
!define SUB_KEY          "Software\Joe Software"
!define VALUE            "Strings"

####### Stop editing

Section "Read"
  StrCpy $0 ""
  StrCpy $1 ""
  StrCpy $2 ""
  StrCpy $3 ""
  System::Call "${RegOpenKeyEx}(${ROOT_KEY}, '${SUB_KEY}', \
    0, ${KEY_QUERY_VALUE}|${KEY_ENUMERATE_SUB_KEYS}, .r0) .r3"
 
  StrCmp $3 0 goon
    MessageBox MB_OK|MB_ICONSTOP "Can't open registry key! ($3)"
    Goto done
goon:

  System::Call "${RegQueryValueEx}(r0, '${VALUE}', 0, .r1, 0, .r2) .r3"
 
  StrCmp $3 0 read
    MessageBox MB_OK|MB_ICONSTOP "Can't query registry value size! ($3)"
    Goto done
 
read:
 
  StrCmp $1 ${REG_MULTI_SZ} multisz
    MessageBox MB_OK|MB_ICONSTOP "Registry value no REG_MULTI_SZ! ($3)"
    Goto done
 
multisz:
 
  StrCmp $2 0 0 multiszalloc
    MessageBox MB_OK|MB_ICONSTOP "Registry value empty! ($3)"
    Goto done
 
multiszalloc:

  System::Alloc $2
  Pop $1
 
  StrCmp $1 0 0 multiszget
    MessageBox MB_OK|MB_ICONSTOP "Can't allocate enough memory! ($3)"
    Goto done
 
multiszget:
 
  System::Call "${RegQueryValueEx}(r0, '${VALUE}', 0, n, r1, r2) .r3"
 
  StrCmp $3 0 multiszprocess
    MessageBox MB_OK|MB_ICONSTOP "Can't query registry value data! ($3)"
    Goto done
 
multiszprocess:
 
  StrCpy $4 $1
 
  loop:
 
    System::Call "*$4(&t${NSIS_MAX_STRLEN} .r3)"
    StrCmp $3 "" done
    DetailPrint $3
    StrLen $5 $3
    IntOp $4 $4 + $5
    IntOp $4 $4 + 1
    Goto loop
 
done:
 
  System::Free $1
 
  StrCmp $0 0 noClose
    System::Call "${RegCloseKey}(r0)"
 
noClose:

SectionEnd

written by KiCHiK

前へ | 目次 | 次へ


SourceForge Logo

C. Useful Scripts - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

Previous | Contents | Next

付録 C:役に立つスクリプト

C.1 Internet Explorer のバージョンを取得する

[原文]

 ; GetIEVersion
;
; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
; Returns on top of stack
; 1-6 (Installed IE Version)
; or
; '' (IE is not installed)
;
; Usage:
;   Call GetIEVersion
;   Pop $R0
;   ; at this point $R0 is "5" or whatnot

Function GetIEVersion
Push $R0
   ClearErrors
   ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "Version"
   IfErrors lbl_123 lbl_456

   lbl_456: ; ie 4+
     Strcpy $R0 $R0 1
   Goto lbl_done

   lbl_123: ; older ie version
     ClearErrors
     ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "IVer"
     IfErrors lbl_error

       StrCpy $R0 $R0 3
       StrCmp $R0 '100' lbl_ie1
       StrCmp $R0 '101' lbl_ie2
       StrCmp $R0 '102' lbl_ie2

       StrCpy $R0 '3' ; default to ie3 if not 100, 101, or 102.
       Goto lbl_done
         lbl_ie1:
           StrCpy $R0 '1'
         Goto lbl_done
         lbl_ie2:
           StrCpy $R0 '2'
         Goto lbl_done
     lbl_error:
       StrCpy $R0 ''
   lbl_done:
   Exch $R0
FunctionEnd

C.2 .NET Framework がインストールされているか?

[原文]

 ; IsDotNETInstalled
;
; Based on GetDotNETVersion
;   http://nsis.sourceforge.net/Get_.NET_Version
;
; Usage:
;   Call IsDotNETInstalled
;   Pop $0
;   StrCmp $0 1 found.NETFramework no.NETFramework

Function IsDotNETInstalled
   Push $0
   Push $1

   StrCpy $0 1
   System::Call "mscoree::GetCORVersion(w, i ${NSIS_MAX_STRLEN}, *i) i .r1"
   StrCmp $1 0 +2
     StrCpy $0 0

   Pop $1
   Exch $0
FunctionEnd

C.3 Macromedia Flash Player がインストールされているか??

[原文]

 ; IsFlashInstalled
;
; By Yazno, http://yazno.tripod.com/powerpimpit/
; Returns on top of stack
; 0 (Flash is not installed)
; or
; 1 (Flash is installed)
;
; Usage:
;   Call IsFlashInstalled
;   Pop $R0
;   ; $R0 at this point is "1" or "0"

Function IsFlashInstalled
  Push $R0
  ClearErrors
  ReadRegStr $R0 HKCR "CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}" ""
  IfErrors lbl_na
    StrCpy $R0 1
  Goto lbl_end
  lbl_na:
    StrCpy $R0 0
  lbl_end:
  Exch $R0
FunctionEnd

C.4 インターネットに接続する

[原文]

 ; ConnectInternet (uses Dialer plug-in)
; Written by Joost Verburg
;
; This function attempts to make a connection to the internet if there is no
; connection available. If you are not sure that a system using the installer
; has an active internet connection, call this function before downloading
; files with NSISdl.
;
; The function requires Internet Explorer 3, but asks to connect manually if
; IE3 is not installed.

Function ConnectInternet

   Push $R0
    
     ClearErrors
     Dialer::AttemptConnect
     IfErrors noie3
    
     Pop $R0
     StrCmp $R0 "online" connected
       MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet."
       Quit ;This will quit the installer. You might want to add your own error handling.
    
     noie3:
   
     ; IE3 not installed
     MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now."
    
     connected:
   
   Pop $R0
   
FunctionEnd

C.5 インストーラ ファイル名を取得する

[原文]

 System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
;$R0 will contain the installer filename

C.6 複数起動を禁止する

[原文]

以下のコードを .onInit 関数 に記述してください。

 System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e'
Pop $R0

StrCmp $R0 0 +3
   MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running."
   Abort

'myMutex' はユニークな値に置き換える必要があります。

C.7 More

[原文]

NSIS WikiNSIS forumNSIS development page で、その他の有用なスクリプトを見つけることができます。

前へ | 目次 | 次へ


 
SourceForge Logo

B. DLL/TLB Library Setup - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

付録 B: DLL/TLB ライブラリのセットアップ

B.1 はじめに

[原文]

ライブラリのヘッダファイルは、ダイナミック リンク ライブラリ(DLL)やタイプ ライブラリ(TLB)をセットアップするために利用できます。必要に応じて、以下のアクションが実行されます。

  • ファイルをコピー
  • 再起動時にファイルをコピー
  • バージョンチェック
  • 登録と登録解除
  • 再起動時に登録と登録解除
  • 共有 DLL のカウント
  • Windows ファイル保護のチェック

マクロは、ヘッダ ファイル Library.nsh に含まれていますので、以下のようにスクリプト内でインクルードする必要があります。

!include Library.nsh

ライブラリのマクロは、Windows 以外のプラットホームでは制限があることに注意してください。Windows 以外のプラットホームでは、コンパイル時にDLL のバージョン情報が要求されます。

B.2 ライブラリのインストール

[原文]

B.2.1 はじめに

[原文]

InstallLib マクロによってライブラリをインストールすることができます。ライブラリのセットアップ中に何か問題が発生した場合は、エラー フラグがセットされます。

ユーザに再起動するかを問い合わせるためには、モダン UI の完了ページを利用するか、あるいは IfRebootFlag を利用して独自のページ、またはメッセージ ボックスを作成します。

B.2.2 引数

[原文]

libtype shared install localfile destfile tempbasedir

libtype

ライブラリのタイプ

DLL - ダイナミック リンク ライブラリ(DLL)
REGDLL - 登録が必要なDLL
REGEXE - /regserver による登録が必要なEXE COM サーバ
TLB - タイプ ライブラリ、あるいはタイプ ライブラリを含む DLL
REGDLLTLB - タイプ ライブラリを含む、登録が必要な DLL

shared

他のアプリケーションとライブラリを共有するかどうかを指定する

NOTSHARED - ライブラリを共有しない
$VARNAME - Variable that is empty when the application is installed for the first time, which is when the shared library count will be increased.

install

インストール方法を指定する

REBOOT_PROTECTED

  • 使用中の場合、再起動時にライブラリを更新する(システム ファイルに対して必要)。
  • Windows ファイル保護によって保護されていない場合は、ライブラリを更新する。

NOREBOOT_PROTECTED

  • ライブラリが使用中の場合、ユーザに警告する。ユーザは、ライブラリを使用しているアプリケーションを閉じる必要がある。
  • Windows ファイル保護によって保護されていない場合は、ライブラリを更新する。

REBOOT_NOTPROTECTED

  • 使用中の場合、再起動時にライブラリを更新する(システム ファイルに対して必要)。
  • Windows ファイル保護をチェックせずにライブラリを更新する。

NOREBOOT_NOTPROTECTED

  • ライブラリが使用中の場合、ユーザに警告する。ユーザは、ライブラリを使用しているアプリケーションを閉じる必要がある。
  • Windows ファイル保護をチェックせずにライブラリを更新する。

localfile

コンパイラ システムにおけるライブラリの場所

destfile

ユーザのシステムにおけるライブラリの保存場所

tempbasedir

システムの再起動が必要な場合に、一時ファイルを保存するためのユーザ システムにおけるディレクトリ

Windows 9x/ME をサポートする場合は、このディレクトリは出力先(destfile)と同じボリュームでなければなりません。Windows の一時ディレクトリはどのボリュームに置くこともできますので、このディレクトリを使用することはできません。

B.2.3 オプション

[原文]

InstallLib マクロの振る舞いを修正するには、マクロを挿入する前に以下を Define してください。

B.2.3.1 LIBRARY_X64

  • Windows x64 用にビルドされた DLL をインストールする。
  • 警告: ファイル システム リダイレクトがリセットされます。

B.2.3.2 LIBRARY_SHELL_EXTENSION

  • 登録後に SHCNE_ASSOCCHANGED で SHChangeNotify を呼び出する場合に定義します。
  • シェル エクステンションをインストールしたとき、あるいはファイルの関連付けを変更したときに、シェルをリフレッシュするために使用します。

B.2.3.3 LIBRARY_COM

  • 登録後に CoFreeUnusedLibraries を呼び出す場合に定義します。
  • COM ライブラリをインストールする場合において、すべての不要なライブラリをメモリからアンロードするために使用します。

B.2.3.4 LIBRARY_IGNORE_VERSION

  • ファイルのバージョン情報を無視し、すでに存在する場合でも常にインストールする場合に定義します。
  • 古いバージョン、あるいは特定のバージョンが要求される場合に使用します。
  • $SYSDIR にインストールされる DLL に対しては推奨されません。

B.2.4 注意点

[原文]

  • Windows 9x/ME をサポートする場合は、短いファイル名だけしか使用できません(8.3)。
  • 警告: DLL を配布する場合は、常に再配布不可能なファイルを使用してください。あなたのシステム ディレクトリからファイルをコピーしてはいけません。

B.2.5 例

[原文]

B.2.5.1 非共有 DLL

 !insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED dllname.dll $SYSDIR\dllname.dll $SYSDIR

B.2.5.2 共有 DLL

 ;Add code here that sets $ALREADY_INSTALLED to a non-zero value if the application is
 ;already installed. For example:

 IfFileExists "$INSTDIR\MyApp.exe" 0 new_installation ;Replace MyApp.exe with your application filename
   StrCpy $ALREADY_INSTALLED 1
 new_installation:

 !insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_NOTPROTECTED dllname.dll $SYSDIR\dllname.dll $SYSDIR

B.3 ライブラリのアンインストール

[原文]

B.3.1 はじめに

[原文]

UnInstallLib マクロを使用するとライブラリをアンインストールすることができます。ライブラリの削除中に何か問題が発生した場合は、エラー フラグがセットされます。

B.3.2 引数

[原文]

libtype shared uninstall file

libtype

ライブラリのタイプy

DLL - ダイナミック リンク ライブラリ(DLL)
REGDLL - 登録が必要なDLL
REGEXE - /regserver による登録が必要なEXE COM サーバ
TLB - タイプ ライブラリ、あるいはタイプ ライブラリを含む DLL
REGDLLTLB - タイプ ライブラリを含む、登録が必要な DLL

shared

他のアプリケーションとライブラリを共有するかどうかを指定する

NOTSHARED - ライブラリを共有しない
SHARED - ライブラリは共有される。共有ライブラリ カウントが、ファイルがすでに利用されていないことを示している場合は削除される。

uninstall

アンインストールの方法を指定する

NOREMOVE

  • ライブラリは削除されません。Visual Basic/C++/MFC ランライムのような重要なシステムファイルに対して、このオプションを使用してください。

REBOOT_PROTECTED

  • 使用中の場合、再起動時にライブラリを削除する(システム ファイルに対して必要)。
  • Windows ファイル保護によって保護されていない場合は、ライブラリを削除する。

NOREBOOT_PROTECTED

  • ライブラリが使用中の場合、ユーザに警告する。ユーザは、ライブラリを使用しているアプリケーションを閉じる必要がある。
  • Windows ファイル保護によって保護されていない場合は、ライブラリを削除する。

REBOOT_NOTPROTECTED

  • 使用中の場合、再起動時にライブラリを削除する(システム ファイルに対して必要)。
  • Windows ファイル保護をチェックせずにライブラリを削除する。

NOREBOOT_NOTPROTECTED

  • ライブラリが使用中の場合、ユーザに警告する。ユーザは、ライブラリを使用しているアプリケーションを閉じる必要がある。
  • Windows ファイル保護をチェックせずにライブラリを削除する。

file

ライブラリの場所

B.3.3 オプション

[原文]

UnInstallLib マクロの振る舞いを修正するには、マクロを挿入する前に以下を Define してください。

B.3.3.1 LIBRARY_X64

  • Windows x64 用にビルドされた DLL をアンインストールする。
  • Warning: SetRegView とファイル システム リダイレクトがリセットされます。

B.3.3.2 LIBRARY_SHELL_EXTENSION

  • 登録解除後に SHCNE_ASSOCCHANGED で SHChangeNotify を呼び出す場合に定義します。シェル エクステンションをアンインストールしたとき、あるいはファイルの関連付けを変更したときに利用します。

B.3.3.3 LIBRARY_COM

  • 登録解除後に CoFreeUnusedLibraries を呼び出す場合に定義します。COM ライブラリをアンインストールする場合において、すべての不要なライブラリをメモリからアンロードするために使用します。

B.3.4 例

[原文]

 !insertmacro UnInstallLib REGDLL SHARED REBOOT_NOTPROTECTED $SYSDIR\dllname.dll

B.4 Visual Basic 6 のランタイム ファイル

[原文]

VB6 ランタイム ファイルをセットアップするには、新しい VB6RunTime.nsh ヘッダ ファイルを利用することができます。最新のランタイム ファイルを取得するには、vb6runtime.zip をダウンロードして展開してください。

 !include VB6RunTime.nsh

 Var AlreadyInstalled

 Section "-Install VB6 run-time files"

   ;Add code here that sets $AlreadyInstalled to a non-zero value if the application is already installed. For example:
   IfFileExists "$INSTDIR\MyApp.exe" 0 new_installation ;Replace MyApp.exe with your application filename
     StrCpy $AlreadyInstalled 1
   new_installation:

   !insertmacro VB6RunTimeInstall C:\vb6runtimes $AlreadyInstalled ;Replace C:\vb6runtimes with the location of the files

 SectionEnd

 Section "-un.Uninstall VB6 run-time files"

   !insertmacro VB6RunTimeUnInstall

 SectionEnd

備考:

  • Visual Basic アプリケーションを動作させるには、追加のファイルをインストールする必要があるかもしれません(例えば、ユーザ インターフェース コントロールのための OCX ファイル)。
  • ランタイム ファイルをインストールするには、管理者権限が必要です。これらの権限が有効かチェックするために、マルチユーザ ヘッダ ファイルを使用してください。
  • 必要な場合にユーザがコンピュータを再起動できるようにするためには、モダン UI の完了ページか他のチェック( IfRebootFlag を参照)を追加してください。

前へ | 目次 | 次へ


SourceForge Logo

A. Modern User Interface - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

付録 A: モダンユーザインターフェース

[原文]

NSIS 2 では独自のユーザインターフェースを持ったインストーラを作成することが可能となっています。モダン UI は、最近の Windows バージョンのウィザードのようなスタイルを持ったインタフェースです。この新しいインターフェースには、新しいページ(ようこそ、完了、スタートメニュー)、およびコンポーネントページにおける説明エリアといった特徴もあります。インターフェースとグラフィックは、提供された設定を利用してカスタマイズすることができます。モダン UI マクロと言語ファイルを利用すれば、簡単にモダンインターフェースのスクリプトを記述することができます。

詳細な情報とドキュメントについては、Modern UI 2 Readme を参照してください。

NSIS 2.34 には、モダン UI の新しいバージョン(version 2)が含まれています。より高速、より拡張性が高くなっています。プラグインによって新しいタイプのページを追加することができ、簡単な nsh ファイルによって既存のページを変更することまでも可能です。また、より高速な nsDialogs が使用されています。

詳細な情報と、古いバージョンのドキュメントについては、 Modern UI Readme を参照してください。

前へ | 目次 | 次へ


SourceForge Logo

5. Compile Time Command - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

第5章: コンパイル時のコマンド

5.1 Compiler Utility Commands

[原文]

これらのコマンドは、目的と機能の面において、C 言語におけるプリプロセッサに類似しています。これらのコマンドによって、ファイルのインクルードや、条件付きコンパイル、ヘッダパッキングの実行、ビルド中の処理の実行が可能となります。これらすべてのコマンドでは、変数の使用ができないという点に注意してください。

5.1.1 !include

[/NONFATAL] file

このコマンドは、スクリプトにファイル file をインクルードします。インクルードされたコードは、元のスクリプトの一部であったかのように扱われます。ここで、他のディレクトリからファイルがインクルードされた場合でも、カレントディレクトリはスクリプトがコンパイルされた位置のままという点に注意してください。インクルードファイルがあるディレクトリに移動しません。ファイルが見つからない場合は、すべてのインクルードディレクトリから探索されます。詳細については、 !addincludedir を参照してください。/nonfatal スイッチが使用されていると、ファイルが見つからない場合は、エラーの代わりに警告が発生します。

!include WinMessages.nsh
!include Library.nsh
!include C:\MyConfig.nsi
!include ..\MyConfig.nsh
!include /NONFATAL file_that_may_exist_or_not.nsh

5.1.2 !addincludedir

directory

インクルードディレクトリのリストに、他のディレクトリ directory を追加します。!include が使用されると、このリストに含まれているディレクトリが探索されます。このリストの初期値は、 ${NSISDIR}\Include だけです。

!addincludedir ..\include
!include something.nsh

5.1.3 !addplugindir

directory

指定したディレクトリ directory からプラグイン DLL を探索するよう NSIS コンパイラに指示します。

!addplugindir myplugin
MyPlugin::SomeFunction

5.1.4 !appendfile

file text

ファイル file にテキスト text を追加します。

!tempfile FILE
!appendfile "${FILE}" "XPStyle on$\n"
!appendfile "${FILE}" "Name 'test'$\n"
!include "${FILE}"
!delfile "${FILE}"
!undef FILE

5.1.5 !cd

new_path

このコマンドは、コンパイラを新しいディレクトリ new_path に移動します。new_path は相対パスでも絶対パスでも指定できます。

!cd ..\more-scripts\new

5.1.6 !delfile

file

このコマンドは、ファイル file を削除します。

!tempfile FILE
!delfile "${FILE}"
!undef FILE

5.1.7 !echo

message

このコマンドは、スクリプトのコンパイル中にメッセージ message を出力します。

!echo "hello world"

5.1.8 !error

[message]

このコマンドは、スクリプトコンパイラにエラーを発生させ、スクリプトの実行を中断させます。このエラーに、メッセージ message を追加することも可能です。

!ifdef VERSION & NOVERSION
  !error "both VERSION and NOVERSION are defined"
!endif

5.1.9 !execute

command

このコマンドは、CreateProcess() を使って、コマンド command を実行します。!system とは異なり、コマンドラインプロセッサを使用しません。そのため、入力/出力のリダイレクションや、'cd'、'dir'、'type'のようなコマンドは使用することができません。また、!execute は実行コマンドの返り値を無視します。現在のところ、!system に対する !execute の利点は、カレント作業ディレクトリが UNC で指定された場合に、トラブルが発生しないという点だけです。

POSIX プラットホームでは、 !execute は !system と同様の system() が使用されます。

!execute '"%WINDIR%\notepad.exe" "${NSISDIR}\license.txt"'

5.1.10 !packhdr

tempfile command

このオプションは、実行可能ヘッダを圧縮するために、外部の EXE 圧縮コマンド(例えば、PetiteUPX)を利用するようコンパイラに指示します。一時ファイル名 tempfile (例: "temp.dat")と、コマンドライン command (例: "C:\program files\upx\upx -9 temp.dat")を指定してヘッダを圧縮します。

!packhdr "$%TEMP%\exehead.tmp" '"C:\Program Files\UPX\upx.exe" "$%TEMP%\exehead.tmp"'

5.1.11 !system

command [compare comparevalue]

このコマンドは、system() を利用してコマンド command を実行します。返り値は、comparevaluecompare を使用して比較され、比較結果が偽(false)の場合は実行が中断されます。compare には、'<' または '>' または '<>' または '=' が指定できます。

!system '"%WINDIR%\notepad.exe" "${NSISDIR}\license.txt"'
!system 'echo !define something > newinclude.nsh'
!include newinclude.nsh
!ifdef something
  !echo "something is defined"
!endif

5.1.12 !tempfile

symbol

このコマンドは、一時ファイルを作成します。一時ファイルのパスは、名前付きシンボル symbol として定義(define)されます。

!tempfile PACKHDRTEMP
!packhdr "${PACKHDRTEMP}" '"C:\Program Files\UPX\upx.exe" "${PACKHDRTEMP}"'
!tempfile FILE
!define /date DATE "%H:%M:%S %d %b, %Y"
!system 'echo built on ${DATE} > "${FILE}"'
File /oname=build.txt "${FILE}"
!delfile "${FILE}"
!undef FILE
!undef DATE

5.1.13 !warning

[message]

このコマンドは、スクリプトコンパイラに警告を発生させます。この警告に、メッセージ message を追加することも可能です。

!ifdef USE_DANGEROUS_STUFF
  !warning "using dangerous stuff"
!endif

5.1.14 !verbose

level | push | pop

このコマンドは、出力メッセージの量を設定します。4=すべて、3=スクリプトなし、2=情報なし、1=警告なし、0=なし。

push を指定すると、!verbose は現在の出力レベルを特別なスタックにプッシュ(push)します。pop を指定すると、!verbose は現在の出力レベルを同じスタックからポップ(pop)して、それを利用します。

!verbose push
!verbose 1
!include WinMessages.nsh
!verbose pop

5.2 定義済み変数

[原文]

これらの標準的な定義済み変数を利用することが可能です。これにより、自動でビルド時刻を開発バージョンのタイトルに追加したり、日付をバージョンに追加したりすることができます。

5.2.1 ${__FILE__}

現在のスクリプト名。

5.2.2 ${__LINE__}

現在の行番号。

5.2.3 ${__DATE__}

現在のロケールに従ってスクリプトのコンパイルを開始した日付。

5.2.4 ${__TIME__}

現在のロケールに従ってスクリプトのコンパイルを開始した時刻。

5.2.5 ${__TIMESTAMP__}

現在のロケールに従ったスクリプトファイルの最終更新日時。

5.2.6 ${NSIS_VERSION}

スクリプトのビルドに使用された NSIS のバージョン。

5.2.7 スコープに関する定義済み変数

現在のコードのスコープに関する情報を保持する標準的な定義済み変数。

5.2.7.1 ${__GLOBAL__}

グローバルスコープで定義されている。

Section test

  !ifdef ${__GLOBAL__}
    !error "this shouldn't be here!"
  !endif

SectionEnd

Function test

  !ifdef ${__GLOBAL__}
    !error "this shouldn't be here!"
  !endif

FunctionEnd

PageEx instfiles

  !ifdef ${__GLOBAL__}
    !error "this shouldn't be here!"
  !endif

PageExEnd

5.2.7.2 ${__SECTION__}

セクション スコープで、セクション名(プレフィックスなし)として定義されている。

!ifdef __SECTION__
  !error "this shouldn't be here!"
!endif

Section test

  !ifndef __SECTION__
    !error "missing predefine!"
  !endif

  !if ${__SECTION__} != test
    !error "wrong predefine value!"
  !endif

SectionEnd

Section !test

  !if ${__SECTION__} != test
    !error "wrong predefine value!"
  !endif

SectionEnd

Section un.test

  !if ${__SECTION__} != test
    !error "wrong predefine value!"
  !endif

SectionEnd

5.2.7.3 ${__FUNCTION__}

関数 スコープで、関数名(プレフィックスなし)として定義されている。

!ifdef __FUNCTION__
  !error "this shouldn't be here!"
!endif

Function test

  !ifndef __FUNCTION__
    !error "missing predefine!"
  !endif

  !if ${__FUNCTION__} != test
    !error "wrong predefine value!"
  !endif

FunctionEnd

Function un.test

  !if ${__FUNCTION__} != test
    !error "wrong predefine value!"
  !endif

FunctionEnd

5.2.7.4 ${__PAGEEX__}

PageEx スコープで、ページのタイプとして定義されている。

!ifdef __PAGEEX__
  !error "this shouldn't be here!"
!endif

PageEx instfiles

  !ifndef __PAGEEX__
    !error "missing predefine!"
  !endif

  !if ${__PAGEEX__} != instfiles
    !error "wrong page type"
  !endif

PageExEnd

5.2.7.5 ${__UNINSTALL__}

アンインストーラの セクション、または 関数PageEx スコープで定義されている。

!ifdef __UNINSTALL__
  !error "this shouldn't be here!"
!endif

Function test

  !ifdef __UNINSTALL__
    !error "this shouldn't be here!"
  !endif

FunctionEnd

Function un.test

  !ifndef __UNINSTALL__
    !error "missing predefine!"
  !endif

FunctionEnd

5.3 環境変数の読み込み

[原文]

5.3.1 $%envVarName%

$%envVarName% はコンパイル時に、環境変数 envVarName に置き換えられます。

5.4 条件付きコンパイル

[原文]

コンパイラは、!define や コマンドラインの /D スイッチを利用して定義された定義済みシンボルのリストを保持しています。これらの定義済みシンボルは、!ifdef による条件付きコンパイルや、シンボルの置換(マクロの簡単な形式)に利用することができます。シンボルをその値に置き換えるためには、${SYMBOL} を使用します。SYMBOL が定義されていない場合は、置き換えは発生しません。置き換えは、first-come-first-served です。つまり、以下のようにした場合、

!define symbol_one ${symbol_two}

この行までに、symbol_two が定義されていれば、置換されます。未定義であれば、${symbol_one} が参照されても、置き換えは発生しません。

define および条件付きコンパイルに関連したコマンドを示します。

5.4.1 !define

([/date|/utcdate] gflag [value]) | (/math gflag val1 OP val2) | (/file gflag filename.txt)

このコマンドは、gflag をグローバルな定義リストに追加します。コマンドラインで /D スイッチを利用するのと同じ効果が得られます(!define コマンドより以降でのみ定義は有効となります)。

/date/utcdate が利用された場合は、value は strftime に渡され、その結果が gflag の値として利用されます。strftime は、特定の記号を、現在の時刻や日付の一部に置換します。例えば、%H は現在の時(24時間形式)に変換されます。利用可能な記号の一覧については、MSDN の strftime を検索してください。POSIX においては、man strftime を利用して一覧を得ることができます。

/math が利用された場合は、val1 OP val2 の結果が gflag の値として使用されます。OP は、+、-、*、&、|、^、/、% のいずれかです。val1 および val2 は整数値でなければならないという点に注意してください。

/file が利用された場合は、指定されたテキストファイルの全体(空白や改行も含む)が読み込まれ、gflag に格納されます。

!define USE_SOMETHING
!define VERSION 1.2
!define /date NOW "%H:%M:%S %d %b, %Y"
!define /math RESULT 3 + 10
!define /math REST 15 % ${RESULT}
!define /file BUNCHASTUFF somesourcefile.cpp

5.4.2 !undef

gflag

グローバルな定義リストから項目を取り除きます。SYMBOL が未定義となった ${SYMBOL} は "${SYMBOL}" に置換されるという点に注意してください。

!define SOMETHING
!undef SOMETHING

5.4.3 !ifdef

gflag [bcheck gflag [...]]]

このコマンドと !endif コマンドの間に含まれる行をコンパイルするかどうかを、コンパイラに通知します。gflag がグローバルに定義済みであれば(!define もしくは /D スイッチを利用)、コンパイルされます。定義済みでなければ、それらの行はスキップされます。bcheck には、& (論理積)あるいは | (論理和)が利用でき、その他の gflag とともに指定することができます。これらは、単純に左から右へ処理されます。

!define SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING is defined"
!endif
!undef SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING is defined" # will never be printed
!endif

5.4.4 !ifndef

gflag [bcheck gflag [...]]]

!ifdef の反対です。gflag が定義されていない場合、行がコンパイルされます。

5.4.5 !if

[!] value [op value2]

このコマンドと !endif コマンドの間に含まれる行をコンパイルするかどうかを、コンパイラに通知します。valueが0でない場合、あるいは valuevalue2 の比較結果が真(true)である場合は、コンパイルされます。そうでない場合は、それらの行はスキップされます。op には、== または != (文字列の比較)、<=、<、>、>= (実数の比較)、&& または || (論理値の比較)のいずれかを指定することが可能です。[!] が設定された場合は、返り値の真が偽に、偽が真に入れ替わります。

!if 1 < 2
  !echo "1 is smaller than 2!!"
!else if ! 3.1 > 1.99
  !error "this line should never appear"
!else
  !error "neither should this"
!endif

5.4.6 !ifmacrodef

gflag [bcheck gflag [...]]]

このコマンドと !endif コマンドの間に含まれる行をコンパイルするかどうかを、コンパイラに通知します。マクロ gflag が存在する場合は、コンパイルされます。そうでない場合は、それらの行はスキップされます。op には、& (論理積)あるいは | (論理和)が利用でき、その他の gflag とともに指定することができます。これらは、単純に左から右へ処理されます。

!macro SomeMacro
!macroend
!ifmacrodef SomeMacro
  !echo "SomeMacro is defined"
!endif

5.4.7 !ifmacrondef

gflag [bcheck gflag [...]]]

!ifmacrodef の反対です。マクロ gflag が存在しない場合、行がコンパイルされます。

5.4.8 !else

[if|ifdef|ifndef|ifmacrodef|ifmacrondef [...]]

このコマンドは、別の定義やマクロが設定された場合に、別のコードを簡単に挿入することを可能とします。!ifdef/!else/!endif や !ifdef/!else ifdef/!else/!endif のようなブロックを作成することができます。

!ifdef VERSION
OutFile installer-${VERSION}.exe
!else
OutFile installer.exe
!endif

5.4.9 !endif

このコマンドは、!if や !ifdef、!ifndef、!ifmacrodef、!ifmacrondef によって開始されたブロックを閉じます。

5.4.10 !insertmacro

macro_name [parameter] [...]

!macro によって作成されたマクロの内容を挿入します。引数付きで作成されたマクロについては、必要な数の引数を指定する必要があります。

!macro Print text
  DetailPrint "${text}"
!macroend
!insertmacro Print "some text"
!insertmacro Print "some more text"

5.4.11 !macro

macro_name [parameter][...]

macro_name という名前のマクロを作成します。!macro!macroend の間のすべての行が保存されます。あとでマクロを挿入するには、!insertmacro を使用します。!macro 定義は、定義された1つ以上の引数 parameter を持つことができます。!define と同様にして、マクロ内から引数にアクセスすることができます(例: ${PARMNAME})。

!macro SomeMacro parm1 parm2 parm3
  DetailPrint "${parm1}"
  MessageBox MB_OK "${parm2}"
  File "${parm3}"
!macroend

5.4.12 !macroend

!macro によって開始されたマクロの終了。

5.4.13 !searchparse

[/ignorecase] [/noerrors] [/file] source_string_or_file substring_start OUTPUTSYMBOL1 [substring [OUTPUTSYMBOL2 [substring ...]]]

source_string_or_file を解析し(文字列として、あるいは /file が設定されている場合はファイル名として)、substring_start を探索します。substring_start が見つかった場合は、OUTPUTSYMBOL1 は残りの文字列(すべての substring を除去した文字列)として定義されます。いくつかの OUTPUTSYMBOLx が指定された場合は、最後の substring はオプションです。

/noerrors が指定された場合は、マッチする箇所が、引数で指定された文字列よりも少ない場合も許されます。この場合、substring が見つからないと、後ろの OUTPUTSYMBOLx はすべて無視されます。

/file が指定された場合は、ファイルは行の連続として扱われます。ファイルは、すべての substring がマッチする行が見つかるまで探索されます。/noerrors が指定された場合は、すべての文字列がマッチしない場合でも、最も多くのシンボルがマッチした最初の行が利用されます。

# filename.cpp から '#define APP_VERSION "2.5"' という行を探索し、${VER_MAJOR} に 2 を、${VER_MINOR} に 5 を設定
!searchparse /file filename.cpp `#define APP_VERSION "` VER_MAJOR `.` VER_MINOR `"`

5.4.14 !searchreplace

[/ignorecase] symbol_out source_string searchfor replacewith

source_string から searchfor を探索して、すべてを replacewith に置換します。!define とは異なり、!searchreplace は、エラーや警告なしで symbol_out を再定義することができます。

# ${blah} を "i like ponies" と定義
!searchreplace blah "i love ponies" "love" "like"

前へ | 目次 | 次へ


 
SourceForge Logo

4. Scripting Reference - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

第4章: スクリプトリファレンス

4.1 スクリプトファイルの形式

[原文]

NSIS スクリプトファイル(.nsi)は、スクリプトコードが記述された通常のテキストファイルです。

コマンド

コマンド行の形式は、 'command [parameters]' です。

File "myfile"

コメント

; あるいは # から行末まではコメントとして扱われます。コマンドの後ろにコメントを置くことも可能です。また、C言語スタイルの、一行あるいは複数行のコメントを利用することもできます。

; コメント
# コメント

# コメント \
    ここもコメント行 (後述の 長いコマンド を参照)

/*
コメント
コメント
*/

Name /* コメント */ mysetup

File "myfile" ; コメント

; あるいは # から始まる引数を利用したい場合は、それらをクォートの中に入れます。

プラグイン

プラグインの呼び出しは、 'plugin::command [parameters]' の形式です。詳細については、 プラグイン DLL を参照してください。

nsExec::Exec "myfile"

数値

数値として扱いたいパラメータには、10進数、16進数(0x を先頭に付ける、例: 0x12345AB)、8進数(0 を先頭に付ける、x は不要)を使用します。

色は、HTMLのように16進数のRGB形式で設定します。ただし、HTMLのように先頭に#をつける必要はありません。

IntCmp 1 0x1 lbl_equal

SetCtlColors $HWND CCCCCC

文字列

空白を含む文字列を表現するには、クォートを利用します。

MessageBox MB_OK "Hi there!"

パラメータの先頭にクォートを使った場合は、クォート文字はパラメータを囲むという特性だけしか持ちません。クォート文字としては、シングルクォート( ' )、ダブルクォート( " )、逆シングルクォート( ` )が利用できます。

クォート文字は $\ でエスケープすることができます。

MessageBox MB_OK "I'll be happy" ; 文字列の中で ' を使用
MessageBox MB_OK 'And he said to me "Hi there!"' ; 文字列の中で " を使用
MessageBox MB_OK `And he said to me "I'll be happy!"` ; 文字列の中で ' と " の両方を使用
MessageBox MB_OK "$\"A quote from a wise man$\" said the wise man" ; クォートをエスケープ

$\r、$\n、$\tなどを利用して、文字列の中に改行やタブなどを置くことも可能です。詳しくは、 こちら を参照ください。

変数

変数は、 $ から始めます。ユーザ変数は宣言する必要があります。

Var MYVAR

StrCpy $MYVAR "myvalue"

詳しくは、こちら を参照ください。

長いコマンド

複数行に渡ってコマンドを記述する場合は、行末にバックスラッシュ( \ )を利用します。次の行は、行の後ろに連結されます。例を示します。

CreateShortCut "$SMPROGRAMS\NSIS\ZIP2EXE project workspace.lnk" \
    "$INSTDIR\source\zip2exe\zip2exe.dsw"

MessageBox MB_YESNO|MB_ICONQUESTION \
    "Do you want to remove all files in the folder? \
    (If you have anything you created that you want \
     to keep, click No)" \
    IDNO NoRemoveLabel

長いコマンドに対する行の分割は、コメントに対しても同様に利用することができます。ただし、コードが少し複雑になりますので、使用を避けるべきです。

# コメント \
    ここもまだコメント...

設定ファイル

設定ディレクトリに "nsisconf.nsh" という名前のファイルが存在する場合、すべてのスクリプトでデフォルト設定としてインクルードされます(コマンドラインの引数に /NOCONFIG を指定した場合の除く)。Windows における設定ディレクトリは、 makensis.exe と同じディレクトリです。他のプラットホームでは、インストール時に設定され、デフォルトは $PREFIX/etc/ です。実行時に変更することも可能です。詳細については、 3.1.3 を参照してください。

4.2 変数

[原文]

すべての変数はグローバル変数であり、セクションや関数の中で使用することができます。デフォルトでは、変数は1024文字に制限されていることに注意してください。この制限を解消するには、ビルド設定における NSIS_MAX_STRLEN の値をより大きい値に設定して NSISをビルド するか、 特別なビルド を利用してください。

4.2.1 ユーザ変数

$VARNAME

ユーザ変数は、 Var コマンドによって宣言することができます。変数は、値を格納したり、文字列操作をしたりするために利用できます。

4.2.1.1 Var コマンド

[/GLOBAL] var_name

ユーザ変数を宣言します。変数名には、[a-z][A-Z][0-9] と '_' の文字が使用できます。セクションや関数内で定義された変数も含め、定義されたすべての変数はグローバル変数となります。 これを明確にするため、セクションや関数の内部で変数を宣言する際は、 /GLOBAL フラグを使用しなくてはなりません。セクションや関数の外においては、 /GLOBAL フラグは必要ありません。

Var example

Function testVar
  Var /GLOBAL example2

  StrCpy $example "example value"
  StrCpy $example2 "another example value"
FunctionEnd

4.2.2 その他の利用可能な変数

$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $R0, $R1, $R2, $R3, $R4, $R5, $R6, $R7, $R8, $R9

レジスタ。ユーザ変数のように利用することができますが、これらの変数は通常、共有関数やマクロの内部でも利用されています。これらの変数は宣言の必要がないため、共有コード内で利用しても名前が衝突することはありません。共有コードでこれらの変数を使用する場合は、スタックを利用して元の値を保存、復元することを推奨します。これらの変数はプラグイン DLL からも読み書きが可能なため、プラグインとの通信に利用することも可能です。

$INSTDIR

インストールディレクトリ。$INSTDIR は StrCpyReadRegStrReadINIStr などを利用して変更することが可能です。例えば、 .onInit 関数において、インストール場所の検出に関するより高度な処理を実施するために利用することができます。

アンインストーラのコードにおいては、$INSTDIR はアンインストーラが存在しているディレクトリ名を保持している点に注意してください。その値は、インストーラにおける $INSTDIR と同じとは限りません。例えば、 $WINDIR にアンインストーラを出力し、ユーザもそれを移動していない場合、アンインストーラにおける $INSTDIR の値は $WINDIR となります。他の場所にアンインストーラを書き込む場合は、インストーラにおける $INSTDIR をレジストリなどに保持しておき、アンインストーラからはそれを読み出すようにすべきです。

$OUTDIR

現在の出力ディレクトリ。SetOutPath で暗黙的に設定したり、 StrCpyReadRegStrReadINIStr などで明示的に設定したりします。

$CMDLINE

インストーラのコマンドライン。コマンドラインの形式は、以下のいずれかです。

  • "full\path to\installer.exe" PARAMETER PARAMETER PARAMETER
  • installer.exe PARAMETER PARAMETER PARAMETER
  • PARAMETER の部分の解析については、 GetParameters を参照してください。コマンドラインで /D= を指定してインストールディレクトリを上書きした場合(3.2.1 参照)、それは $CMDLINE には現れません。

$LANGUAGE

現在、使用されている言語の識別子。例えば、英語は1033です。.onInit でこの値を変更することも可能です。

4.2.3 定数

定数は、 InstallDir 属性においても使用することができます。

いくつかの新しい定数は、すべての OS での動作が保障されていないことに注意してください。例えば、 $CDBURN_AREA は Windows XP かそれ以降でしか動作しません。Windows 98 で利用した場合、その値は空になります。特に説明がない定数については、すべての OS で利用することが可能です。

$PROGRAMFILES, $PROGRAMFILES32, $PROGRAMFILES64

プログラムファイルのディレクトリ。実行時に検出されますが、通常は C:\Program Filesです。Windows x64では、 $PROGRAMFILES64 は C:\Program Files を示しますが、$PROGRAMFILES と $PROGRAMFILES32 は C:\Program Files (x86) を示します。 x64 アプリケーションをインストールする場合は、 $PROGRAMFILES64 を使用してください。

$COMMONFILES, $COMMONFILES32, $COMMONFILES64

共有ファイルのディレクトリ。このディレクトリには、アプリケーション間で共有するコンポーネントを保存します。実行時に検出されますが、通常は C:\Program Files\Common Files です。Windows x64では、 $COMMONFILES64 は C:\Program Files\Common Files を示しますが、$COMMONFILES と $COMMONFILES32 は C:\Program Files (x86)\Common Files を示します。 x64 アプリケーションをインストールする場合は、 $COMMONFILES64 を使用してください。

$DESKTOP

Windows デスクトップのディレクトリ。実行時に検出されますが、通常は C:\Windows\Desktop です。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

$EXEDIR

インストーラの実行ファイルがあるディレクトリ。この値を変更することは技術的には可能ですが、よい考えではありません。

$EXEFILE

インストーラの実行ファイルのベース名(パスを取り除いたファイル名)。

$EXEPATH

インストーラの実行ファイルのフルパス名。

${NSISDIR}

NSIS がインストールされているパスを保持しています。NSIS ディレクトリにあるリソース(例: アイコン、ユーザインターフェースなど)を呼び出す場合に有用です。

makensis とデータを同じ場所に保持するようにコンパイルされた場合は(Windows でデフォルト)、makensis と同じディレクトリになります。他のプラットホームでは、コンパイル時に設定されます(INSTALL ファイルを参照)。いずれの場合においても、NSISDIR 環境変数を設定することによって、実行時に値を変更することが可能です。詳細については、 3.1.3 を参照してください。

$WINDIR

Windows ディレクトリ。実行時に検出されますが、通常は C:\Windows もしくは C:\WinNT です。

$SYSDIR

Windows システムディレクトリ。実行時に検出されますが、通常は C:\Windows\System あるいは C:\WinNT\System32 です。

$TEMP

システム一時ディレクトリ。実行時に検出されますが、通常は C:\Windows\Temp です。

$STARTMENU

スタートメニューのフォルダ。CreateShortCut を使用してスタートメニューに項目を追加する際に有用です。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

$SMPROGRAMS

スタートメニューのプログラムフォルダ。$STARTMENU\プログラム が必要な場合に使用してください。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

$SMSTARTUP

スタートメニュー プログラムのスタートアップフォルダ。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

$QUICKLAUNCH

クイック起動フォルダ(IE 4のアクティブデスクトップとそれ以降)。クイック起動が利用できない場合は、$TEMP と同じ値を返します。

$DOCUMENTS

ドキュメントディレクトリ。カレントユーザに対する典型的なパスは、C:\Documents and Settings\Foo\My Documents です。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

この定数は、Internet Explorer 4 がインストールされていない Windows 95 では利用できません。

$SENDTO

「送る」メニューのショートカット項目が保存されているディレクトリ。

$RECENT

「最近使ったファイル」のショートカットが保存されているディレクトリ。

$FAVORITES

「お気に入り」のウェブサイトやドキュメントなどへのショートカットが保存されているディレクトリ。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

この定数は、Internet Explorer 4 がインストールされていない Windows 95 では利用できません。

$MUSIC

ミュージックディレクトリ。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

この定数は、Windows XP、ME とそれ以降で利用できます。

$PICTURES

ピクチャディレクトリ。 この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

この定数は、Windows 2000、XP、ME とそれ以降で利用できます。

$VIDEOS

ビデオディレクトリ。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

この定数は、Windows XP、ME とそれ以降で利用できます。

$NETHOOD

「ネットワーク プレース」や「近くのコンピュータ」フォルダにあるリンクオブジェクトが保存されているディレクトリ。

この定数は、アクティブデスクトップがインストールされていない Windows 95 + IE 4 では利用できません。

$FONTS

システムフォントのディレクトリ。

$TEMPLATES

ドキュメントテンプレートのディレクトリ。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

$APPDATA

アプリケーションデータのディレクトリ。カレントユーザのパスを検出するには、Internet Explorer 4 かそれ以降が必要です。すべてのユーザのパスを検出するには、Internet Explorer 5 かそれ以降が必要です。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

この定数は、アクティブデスクトップがインストールされていない Windows 95 + IE 4 では利用できません。

$LOCALAPPDATA

ローカル(ローミングしない)アプリケーションデータのディレクトリ。

この定数は、Windows 2000 とそれ以降で利用できます。

$PRINTHOOD

プリンタフォルダに存在するリンクオブジェクトが保存されているディレクトリ。

この定数は、Windows 95 と Windows 98 では利用できません。

$INTERNET_CACHE

Internet Explorer の一時インターネットファイルのディレクトリ。

この定数は、アクティブデスクトップがインストールされていない Internet Explorer 4 を利用しているWindows 95 と Windows NT では利用することができません。

$COOKIES

Internet Explorer のクッキー ディレクトリ。

この定数は、アクティブデスクトップがインストールされていない Internet Explorer 4 を利用しているWindows 95 と Windows NT では利用することができません。

$HISTORY

Internet Explorer の履歴ディレクトリ。

この定数は、アクティブデスクトップがインストールされていない Internet Explorer 4 を利用しているWindows 95 と Windows NT では利用することができません。

$PROFILE

ユーザプロファイルのディレクトリ。典型的なパスは、 C:\Documents and Settings\Foo です。

この定数は、Windows 2000 とそれ以降で利用できます。

$ADMINTOOLS

管理ツールが保存されているディレクトリ。この定数の内容(すべてのユーザ、あるいはカレントユーザ)は、SetShellVarContext の設定に依存します。デフォルトはカレントユーザです。

この定数は、Windows 2000、ME とそれ以降で利用できます。

$RESOURCES

テーマやその他の Windows リソースが保存されているリソースディレクトリ。実行時に検出されますが、通常は C:\Windows\Resources です。

この定数は、Windows XP とそれ以降で利用できます。

$RESOURCES_LOCALIZED

テーマやその他の Windows リソースが保存されているローカライズリソースのディレクトリ。実行時に検出されますが、通常は C:\Windows\Resources\1033 です。

この定数は、Windows XP とそれ以降で利用できます。

$CDBURN_AREA

CD への書き込み待ちのファイルが保存されているディレクトリ。

この定数は、Windows XP とそれ以降で利用できます。

$HWNDPARENT

親ウインドウの HWND (10進数)。

$PLUGINSDIR

プラグインや InitPluginsDir を最初に呼び出した際に作成される一時フォルダのパス。インストーラが存在するとき、このフォルダは自動的に削除されます。このフォルダは、InstallOptions のための INI ファイルやスプラッシュプラグインのビットマップ、プラグインの動作に必要なその他のファイルを保持しておくのに最適なフォルダです。

4.2.4 文字列で使用される定数

$$

$ を表す。

$\r

復帰文字( \r )を表す。

$\n

改行文字( \n )を表す。

$\t

タブ文字( \t )を表す。

4.3 ラベル

[原文]

ラベルは Goto 命令やその他の分岐命令(例えば、 IfErrorsMessageBoxIfFileExistsStrCmp)の移動先として利用されます。ラベルは、セクションか関数の内部でのみ利用できます。ラベルは、ローカルスコープであり、そのラベルが存在するセクションあるいは関数内からのみアクセスが可能です。ラベルの宣言は以下のようです。

MyLabel:

ラベル名は、-、 +、 !、 $、数字(0-9)から始めることはできません。ラベルの指定を必要とする命令において、空の文字列("")や 0 は次の命令を意味する(つまり、Goto は発生しない)という点に注意してください。ピリオド(.)から始まるラベルはグローバルとなり、あらゆる関数、セクションからそのラベルへジャンプすることができます。ただし、インストーラとアンインストーラの間をジャンプすることはできません。

4.4 相対ジャンプ

[原文]

ラベルとは異なり、名前のとおり相対ジャンプは、呼び出された位置から相対的な位置へ移動します。相対ジャンプは、ラベルが使える場所であればどこでも利用することができます。相対ジャンプにおける移動先は、数値によって指定します。+1 は次の命令へジャンプし(デフォルトは前進)、+2 はひとつ命令を飛ばして、現在の命令から2つ目の命令に移動します。-2 は2つ前の命令へ、+10 は9つの命令をスキップし、現在の位置から10番目の命令へジャンプします。

インストーラが実行中の場合、実行時に実行されているすべてのコマンドが「命令」となります。MessageBoxGotoGetDLLVersionFileReadSetShellVarContext は、すべて命令です。AddSizeSectionSectionGroupSectionEndSetOverwrite (および Compiler Flags のすべて)、NameSetFontLangString はコンパイル時に実行されるため、命令ではありません。

例:

 Goto +2
   MessageBox MB_OK "You will never ever see this message box"
 MessageBox MB_OK "The last message was skipped, this one should be shown"
 Goto +4
 MessageBox MB_OK "The following message will be skipped"
 Goto +3
 MessageBox MB_OK "You will never ever see this message box"
 Goto -3
 MessageBox MB_OK "Done"

相対ジャンプでは、マクロの挿入 は、ひとつの命令として扱われないという点に注意してください。マクロは、相対ジャンプが適用されるより前に展開されますので、相対ジャンプは、挿入されたマクロ内のコードにジャンプする可能性があります。例えば、以下のコードでは、マクロはスキップされず、メッセージボックスが表示されます。

!macro relative_jump_test
  MessageBox MB_OK "first macro line"
  MessageBox MB_OK "second macro line"
!macroend

Goto +2
!insertmacro relative_jump_test

4.5 ページ

[原文]

それぞれの NSIS インストーラは、ページのセットを保持しています(自動実行インストーラを除く)。各ページは、ユーザ関数(例えば、nsDialogsInstallOptions)によって生成された、NSIS のビルトインページ、あるいはカスタムページです。

スクリプトを利用するとページの順序や見栄え、挙動をコントロールすることができます。ページをスキップしたり、真っ白に塗りつぶしたり、ある条件を満たすまで特定のページを強制的に表示したり、readme ページを表示したり、入力のために特別に設計されたページを表示したり、することができます。本節では、このようなコントロールの方法について学びます。

ページに関する基本的な命令には、PageUninstPage の2つがあります。最初の命令は、インストーラにページを追加し、2番目の命令は、アンインストーラにページを追加します。こらら2つ命令の上位に、PageEx 命令があります。この命令はインストーラとアンインストーラのどちらにもページを追加することが可能で、多くのオプションを指定することもできます。 PageEx の外で設定されるデフォルト設定を利用する代わりに、追加した特定のページに PageEx を利用してオプションを設定することができます。

4.5.1 ページ順序

ページ順序は、単純に、スクリプト内に出現する PageUninstPagePageEx の順序によって決定されます。例を示します。

 Page license
 Page components
 Page directory
 Page instfiles
 UninstPage uninstConfirm
 UninstPage instfiles

このコードは、最初に「ライセンスページ」、次に「コンポーネント選択ページ」、次に「ディレクトリ選択ページ」、最後に「インストールログ」を表示するよう NSIS に指示します。アンインストーラは、最初に「アンインストール確認ページ」、次に「アンインストールログ」を表示します。

同じタイプのページを一回以上指定することもできます。

古い NSIS スクリプトとの後方互換のため、インストーラのページコマンドが使用されない場合は、次のページが追加されます。ライセンスページ license (LicenseTextLicenseData が指定されている場合)、コンポーネント選択ページ components (ComponentText が指定されており、ひとつ以上の目に見えるセクションが存在する場合)、ディレクトリ選択ページ directory (DirText が指定されている場合)、インストールログ instfiles です。アンインストーラのページコマンドが存在しない場合は、以下のページが追加されます。アンインストールの確認ページ uninstConfirm (UninstallText が指定されている場合)、アンインストールログ instfiles です。ただし、この方法は推奨されません。新しい標準言語文字列が使用可能なため、ページコマンドを使用するようにスクリプトを修正することが強く推奨されます。

4.5.2 ページ オプション

それぞれのページは、ページの見栄えや動作を定義するユニークなデータセットを持っています。この節では、各タイプのページでどのようなデータが利用され、どのように設定するのかについて説明します。コールバック関数 については、後節で説明するため、本節では扱いません。

以下のリストは、どのようなコマンドが、どの種類のページに影響するかを示しています。特に説明がない限りは、これらのコマンドは、 PageEx ブロックの内側でも外側でも利用できます。 PageEx ブロックの内側で利用された場合は、PageEx によって設定されている現在のページにのみ影響します。そうでない場合は、他のすべてのページのデフォルト値に設定されます。

ライセンスページ

コンポーネント選択ページ

ディレクトリ選択ページ

インストール/アンインストールログページ

アンインストール確認ページ

ページのキャプションを設定するには、 Caption を使用してください。

4.5.3 コールバック

それぞれの組み込みページは、pre_function、show_function/creation_function、leave_function の3種類のコールバック関数を持ちます。pre_function は、ページが作成される直前に呼び出され、show_function はページの作成直後、かつ表示の前に呼び出されます。leave_function はユーザが「次へ」ボタンを押した直後、かつページを離れる前に呼び出されます。

  • pre_function で Abort を利用すると、そのページをスキップすることができます。
  • show_function で CreateFontSetCtlColorsSendMessage などを利用すると、ページのユーザインターフェースを調整することができます。
  • leave_function で Abort を利用すると、ユーザを現在のページに強制的にとどまらせることができます。

カスタムページは、2つのコールバック関数のみを持ちます。ひとつは、ページを生成する creation_function であり、必ず設定が必要です。もうひとつは、leave_functio で、組み込みページと同様の動作をします。

例を示します。

 Page license skipLicense "" stayInLicense
 Page custom customPage "" ": custom page"
 Page instfiles

 Function skipLicense
   MessageBox MB_YESNO "Do you want to skip the license page?" IDNO no
     Abort
   no:
 FunctionEnd

 Function stayInLicense
   MessageBox MB_YESNO "Do you want to stay in the license page?" IDNO no
     Abort
   no:
 FunctionEnd

 Function customPage
   GetTempFileName $R0
   File /oname=$R0 customPage.ini
   InstallOptions::dialog $R0
   Pop $R1
   StrCmp $R1 "cancel" done
   StrCmp $R1 "back" done
   StrCmp $R1 "success" done
   error: MessageBox MB_OK|MB_ICONSTOP "InstallOptions error:$\r$\n$R1"
   done:
 FunctionEnd

4.5.4 Page

custom [creator_function] [leave_function] [caption] [/ENABLECANCEL]
  OR
internal_page_type [pre_function] [show_function] [leave_function] [/ENABLECANCEL]

インストーラのページを追加します。組み込みページ vs カスタムページ、コールバック関数についての詳細は、前節を参照してください。

internal_page_type に指定できる項目は以下のとおりです。

  • license - ライセンスページ
  • components -コンポーネント選択ページ
  • directory - インストールディレクトリの選択ページ
  • instfiles - セクションが実行されるインストールページ
  • uninstConfirm - アンインストールの確認ページ

混乱を避けるため、インストーラの最後のページの「キャンセル」ボタンは無効になっています。有効にするには、/ENABLECANCEL を使用します。

4.5.5 UninstPage

custom [creator_function] [leave_function] [caption] [/ENABLECANCEL]
  OR
internal_page_type [pre_function] [show_function] [leave_function] [/ENABLECANCEL]

アンインストーラのページを追加します。組み込みページ vs カスタムページ、コールバック関数についての詳細は、前節を参照してください。

internal_page_type に指定できる項目については、 Page を参照してください。

4.5.6 PageEx

[un.](custom|uninstConfirm|license|components|directory|instfiles)

インストーラのページを追加、あるいは un. を前につけるとアンインストーラのページを追加します。すべての PageEx には、対応する PageExEnd が必要です。PageEx ブロックの中では、このページに特有の(他のページに影響しない)オプションを設定することができます。設定されないオプションについては、PageEx ブロックの外側で設定された値、あるいは設定されていない場合はデフォルト値が使用されます。ページのサブキャプションを設定するには、Caption を使用します。あるいは、デフォルトを設定するために、 SubCaption を使用します。PageEx でコールバック関数を設定するためには、 PageCallbacks を使用します。組み込みページ vs カスタムページについての詳細は、前節を参照してください。

使い方の例です。

 PageEx license
   LicenseText "Readme"
   LicenseData readme.rtf
 PageExEnd

 PageEx license
   LicenseData license.txt
   LicenseForceSelection checkbox
 PageExEnd

4.5.7 PageExEnd

PageEx ブロックの終了です。

4.5.8 PageCallbacks

([creator_function] [leave_function]) | ([pre_function] [show_function] [leave_function])

PageEx で定義されたページにコールバック関数を設定します。PageEx ブロックの内側でのみ利用可能です。コールバック関数についての詳細は、前節を参照してください。

PageEx license
  PageCallbacks licensePre licenseShow licenseLeave
PageExEnd

4.6 セクション

[原文]

NSIS インストーラは1つ以上のセクションを含みます。それぞれのセクションは、以下のコマンドによって作成、修正、終了されます。

  • 各セクションは、0個以上の命令を含みます。
  • セクションはインストーラによって順番に実行されます。ComponentText が設定された場合、ユーザは各セクションの有効/無効を設定することができます。
  • セクションの名前が 'Uninstall' であるか、名前の前に 'un.' がついている場合は、アンインストーラのセクションとなります。

4.6.1 Section コマンド

4.6.1.1 AddSize

size_kb

現在のセクションが、 size_kb キロバイトの追加のディスク領域を必要とすることをインストーラに通知します。セクションの内部でのみで利用できます(セクションの外側、あるいは関数内では何も効果を持ちません)。

Section
AddSize 500
SectionEnd

4.6.1.2 Section

[/o] [([!]|[-])section_name] [section_index_output]

新しいセクションを開始します。section_name が空、あるいは '-' から始まる場合は、隠しセクションとなり、ユーザはそのセクションを無効にすることができなくなります。セクションの名前が 'Uninstall' であるか、名前の前に 'un.' がついている場合は、アンインストーラのセクションとなります。section_index_output が指定されている場合は、引数はセクションのインデックスに !defined されます(インデックスは SectionSetText などで利用できます)。セクション名が '!' で始まる場合は、ボールド体で表示されます。/o スイッチが指定された場合は、そのセクションはデフォルトで非選択となります。

Section "-hidden section"
SectionEnd

Section # hidden section
SectionEnd

Section "!bold section"
SectionEnd

Section /o "optional"
SectionEnd

Section "install something" SEC_IDX
SectionEnd

セクションのインデックスにアクセスするには、中括弧を利用し、スクリプト内のセクションより後ろにコードを記述します。

正しい例:

Section test1 sec1_id
SectionEnd

Section test2 sec2_id
SectionEnd

Function .onInit
  SectionGetText ${sec2_id} $0
  MessageBox MB_OK "name of ${sec2_id}:$\n$0" #  'name of 1: test2' と正しく表示される
FunctionEnd

誤りの例:

Function .onInit
  SectionGetText ${sec2_id} $0
  MessageBox MB_OK "name of ${sec2_id}:$\n$0" # 'name of ${sec2_id}: test1' と誤って表示される
    # さらに警告が提示される:
    #   unknown variable/constant "{sec2_id}" detected, ignoring
FunctionEnd

Section test1 sec1_id
SectionEnd

Section test2 sec2_id
SectionEnd

4.6.1.3 SectionEnd

このコマンドは、現在、開かれているセクションを閉じます。

4.6.1.4 SectionIn

insttype_index [insttype_index] [RO]

このコマンドは、どのインストールタイプ(InstType を参照)が選択された時に、現在のセクションを有効状態にするかを指定します。複数の SectionIn コマンドを指定することもできます(それらは結合されます)。引数に RO を指定した場合、そのセクションは読み取り専用となり、ユーザはその状態を変更することが出来なくなります。InstType で定義されるインストールタイプの最初のインデクスは 1 で、次は 2 というようになります。

InstType "full" # これがインデクス 1
InstType "minimal" # これがインデクス 2

Section "a section"
SectionIn 1 2 # full および minimal で有効状態になる
SectionEnd

Section "another section"
SectionIn 1 # full で有効状態になる
SectionEnd

4.6.1.5 SectionGroup

[/e] section_group_name [index_output]

このコマンドはセクショングループを挿入します。セクショングループは SectionGroupEnd で閉じる必要があり、1つ以上のセクションを含まなくてはなりません。セクショングループの名前が '!' から始まる場合は、ボールド体で表示されます。/e が使用された場合は、デフォルトで展開された状態となります。index_output が指定された場合は、セクションのインデックスに !defined されます(SectionSetText などで利用できます)。名前が 'un.' から始まる場合、そのセクショングループは、アンインストーラのセクショングループとなります。

SectionGroup "some stuff"
Section "a section"
SectionEnd
Section "another section"
SectionEnd
SectionGroupEnd

4.6.1.6 SectionGroupEnd

SectionGroup で開かれたセクショングループを閉じます。

4.6.2 Uninstall セクション

アンインストーラを生成するため、'Uninstall' という名前の特別なセクションを作成しなくてはなりません。このセクションは、インストーラによってインストールされたすべてのファイル、レジストリキーなどをシステムから削除します。アンインストーラセクションの例を示します。

Section "Uninstall"
  Delete $INSTDIR\Uninst.exe ; 自分自身を削除 (なぜこのようなことが出来るのかは以下の説明を参照のこと)
  Delete $INSTDIR\myApp.exe
  RMDir $INSTDIR
  DeleteRegKey HKLM SOFTWARE\myApp
SectionEnd

アンインストーラは、システムの一時ディレクトリにコピーされてから実行されるため(ユーザは気づかない)、アンインストーラ自身を削除する最初の Delete 命令は動作します。

アンインストーラのコードでは、$INSTDIR はアンインストーラが存在するディレクトリ名を保持しているという点に注意してください。インストーラと必ずしも同じ値を保持しているとは限りません

4.7 関数

[原文]

関数はセクションと類似しており、0個以上の命令を含みます。ユーザ関数はインストーラから直接呼び出されることはなく、セクションから Call 命令を使って呼び出されます。コールバック関数は、特定のイベントが発生した際に、インストーラによって呼び出されます。

関数は、セクションや他の関数の外側で宣言する必要があります。

4.7.1 Function コマンド

4.7.1.1 Function

[function_name]

新しい関数を開始して開きます。'.' から始まる関数名(例: ".Whatever")は、通常、コールバック関数のために予約されています。'un.' から始まる関数名は、アンインストーラで使用する関数です。そのため、通常のセクションや関数からは、アンインストール関数を呼び出すことはできません。また、アンインストールセクションやアンインストール関数から、通常の関数を呼び出すこともできません。

Function func
  # some commands
FunctionEnd

Section
  Call func
SectionEnd

4.7.1.2 FunctionEnd

このコマンドは、現在、開かれている関数を閉じます。

4.7.2 コールバック関数

特別な名前を持つコールバック関数を作成することができます。コールバック関数は、インストールにおける特定の時点においてインストーラから呼び出されます。以降では、現在、利用できるコールバック関数の一覧を示します。

4.7.2.1 インストーラのコールバック関数

4.7.2.1.1 .onGUIInit

このコールバックは、最初のページがロードされる直前、つまりインストーラ画面が表示される直前に呼び出されます。ユーザインターフェースを、調整することができます。

例:

 !include "WinMessages.nsh"

 Function .onGUIInit
   # 1028 はブランドテキストコントロールのID
   GetDlgItem $R0 $HWNDPARENT 1028
   CreateFont $R1 "Tahoma" 10 700
   SendMessage $R0 ${WM_SETFONT} $R1 0
   # 背景色を白に、テキストの色を赤に設定
   SetCtlColors $R0 FFFFFF FF0000
 FunctionEnd
4.7.2.1.2 .onInit

このコールバックは、インストーラの初期化がほとんど完了した時点で呼び出されます。'.onInit' 関数において Abort を呼び出した場合は、インストーラは即座に終了します。

利用方法に関する2つの例を示します。

 Function .onInit
   MessageBox MB_YESNO "This will install. Continue?" IDYES NoAbort
     Abort ; インストーラを終了します。
   NoAbort:
 FunctionEnd

2つ目の例です。

 Function .onInit
   ReadINIStr $INSTDIR $WINDIR\wincmd.ini Configuration InstallDir
   StrCmp $INSTDIR "" 0 NoAbort
     MessageBox MB_OK "Windows Commander not found. Unable to get install path."
     Abort ; インストーラを終了します。
   NoAbort:
 FunctionEnd
4.7.2.1.3 .onInstFailed

このコールバックは、インストールが失敗した後に(ファイルが抽出できなかった、Abort コマンドを呼び出した、など)、ユーザが 'キャンセル' を押すと呼び出されます。

例:

  Function .onInstFailed
    MessageBox MB_OK "Better luck next time."
  FunctionEnd
4.7.2.1.4 .onInstSuccess

このコールバックは、インストールが成功した際、インストール画面が閉じられる直前に呼び出されます。ただし、AutoCloseWindow あるいは SetAutoClose が false に設定されている場合は、ユーザが '閉じる' を押した後に呼び出されます。

例:

  Function .onInstSuccess
    MessageBox MB_YESNO "Congrats, it worked. View readme?" IDNO NoReadme
      Exec notepad.exe ; 必要に応じて readme などを表示します。
    NoReadme:
  FunctionEnd
4.7.2.1.5 .onGUIEnd

このコールバックは、インストーラ画面が閉じられた直後に呼び出されます。プラグインに関連するユーザインターフェースを解放するためなどに利用できます。

4.7.2.1.6 .onMouseOverSection

このコールバックは、セクションツリー上のマウス位置が変化した際に呼び出されます。例えば、それぞれのセクションに対する説明を設定するために利用することができます。現在のマウス位置にあるセクションのIDが、一時的に $0 に格納されています。

例:

  Function .onMouseOverSection
    FindWindow $R0 "#32770" "" $HWNDPARENT
    GetDlgItem $R0 $R0 1043 ; 説明アイテム (UI に追加する必要あり)

    StrCmp $0 0 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR: 1番目のセクションの説明"

    StrCmp $0 1 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR: 2番目のセクションの説明"
  FunctionEnd
4.7.2.1.7 .onRebootFailed

このコールバックは、Reboot が失敗した場合に呼び出されます。このコールバック内では、WriteUninstallerプラグインFileWriteRegBin を利用すべきではありません。

例:

 Function .onRebootFailed
   MessageBox MB_OK|MB_ICONSTOP "再起動に失敗。手動で再起動してください。" /SD IDOK
 FunctionEnd
4.7.2.1.8 .onSelChange

コンポーネントページ における選択状態が変化した際に呼び出されます。SectionSetFlagsSectionGetFlags と共に利用します。

選択状態の変化とは、セクションの選択状態の変化、インストールタイプの変化の両方を含みます。

4.7.2.1.9 .onUserAbort

このコールバックは、インストールが失敗していない状態で、ユーザが 'キャンセル' を押した場合に呼び出されます。この関数から Abort が呼ばれた場合、インストールは中断されません。

例:

 Function .onUserAbort
   MessageBox MB_YESNO "インストールを中断しますか?" IDYES NoCancelAbort
     Abort ; インストーラは終了しません。
   NoCancelAbort:
 FunctionEnd
4.7.2.1.10 .onVerifyInstDir

このコールバックは、インストールパスが有効かどうかに応じてコントロールを有効にします。この関数は、ユーザがインストールディレクトリを変更するたびに呼び出されるため、MessageBox を表示するなどすべきではありません。関数から Abort が呼ばれた場合は、$INSTDIR のインストールパスは不正であるとみなされます。

例:

  Function .onVerifyInstDir
    IfFileExists $INSTDIR\Winamp.exe PathGood
      Abort ; $INSTDIR が winamp のディレクトリでない場合、そこにインストールさせません
    PathGood:
  FunctionEnd

4.7.2.2 アンインストーラのコールバック関数

4.7.2.2.1 un.onGUIInit

このコールバックは、最初のページがロードされる直前、つまりインストーラ画面が表示される直前に呼び出されます。ユーザインターフェースを、調整することができます。

例については、.onGUIInit を参照してください。

4.7.2.2.2 un.onInit

このコールバックは、アンインストーラの初期化がほとんど完了した時点で呼び出されます。'un.onInit' 関数において Abort を呼び出した場合は、アンインストーラは即座に終了します。この関数は、必要に応じて $INSTDIR を検証したり修正したりできる点に注意してください。

利用方法に関する2つの例を示します。

  Function un.onInit
    MessageBox MB_YESNO "This will uninstall. Continue?" IDYES NoAbort
      Abort ; インストーラを終了します。
    NoAbort:
  FunctionEnd

2つ目の例です。

  Function un.onInit
    IfFileExists $INSTDIR\myfile.exe found
      Messagebox MB_OK "Uninstall path incorrect"
      Abort
    found:
  FunctionEnd
4.7.2.2.3 un.onUninstFailed

このコールバックは、アンインストールが失敗した後に(Abort コマンドを使用した、何か失敗した、など)、ユーザが 'キャンセル' を押すと呼び出されます。

例:

  Function un.onUninstFailed
    MessageBox MB_OK "Better luck next time."
  FunctionEnd
4.7.2.2.4 un.onUninstSuccess

このコールバックは、アンインストールが成功した際、インストール画面が閉じられる直前に呼び出されます。ただし、SetAutoClose が false に設定されている場合は、ユーザが '閉じる' を押した後に呼び出されます。

例:

  Function un.onUninstSuccess
    MessageBox MB_OK "Congrats, it's gone."
  FunctionEnd
4.7.2.2.5 un.onGUIEnd

このコールバックは、アンインストーラ画面が閉じられた直後に呼び出されます。プラグインに関連するユーザインターフェースを解放するためなどに利用できます。

4.7.2.2.6 un.onRebootFailed

このコールバックは、Reboot が失敗した場合に呼び出されます。このコールバック内では、WriteUninstallerプラグインFileWriteRegBin を利用すべきではありません。

例:

 Function un.onRebootFailed
   MessageBox MB_OK|MB_ICONSTOP "再起動に失敗。手動で再起動してください。" /SD IDOK
 FunctionEnd
4.7.2.2.7 un.onSelChange

コンポーネントページ における選択状態が変化した際に呼び出されます。SectionSetFlagsSectionGetFlags と共に利用します。

選択状態の変化とは、セクションの選択状態の変化、アンインストールタイプの変化の両方を含みます。

4.7.2.2.8 un.onUserAbort

このコールバックは、アンインストールが失敗していない状態で、ユーザが 'キャンセル' を押した場合に呼び出されます。この関数から Abort が呼ばれた場合、アンインストールは中断されません。

例:

  Function un.onUserAbort
    MessageBox MB_YESNO "アンインストールを中断しますか?" IDYES NoCancelAbort
      Abort ; アンインストーラは終了しません。
    NoCancelAbort:
  FunctionEnd

4.8 インストーラ属性

[原文]

4.8.1 一般的な属性

以下のコマンドはすべて、インストーラの属性を調整するために利用されます。これらの属性は、インストーラの見栄えや機能を制御します。どのページを表示するか、各ページの各部分にどのようなテキストを表示するか、インストーラの名前をどうするか、どのようなアイコンを使用するか、デフォルトのインストールディレクトリをどこにするか、どのファイルに書き出すか、などです。セクションや関数の内側を除き、これらの属性はファイルのあらゆる部分で設定することができます。

デフォルトはボールド体&下線

4.8.1.1 AddBrandingImage

(left|right|top|bottom) (width|height) [padding]

ブランドの画像をインストーラの上部、あるいは下部、左部、右部に追加します。画像サイズは、指定された width|height およびインストーラの幅と高さ、インストーラのフォントに従って設定さます。最終的なサイズは、要求したものと同じになるとは限りません。実際のサイズについては、コマンドの出力を参照してください。これは、インストーラのフォントに依存するため、AddBrandingImage の前に SetFont を呼び出す必要があります。デフォルトの padding の値は 2 です。

AddBrandingImage は画像を表示するための領域を確保するだけです。実行時に画像を表示するためには SetBrandingImage を使用してください。

AddBrandingImage left 100
AddBrandingImage right 50
AddBrandingImage top 20
AddBrandingImage bottom 35
AddBrandingImage left 100 5

4.8.1.2 AllowRootDirInstall

true|false

ドライブのルートディレクトリやネットワーク共有へのインストールを有効にするかどうかを制御します。ユーザが C:\ や \\Server\Share にインストール(およびアンインストール)することを防ぐための安全な設定を変更するには、'true' に設定します。より複雑な制御が必要な場合には、.onVerifyInstDir を参照してください。

4.8.1.3 AutoCloseWindow

true|false

完了時にインストール画面を自動的に閉じるかどうかを設定します。この設定は、セクションから SetAutoClose を利用して上書きすることができます。

4.8.1.4 BGFont

[font_face [height [weight] [/ITALIC] [/UNDERLINE] [/STRIKE]]]

背景グラデーションに表示するのテキストのフォントを指定します。背景色を設定するには、BGGradient を利用します。引数が指定されなかった場合は、デフォルトのフォントが利用されます。デフォルトのフォントは、ボールドで斜体の Times New Roman です。

4.8.1.5 BGGradient

[off|(topc botc [textcolor|notext])]

グラデーションの背景画面を利用するかどうかを指定します。off を指定した場合、インストーラは背景画面を表示しません。引数が指定されない場合は、黒から青へのデフォルトのグラデーションが使用されます。グラデーションの色を指定するには、上部の色 topc あるいは下部の色 botc を指定します。色は、 RRGGBB の形式で16進数で指定します。HTMLのように先頭に '#' をつける必要はありません。'#' はコメントに利用されるためです。textcolor も同様の形式です。notext を指定すると、背景の大きなテキストが非表示となります。

4.8.1.6 BrandingText

/TRIM(LEFT|RIGHT|CENTER) text

インストール画面の下部に表示されるテキストを text に設定します。デフォルトは 'Nullsoft Install System vX.XX' です。空の文字列を指定した場合もデフォルトの文字列が使用されます。空欄にしたい場合は、空白文字 ' ' を利用します。あなたにとって特に重要でないならば、このインストーラがどうして使いやすいのかをすべての人に知ってもらうために、デフォルト文字列のままにしておいてください。文字列のサイズにコントロールのサイズを縮小するには、/TRIMLEFT/TRIMRIGHT/TRIMCENTER を使用します。

変数が利用できます。変数を使用する場合は、それらの変数を .onInit で初期化しなくてはなりません。

4.8.1.7 Caption

caption

PageEx ブロックの外側で使用された場合、インストーラのタイトルバーに表示されるテキストを caption に設定します。デフォルトは 'Name Setup' で、Name の部分は Name 命令で設定されます。もちろん、'MyApp Installer' のように自由に設定することも可能です。空の文字列を指定した場合は、デフォルト文字列が使用されます。空欄にしたい場合は、空白 ' ' を指定します。

PageEx ブロックの内側で使用された場合、現在のページのサブキャプションを caption 設定します。

変数が利用できます。変数を使用する場合は、それらの変数を .onInit で初期化しなくてはなりません。

4.8.1.8 ChangeUI

dialog ui_file.exe

ダイアログ dialogIDD_LICENSEIDD_DIRIDD_SELCOMIDD_INSTIDD_INSTFILESIDD_UNINSTIDD_VERIFY)を、ui_file.exe 内の同じリソースID を持つダイアログに置き換えます。UI ファイルから、7つすべてのダイアログを一度に置換したい場合は、all を指定します。UI のいくつかの例については、NSIS ディレクトリの下の Contrib\UIs を参照してください。

  • IDD_LICENSEIDC_EDIT1 (RICHEDIT コントロール)を含む必要があります。
  • IDD_DIRIDC_DIR (edit box)、IDC_BROWSE (button)、IDC_CHECK1 (check box)を含む必要があります。
  • IDD_SELCOMIDC_TREE1 (SysTreeView32 コントロール)と IDC_COMBO1 (combo box)を含む必要があります。
  • IDD_INSTIDC_BACK (button)、 IDC_CHILDRECT (static control the size of all other dialogs)、 IDC_VERSTR (static)、 IDOK (button)、 IDCANCEL (button)を含む必要があります。ダイアログ内に image コントロール(SS_BITMAP スタイルの static)が見つかった場合、SetBrandingImage のデフォルトとして利用されます。
  • IDD_INSTFILESIDC_LIST1 (SysListView32 コントロール)、 IDC_PROGRESS (msctls_progress32 コントロール)、 IDC_SHOWDETAILS (button)を含む必要があります。
  • IDD_UNINSTIDC_EDIT1 (edit box)を含む必要があります。
  • IDD_VERIFYIDC_STR (static)を含む必要があります。
ChangeUI all "${NSISDIR}\Contrib\UIs\sdbarker_tiny.exe"

4.8.1.9 CheckBitmap

bitmap.bmp

コンポーネント選択ページのツリービューのチェックボックスに使用されるビットマップを指定します。

このビットマップは 96x16 ピクセル、8bpp (256色)以下であり、16x16 ピクセルの6つの画像(順に、selection mask, not checked, checked, greyed out, unchecked & read-only, checked & read-only)を含む必要があります。マスク色にはマゼンダを使用します(この領域は透過されます)。

4.8.1.10 CompletedText

text

インストールが完了した際に表示されるデフォルトのテキスト("Completed")を text に置き換えます。引数が指定されなかった場合は、デフォルト文字列が使用されます。

変数が利用できます。変数を利用する場合は、メッセージが表示される前に初期化する必要があります。

4.8.1.11 ComponentText

[text [subtext] [subtext2]]

コンポーネントページにおけるデフォルトのテキストを変更するために利用します。

text: コントロール群の上、インストールアイコンの右のテキスト。

subtext: インストールタイプ選択の次のテキスト。

subtext2: コンポーネントリストの左、インストールタイプの下のテキスト。

文字列が空の場合は、デフォルトの文字列が使用されます。

変数が利用できます。変数を利用する場合は、コンポーネントページが作成される前に初期化する必要があります。

4.8.1.12 CRCCheck

on|off|force

インストールを開始する前に、インストーラが自分自身の CRC チェックを実施するかどうかを指定します。force が指定されていない場合は、ユーザがコマンドラインから /NCRC を指定してインストーラを実行すると、 CRC は実施されません。その場合は破損した(破損しているかもしれない)インストーラが実行されることになります。

4.8.1.13 DetailsButtonText

show_details_text

「Show details」 ボタンのテキストを置き換えます。引数が指定されない場合は、デフォルト文字列が使用されます。

変数が利用できます。変数を使用する場合は、インストールログページ(instfiles)が作成される前に初期化する必要があります。

4.8.1.14 DirText

[text] [subtext] [browse_button_text] [browse_dlg_text]

ディレクトリページにおけるデフォルトのテキストを変更するために利用します。

text: コントロール群の上、インストールアイコンの右のテキスト。

subtext: ディレクトリ選択フレームのテキスト。

browse_button_text: 「Browse」 ボタンのテキスト。

browse_dlg_text: 「Browse」 ボタンをクリックすると表示される 「Browse For Folder」 ダイアログのテキスト。

文字列が空の場合は、デフォルト文字列が使用されます。

変数が利用できます。変数を使用する場合は、ディレクトリページが作成される前に初期化する必要があります。

4.8.1.15 DirVar

user_var(dir input/output)

選択されたディレクトリ名を格納するための変数を指定します。この変数はデフォルトの値も持つべきです。これにより、$INSTDIR の値を操作する必要のない、二つの異なるディレクトリページを簡単に作成することができます。デフォルトの変数は $INSTDIR です。これは、PageEx の、ディレクトリページ(directory)、アンインストールの確認ページ(uninstConfirm)でのみ利用できます。

Var ANOTHER_DIR
PageEx directory
  DirVar $ANOTHER_DIR
PageExEnd

Section
  SetOutPath $INSTDIR
  File "a file.dat"
  SetOutPath $ANOTHER_DIR
  File "another file.dat"
SectionEnd

4.8.1.16 DirVerify

auto|leave

leave を指定した場合、インストールディレクトリが有効でない場合、あるいは十分な容量がない場合でも、「次へ」ボタンが無効になりません。その場合は代わりに、 GetInstDirError を利用してフラグを読み出すことができます。

PageEx directory
  DirVerify leave
  PageCallbacks "" "" dirLeave
PageExEnd

4.8.1.17 FileErrorText

file_error_text

ファイルへの書き込みができない場合に表示されるテキストを設定します。この文字列には、ファイル名を保持している $0 を含めることができます($0 は一時的にファイル名に変更されます)。例えば、"Can not write to file $\r$\n$0$\r$\ngood luck." のように使用できます。

変数が利用できます。変数を利用する場合は、File を利用する前に初期化する必要があります。

4.8.1.18 Icon

[path\]icon.ico

インストーラのアイコンを設定します。アイコンファイル内のすべてのアイコンがインストーラに取り込まれます。アンインストーラのアイコンを設定するには、UninstallIcon を使用します。

4.8.1.19 InstallButtonText

install_button_text

「Install」ボタンのテキストを install_button_text に設定します。

変数が利用できます。変数を利用する場合は、 「Install」ボタンが表示される前に初期化する必要があります。

4.8.1.20 InstallColors

/windows | (foreground_color background_color)

インストール情報画面の色を設定します。デフォルトは、00FF00 000000 です。色は、 RRGGBB の形式で16進数で指定します。HTMLのように先頭に '#' をつける必要はありません。'#' はコメントに利用されるためです。"/windows" が引数に指定された場合は、windows のデフォルト色が使用されます。

4.8.1.21 InstallDir

definstdir

デフォルトのインストールディレクトリを設定します。ディレクトリを指定する際に使用できる変数については、 変数 を参照してください(特に $PROGRAMFILES)。インストールディレクトリの最後の '\' 以降の部分文字列は、ユーザが「browse」を選択した際に利用され、インストール時には文字列の後ろに追加されます。これを無効にするには、ディレクトリの最後を '\' にします。この場合は、引数の全体をクォートで括る必要があります。理解できないようであれば、「browse」ボタンで少し遊んでみてください。

4.8.1.22 InstallDirRegKey

root_key subkey key_name

レジストリの文字列を確認して、それが有効であればインストールディレクトリとして使用するようインストーラに指示します。この属性が設定された場合、レジストリキーが有効ならば InstallDir 属性が上書きされます。レジストリキーが有効でない場合は、InstallDir に戻されます。レジストリを参照する際、このコマンドはすべてのクォートを自動的に取り除きます。文字列が ".exe" で終わっている場合は、文字列からファイル名の部分が自動的に取り除かれます(例:"C:\program files\poop\poop.exe" は "C:\program files\poop" に変換されます)。より高度なインストールディレクトリの設定を実現するためには、.onInit で $INSTDIR を設定します。

Language 文字列および変数は、InstallDirRegKeyand では使用することができません。

InstallDirRegKey HKLM Software\NSIS ""
InstallDirRegKey HKLM Software\ACME\Thingy InstallLocation

4.8.1.23 InstProgressFlags

[flag [...]]

flag に指定できる値は、smooth (滑らかなプログレスバー)、あるいは colored(InstallColors で設定された色のプログレスバー)です。

InstProgressFlags ; デフォルトの古い Windows のスタイル
InstProgressFlags smooth ; 滑らかな新しいスタイル
InstProgressFlags smooth colored ; 滑らかで色つきのスタイル
注意: インストーラが Windows XP のモダンテーマで実行されている場合、XPStyleon であると、smoothcolored も動作しません。

4.8.1.24 InstType

install_type_name | /NOCUSTOM | /CUSTOMSTRING=str | /COMPONENTSONLYONCUSTOM

インストールタイプの一覧に、インストールタイプを追加します。あるいは、カスタムインストール(インストールするコンポーネントを自由に選択する形式)を利用できないようにします。32種類まで設定でき、インストールタイプの名前を指定します。名前が 'un.' から始まるものは、アンインストーラのインストールタイプとなります。名前には、変数を利用することができ、変数はコンポーネントページが表示された後、実行時に処理されます。実行時にインストールタイプの名前を変更するには、InstTypeSetText を利用します。違いは、InstTypeSetText を利用すると、貴重なユーザ変数が節約できるという点です。最初のタイプがデフォルトになります(通常は「Typical」)。/NOCUSTOM スイッチが指定された場合は、インストールタイプ「custom」は無効になります。この場合、ユーザは事前に定義されたインストールタイプの中から1つを選択することになります。/CUSTOMSTRING スイッチを指定すると、「custom」の文字列を引数で上書きすることができます。/COMPONENTSONLYONCUSTOM フラグを指定した場合は、インストールタイプ「custom」が選択された場合にのみ、コンポーネントリストが表示されるようになります。

タイプ名に変数を利用することができます。変数を利用する場合は、コンポーネントページが作成される前に初期化する必要があります。

4.8.1.25 LicenseBkColor

color | /gray | /windows

ライセンスデータの背景色を設定します。色は、 RRGGBB の形式で16進数で指定します。HTMLのように先頭に '#' をつける必要はありません。'#' はコメントに利用されるためです。デフォルトは /gray です。/windows を指定すると、Windows OS で定義された色を使用することもできます。

4.8.1.26 LicenseData

licdata.(txt|rtf)

ユーザに提示するライセンスとして利用するテキストファイル、または RTF ファイルを指定します。ライセンスを表示する必要がない場合は、この命令を省略してください。ファイルは DOS テキストの形式(\r\n)で作成する必要があります。多言語のライセンスを定義するには、LicenseLangString を使用してください。

RTF ファイルでライセンスファイルを作成する場合、MS Word ではなくWordPad で編集することを推奨します。WordPad を使用するとより小さいサイズのファイルが作成できます。

各言語に対して、異なるライセンスを表示するには、LicenseLangString を使用します。

4.8.1.27 LicenseForceSelection

(checkbox [accept_text] | radiobuttons [accept_text] [decline_text] | off)

表示されたライセンスに対して同意が必要がどうかを指定します。これは、チェックボックス、またはラジオボタンによってなされます。デフォルトでは、チェックボックスがチェックされるか、正しいラジオボタンが選択された場合にのみ、「次へ」ボタンが有効になります。off を指定した場合は、「次へ」ボタンはデフォルトで有効になります。

LicenseForceSelection checkbox
LicenseForceSelection checkbox "同意する"
LicenseForceSelection radiobuttons
LicenseForceSelection radiobuttons "同意する"
LicenseForceSelection radiobuttons "同意する" "同意しない"
LicenseForceSelection radiobuttons "" "同意しない"
LicenseForceSelection off

4.8.1.28 LicenseText

[text [button_text]]

ライセンスページにおけるデフォルトのテキストを変更するために利用します。

text: コントロール群の上、インストールアイコンの右のテキスト。

button_text: 「I Agree」ボタンのテキスト。

文字列が空の場合は、デフォルト文字列が使用されます。

変数が利用できます。変数を使用する場合は、ライセンスページが作成される前に初期化する必要があります。

4.8.1.29 MiscButtonText

[back_button_text [next_button_text] [cancel_button_text] [close_button_text]]

「< 前へ」、「次へ >」、「キャンセル」、「閉じる」の4種類のボタンの文字列を置き換えます。引数が省略された場合は、デフォルトが使用されます。

変数が利用できます。変数を使用する場合は、.onInit で初期化する必要があります。

4.8.1.30 Name

name [name_doubled_ampersands]

インストーラの名前 nameを設定します。通常、名前は単に製品の名前です(例: 'MyApp'、'CrapSoft MyApp')。名前の文字列にアンパサンド( & )が含まれる場合は、2番目のパラメータに、アンパサンドを2重にした同じ名前を設定してください。例えば、製品名が "Foo & Bar" の場合は、以下のようにします。

 Name "Foo & Bar" "Foo && Bar"

名前の文字列にアンパサンドが含まれており、名前に LangString を使用した場合は、2番目のパラメータにアンパサンドを2重にした同じ名前を設定した Name 命令も作成する必要があります。

変数が利用できます。変数を使用する場合は、.onInit で初期化する必要があります。

4.8.1.31 OutFile

[path\]install.exe

MakeNSIS がインストーラを書き出す出力ファイル名を指定します。これは、単に MakeNSIS の出力ファイル名であり、インストーラの内容には何も影響がありません。

4.8.1.32 RequestExecutionLevel

none|user|highest|admin

Windows Vista と Windows 7 において要求される実行レベルを指定します。この値はインストーラおよびアンインストーラの XML マニフェストに埋め込まれ、Vista/7 やそれ以降の Windows に対して、インストーラが必要とする特権レベルを通知します。user は、管理者権限をもたない通常ユーザレベルを要求します。highest は、現在のユーザで利用可能な最も高い実行レベルを要求します。この場合、権限の昇格を確認するためのプロンプトが Windows によって表示されます。プロンプトでは、ユーザのパスワードが要求されます。admin は、管理者権限を要求し、同様に Windows によってプロンプトが表示されます。none を指定した場合(デフォルト)、マニフェストは空となり、どの実行レベルが必要かは Windows が判断します。Windows Vista/7 は、自動的に NSIS を認識し、管理者権限を要求します。そのため、noneadmin は実質的に同じ効果を持ちます。

少なくともマイクロソフトは、すべてのアプリケーションに必要な実行レベルの情報を付与するよう推奨しています。情報のないインストーラは、互換モードの下に置かれます。このモードの回避策には、ユーザのスタートメニューに作成されたすべてのショートカットを、自動的に「すべてのユーザ」のスタートメニューに移動するというものがあります。システムフォルダへのインストールやローカルマシンレジストリ(HKLM)に書き込みを必要としないインストーラには、user の実行レベルを指定するべきです。

この話題に関するその他の情報については MSDN を参照してください。キーワードは "UAC"、"requested execution level"、"vista manifest"、"vista security" などです。

4.8.1.33 SetFont

[/LANG=lang_id] font_face_name font_size

インストーラのフォントを設定します。設定したフォントは、ユーザのマシンにも存在する必要があるという点に注意してください。あなただけが持っている珍しいフォントを指定しないでください。

言語ごとに異なるフォントを利用したい場合は、/LANG スイッチを使用してください。例を示します。

 SetFont /LANG=${LANG_ENGLISH} "English Font" 9
 SetFont /LANG=${LANG_FRENCH} "French Font" 10

すべての言語に対して、フォントとフォントサイズを保持している ^Font と ^FontSize という名前の2つの LangString が存在します。

4.8.1.34 ShowInstDetails

hide|show|nevershow

インストールの詳細を表示するかどうかを設定します。デフォルトで詳細を隠すには hide を(ユーザが詳細を見ることは可能)、デフォルトで表示するには show を、まったく参照できないようにするには nevershow を指定します。セクションにおいて、SetDetailsView を利用して設定を上書きすることも可能です。

4.8.1.35 ShowUninstDetails

hide|show|nevershow

アンインストールの詳細を表示するかどうかを設定します。デフォルトで詳細を隠すには hide を(ユーザが詳細を見ることは可能)、デフォルトで表示するには show を、まったく参照できないようにするには nevershow を指定します。セクションにおいて、SetDetailsView を利用して設定を上書きすることも可能です。

4.8.1.36 SilentInstall

normal|silent|silentlog

インストーラをサイレントモードで実行するかどうかを指定します。silent あるいは silentlog を指定した場合は、SF_SELECTED フラグ(SectionSetFlagsで設定)を持つすべてのセクションは、インストーラからの画面出力なしでインストールされます。この場合においても、スクリプトは必要なものを表示することができます。サイレントインストーラにおけるデフォルトの値を指定するには、MessageBox の /SD を使用してください。注意点としては、normal を指定した場合でも、ユーザがコマンドラインで /S を指定してインストーラを実行すると、silent が使用された場合と同様に、サイレントモードで動作します。LogSet も参照してください。

詳細な情報については、 4.12 節を参照してください。

4.8.1.37 SilentUnInstall

normal|silent

アンインストーラをサイレントモードで実行するかどうかを指定します。silent あるいは silentlog を指定した場合は、アンインストールセクションは、アンインストーラからの画面出力なしでアンインストールされます。この場合においても、スクリプトは必要なものを表示することができます。サイレントインストーラにおけるデフォルトの値を指定するには、MessageBox の /SD を使用してください。注意点としては、normal を指定した場合でも、ユーザがコマンドラインで /S を指定してアンインストーラを実行すると、silent が使用された場合と同様に、サイレントモードで動作します。LogSet も参照してください。

詳細な情報については、 4.12 節を参照してください。

4.8.1.38 SpaceTexts

[req_text [avail_text]]

「必要な空き領域」 および 「使用可能な空き領域」 のテキストを変更します(デフォルトは「Space required: 」および「Space available: 」)。none を指定した場合は、空きのテキストは表示されません。

変数が利用できます。変数を利用する場合は、コンポーネントページが作成される前に初期化する必要があります。

4.8.1.39 SubCaption

[page_number subcaption]

インストーラページのサブキャプションを変更します(0=":License Agreement"、1=": Installation Options"、2=": Installation Directory"、3=": Installing Files"、4=": Completed")。空の文字列を指定した場合は、デフォルト文字列が使用されます。空欄にする場合は、空白 " " を指定します。

PageEx ブロック内で Caption を使用することによって、サブキャプションを設定したり、デフォルト文字列を上書きしたりすることもできます。

変数が利用できます。変数を利用する場合は、関連ページが作成される前に初期化する必要があります。

4.8.1.40 UninstallButtonText

text

アンインストーラにおける「Uninstall」ボタンのテキストを変更します。パラメータが指定されない場合は、デフォルトの文字列が使用されます。WriteUninstaller (UninstallEXENameを置換する)も参照してください。

変数が利用できます。変数を利用する場合は、アンインストールボタンが表示される前に初期化する必要があります。

4.8.1.41 UninstallCaption

caption

アンインストーラのタイトルバーに表示されるテキストを設定します。デフォルトは 'Name Uninstall' で Name の部分は Name 命令で設定されます。もちろん、'MyApp uninstaller' のように自由に設定することも可能です。空の文字列を指定した場合は、デフォルト文字列が使用されます。空欄にしたい場合は、空白 ' ' を指定します。

変数が利用できます。変数を利用する場合は、un.onInit で初期化する必要があります。

4.8.1.42 UninstallIcon

[path\]icon.ico

アンインストーラのアイコンを設定します。

4.8.1.43 UninstallSubCaption

page_number subcaption

アンインストーラページのデフォルトのサブキャプションを設定します(0=": Confirmation"、1=": Uninstalling Files"、2=": Completed")。空の文字列を指定した場合は、デフォルト文字列が使用されます。空欄にしたい場合は、空白 ' ' を指定します。

PageEx ブロック内で Caption を使用することによって、サブキャプションを設定したり、デフォルト文字列を上書きしたりすることもできます。

変数が利用できます。変数を利用する場合は、関連ページが作成される前に初期化する必要があります。

4.8.1.44 UninstallText

text [subtext]

アンインストール確認ページにおけるテキストを指定します。

text: コントロール群の上のテキスト

subtext: アンインストール場所の次のテキスト

変数が利用できます。変数を利用する場合は、アンインストール確認ページが作成される前に初期化する必要があります。

4.8.1.45 WindowIcon

on|off

インストーラのアイコンを表示するかどうかを設定します。

4.8.1.46 XPStyle

on|off

XP マニフェストをインストーラに追加するかどうかを設定します。Windows XP で実行される場合において、XP マニフェストがあるとインストーラは新しい XP スタイルを使用します。アンインストーラにおいても同様です。

4.8.2 コンパイラのフラグ

本節で示すコマンドは、コンパイラがどのようにコードを生成するか、どのようにデータを圧縮するかを制御します。特に説明がない限り、これらのコマンドはスクリプトのどの位置でも利用することができます。また、各コマンドが記述された位置より後ろのすべての行に影響します(他のコマンドで上書きされるまで)。これらは、フロー制御命令 によってジャンプすることはできません。

例えば、以下のスクリプトでは、blah.dat は上書きされることはありません。

${If} $0 == 0
  SetOverwrite on
${Else}
  SetOverwrite off
${EndIf}
File blah.dat # ここでは、overwrite は常に off !

代わりに、以下のようにします。

${If} $0 == 0
  SetOverwrite on
  File blah.dat
${Else}
  SetOverwrite off
  File blah.dat
${EndIf}

4.8.2.1 AllowSkipFiles

on|off

このコマンドは、ユーザがファイルをスキップできるようにするかどうかを指定します。ユーザがファイルをスキップできるようにするには、SetOverwriteon (デフォルト)に設定する必要があります。スキップすると、ファイルを抽出しようとする際に、インストーラは書き込みのためのファイルをオープンしません。off に設定した場合、ファイルをスキップするための「Ignore」ボタンは表示されず、ユーザにはインストールを中断するための「Cancel」ボタンか、出力ファイルのオープンをリトライするための「Retry」ボタンだけが表示されます。on に設定した場合、ユーザはファイルをスキップすることができるようになります(エラーフラグがセットされます、SetOverwrite を参照)。

4.8.2.2 FileBufSize

buffer_size_in_mb

このコマンドは、コンパイラ内部のファイルバッファのサイズを設定します。どれくらいのファイルを一度にメモリに読み込むのかを制限することによって、コンパイラのメモリ使用を制御することを可能とします。コンパイラは入力と出力の両方を必要とするため、指定された2倍のメモリサイズをファイルバッファとして使用します。このコマンドは、圧縮バッファ(数 MB)や、その他の内部バッファ(通常、最大 1MB 程度)のサイズは制限しません。非常に小さい数値を指定すると、性能が低下します。また非常に大きい数値を指定すると、システムリソースを占有してしまい、強制的にコンパイル処理が中断される可能性があります。デフォルト値は 32MB です。

4.8.2.3 SetCompress

auto|force|off

このコマンドは、データを圧縮するかどうかの圧縮フラグ設定します。通常、SetCompress フラグは、それ以降のコマンドに対して有効です。また、ファイルの最後の SetCompress コマンドは、インストール情報セクションやアンインストールデータを圧縮するかどうかを決定します。auto が設定された場合は、圧縮後のサイズが圧縮前のサイズよりも小さいならば、ファイルは圧縮されます。force が設定された場合は、常に圧縮されます。off が設定された場合は、圧縮されません(非常に高速です)。

注意: Solid 圧縮が使用された場合は、このオプションは効果を持ちません。

4.8.2.4 SetCompressor

[/SOLID] [/FINAL] zlib|bzip2|lzma

このコマンドは、インストーラ内のファイルやデータを圧縮するための圧縮アルゴリズムを設定します。このコマンドは、セクションや関数の外側、データがひとつも圧縮されていない段階でのみ使用することができます。同じインストーラ内で、ファイルごとに異なる圧縮手法を使用することはできません。コンパイルエラーを避けるため、スクリプトの一番最初に本コマンドを記述することを推奨します。

サポートしている圧縮方式は、ZLIB、BZIP2、LZMA です。

ZLIB (デフォルト) は、高速でシンプルな手法であり、 deflate アルゴリズムを使用します。デフォルトの圧縮レベルでは、約 300 KB のメモリを使用します。

BZIP2 は、通常、ZLIB よりも高い圧縮率となりますが、やや遅く、より多くのメモリを使用します。デフォルトの圧縮レベルでは、約 4 MB のメモリを使用します。

LZMA は、新しい圧縮手法であり、非常に高い圧縮率となります。展開速度が速く(2 GHz CPU で 10-20 MB/s)、圧縮速度は遅いという特徴があります。展開に使用するメモリサイズは、辞書サイズ+数 KB で、デフォルトの辞書サイズは 8 MB です。

/FINAL が使用された場合は、以降の SetCompressor 呼び出しは無視されます。

/SOLID が使用された場合は、すべてのインストーラデータはひとつのブロックに圧縮されます。これにより、より高い圧縮率を得ることができます。

4.8.2.5 SetCompressorDictSize

dict_size_mb

LZMA 圧縮で使用する辞書サイズをメガバイト(MB)で設定します。デフォルトは 8 MB です。

4.8.2.6 SetDatablockOptimize

on|off

このコマンドは、データブロックの最適化を実施するかどうかを設定します。データブロック最適化では、追加しようとしているデータが、すでにデータブロックに存在していないかをチェックし、存在する場合はデータへの参照のみを格納します(わずかですがサイズが節約できます)。on のままにしておくことを強く推奨します。

4.8.2.7 SetDateSave

on|off

このコマンドは、ファイルの日時を保存するかどうかのフラグを設定します。on に設定すると、 File コマンドによってファイルの最終更新日時が保存され、インストール時にそれらが復元されます。on あるいは off が指定できます。デフォルトは on です。

4.8.2.8 SetOverwrite

on|off|try|ifnewer|ifdiff|lastused

このコマンドは、File コマンドが既存のファイルを上書きするかどうかを設定します。on が設定された場合はファイルは上書きされます(デフォルト)。on が設定された場合は、既存のファイルは上書きされません。try が設定された場合は、可能であれば上書きされます。ファイルに書き込みができない場合は、ユーザへの通知なしでスキップされます。ifnewer が設定された場合は、既存のファイルが、新しいファイルよりも古い場合にのみ上書きされます。ifdiff が設定された場合は、既存のファイルが、新しいファイルよりも古いか新しい場合にのみ上書きされます。注意: ifnewer あるいは ifdiff が設定された場合は、SetDateSave の設定に関わらず、出力先ファイルの日時が設定されます。

SetOverwrite off
File program.cfg # 上書きしてほしくない設定ファイル
SetOverwrite on

4.8.3 バージョン情報

4.8.3.1 VIAddVersionKey

 [/LANG=lang_id] keyname value

ファイルのプロパティのバージョンタブにフィールドを追加します。システムによって提供されたフィールドでも ユーザ定義のフィールドでも可能です。以下のフィールドがシステムによって提供されています。

  • ProductName
  • Comments
  • CompanyName
  • LegalCopyright
  • FileDescription
  • FileVersion
  • ProductVersion
  • InternalName
  • LegalTrademarks
  • OriginalFilename
  • PrivateBuild
  • SpecialBuild

これらのフィールド名は、対象システムにおいて翻訳されます。ユーザ定義のフィールドは翻訳されないままになります。

VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment"
VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "© Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application"
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3"

4.8.3.2 VIProductVersion

[version_string_X.X.X.X]

ファイルのプロパティのバージョンタブの上部に製品バージョン(Product Version)を追加します。

VIProductVersion "1.2.3.4"

4.9 命令

[原文]

4.9.1 基本的な命令

NSIS スクリプトで使用される命令は、PHP とアセンブリを合わせたようなものです。本当の高級言語のような構造はありませんが、命令そのもの(大部分)は高レベルであり、便利な文字列の操作(例: 文字列の連結など)もあります。基本的に、25個のレジスタ(20個は汎用、5個は特殊)と、スタックが利用できます。

4.9.1.1 Delete

[/REBOOTOK] file

対象システムからファイルを削除します。file は、ファイル名でもワイルドカードでも指定できますが、フルパスで指定する必要があります。/REBOOTOK を指定すると、ファイルが削除できない場合には再起動時に削除されます。再起動時にファイルが削除されると、再起動フラグがセットされます。ファイルが削除できない場合は、エラーフラグがセットされます。ただし、存在しないファイルを削除しようとした場合は、エラーフラグはセットされません。

Delete $INSTDIR\somefile.dat

4.9.1.2 Exec

command

指定されたプログラムを実行し、すぐに処理を続行します。指定されたファイルは、コンパイル側のシステムではなく、対象システムに存在する必要があるという点に注意してください。$OUTDIR は作業ディレクトリとして使用されます。プロセスが起動できなかった場合はエラーフラグがセットされます。注意点: コマンドに空白が含まれる場合は、引数と区別するためにクォートで括る必要があります。Windows 9x では、引数の有無に関わらず、クォートで括らないと動作しません。

Exec '"$INSTDIR\someprogram.exe"'
Exec '"$INSTDIR\someprogram.exe" some parameters'

4.9.1.3 ExecShell

action command [parameters] [SW_SHOWDEFAULT | SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE]

指定されたプログラムを ShellExecute を利用して実行します。通常の action は、"open", "print" などですが、空の文字列を指定してデフォルトのアクションが実行させることも可能です。parameters や表示タイプの指定はオプションです。$OUTDIR は作業ディレクトリとして使用されます。プロセスが起動できなかった場合はエラーフラグがセットされます。

ExecShell "open" "http://nsis.sf.net/"
ExecShell "open" "$INSTDIR\readme.txt"
ExecShell "print" "$INSTDIR\readme.txt"

4.9.1.4 ExecWait

command [user_var(exit code)]

指定されたプログラムを実行し、実行されたプロセスが終了するまで待機します。詳細については、Exec を参照してください。user_var が指定されない場合は、実行されたプログラムが0以外のエラーコードが返したり、エラーが発生したりすると、ExecWait はエラーフラグをセットします。user_var が指定された場合は、終了コードが格納されます(エラーが発生した場合はエラーフラグがセットされ、user_var の内容は未定義となります)。注意点: コマンドに空白が含まれる場合は、引数と区別するためにクォートで括る必要があります。Windows 9x では、引数の有無に関わらず、クォートで括らないと動作しません。

ExecWait '"$INSTDIR\command.exe" parameters'
ExecWait '"$INSTDIR\someprogram.exe"'
ExecWait '"$INSTDIR\someprogram.exe"' $0
DetailPrint "some program returned $0"

4.9.1.5 File

[/nonfatal] [/a] ([/r] [/x file|wildcard [...]] (file|wildcard) [...] | /oname=file.dat infile.dat)

現在の出力パス($OUTDIR)に展開するファイルを追加します。

  • 出力ファイル名は $OUTDIR\filename_portion_of_file であるという点に注意してください。
  • 出力名を変更するには /oname=X スイッチを使用します。X は変数を含むことができます。また、完全に限定されたパスでも相対パスでも指定できます。相対パスの場合は、SetOutPath によって設定される $OUTDIR からのパスとなります。このスイッチを使用した場合は、複数のファイルを指定することはできません。出力名が空白を含む場合は、以下の例に示すように、 引数の全体(/oname も含む)をクォートする必要があります。
  • ワイルドカードがサポートされています。
  • /r スイッチが使用された場合は、マッチするファイルやディレクトリがサブディレクトリから再帰的に探索されます。1つのパスセグメントだけが指定された場合(例: File /r something)は、カレントディレクトリが再帰的に探索されます。ひとつ以上のセグメントが指定された場合(例: File /r something\*.*)は、最後のパスセグメントがマッチング条件として使用され、残りの部分は再帰的に探索するディレクトリとして使用されます。ディレクトリ名がマッチした場合、ディレクトリ内のすべてが再帰的に追加されます。ディレクトリ構造は保存されます。
  • ファイルやディレクトリを除外するには、/x スイッチを使用します。
  • 追加されたファイルの属性を保存するには、/a スイッチを使用します。
  • 上書きモードが try あるいは on でファイルが上書きできなかった場合、ユーザーが「Ignore」を選択した場合、File コマンドはエラーフラグをセットします。
  • /nonfatal スイッチが使用された場合、ファイルが見つからないと、エラーの代わりに警告が発行されます。
File something.exe
File /a something.exe
File *.exe
File /r *.dat
File /r data
File /oname=temp.dat somefile.ext
File /oname=$TEMP\temp.dat somefile.ext
File "/oname=$TEMP\name with spaces.dat" somefile.ext
File /nonfatal "a file that might not exist"
File /r /x CVS myproject\*.*
File /r /x *.res /x *.obj /x *.pch source\*.*

注意点: /r スイッチを利用すると、マッチするディレクトリとファイルの両方が探索されます。与えら得れたパスが完全にひとつのディレクトリにマッチしていた場合でさえも、ワイルドカードの利用の有無によらず、常に実行されます。つまり、以下のようなディレクトリの構造があった場合、

<DIR> something
  file.dat
  another.dat
<DIR> dir
  something
  <DIR> dir2
    file2.dat
<DIR> another
  <DIR> something
    readme.txt

以下のような File コマンドは、

File /r something

ルートディレクトリにある something という名前のディレクトリ、dir ディレクトリ内の something という名前のファイル、another ディレクトリ内のsomething という名前のディレクトリがマッチします。ルートディレクトリの something という名前のディレクトリだけにマッチさせるためには、以下のようにします。

File /r something\*.*

この場合、\*.* は検索条件として利用され、something は探索するディレクトリ名として使用されます。something だけを指定すると、カレントディレクトリのすべてが再帰的に探索されるため、something というディレクトリも、another\something というディレクトリもマッチしてしまいます。

4.9.1.6 Rename

[/REBOOTOK] source_file dest_file

ファイル名を source_file から dest_file に変更します。ファイルを他のどこかへ移動することができます。また、ディレクトリを同じドライブ上の別の場所へ移動することもできます。dest_file が存在してはいけません。dest_file が存在する場合、/REBOOTOK を使用しない限りは、移動に失敗します。/REBOOTOK が指定されている場合は、ファイルが移動できないと(例えば、移動先のファイルが存在する場合)、システムが再起動された際にファイルを移動します。再起動時にファイルが移動された場合は、リブートフラグがセットされます。ファイルの名前が変更できなかった場合(かつ /REBOOTOK が使用されていない場合)や、source_file が存在しない場合はエラーフラグがセットされます。

絶対パスが指定されていない場合は、カレントフォルダが使用されます。カレントフォルダは、SetOutPath 命令によって最後に設定されたフォルダです。SetOutPath を使用していない場合、カレントフォルダは $EXEDIR です。

Rename $INSTDIR\file.ext $INSTDIR\file.dat

4.9.1.7 ReserveFile

[/nonfatal] [/r] [/x file|wildcard [...]] file [file...]

後で使用するため、データブロックのファイルを予約します。ファイルは、スクリプトに出現した順に、圧縮データブロックに追加されます。しかしながら、関数はスクリプトに現れる順に呼び出されるとは限りません。初期に呼び出される関数内でファイルを追加し、その関数がスクリプトの最後に置かれている場合、必要なファイルを得るためには、それより前に追加されたすべてのファイルを展開する必要があります。多くのファイルが存在する場合、この処理には長い時間が必要となります。.onInit は、そのような関数のひとつです。この関数は、他の何かが表示される前の、かなり早い段階で呼び出されます。この関数がスクリプトのかなり後ろに置かれていると、関数内でファイルを展開した場合、かつ、それより前に多くのファイルが追加されていた場合、インストーラのロードに非常に長い時間が必要となります。このような状況において、このコマンドは有効です。ファイルをデータブロックの先頭に追加することにより、ロード処理を高速化することができます。NSIS は圧縮されたデータブロックの最初から最後までのすべてをシークする必要がなくなります。

引数については、File を参照してください。

4.9.1.8 RMDir

[/r] [/REBOOTOK] directory_name

指定されたディレクトリ(ワイルドカードなしの完全に限定されたパス)を削除します。/r が指定されていない場合は、完全に空のディレクトリのみが削除されます。/r が指定された場合は、ディレクトリは再帰的に削除されます。よって、ディレクトリ内のすべてのファイルとディレクトリが削除されます。/REBOOTOK が指定された場合は、処理中に削除できなかったファイルやディレクトリは、再起動時に削除されます。再起動時に削除された場合は、リブートフラグがセットされます。ファイルやディレクトリが削除できなかった場合は、エラーフラグがセットされます。

RMDir $INSTDIR
RMDir $INSTDIR\data
RMDir /r /REBOOTOK $INSTDIR
RMDir /REBOOTOK $INSTDIR\DLLs

注意: 現在の作業ディレクトリは削除することができません。現在の作業ディレクトリは、SetOutPath で設定します。例えば、以下の例ではディレクトリは削除されません。

SetOutPath $TEMP\dir
RMDir $TEMP\dir

次の例ではディレクトリは削除されます。

SetOutPath $TEMP\dir
SetOutPath $TEMP
RMDir $TEMP\dir

警告: アンインストーラで RMDir /r $INSTDIR を使用することは安全ではありません。万が一、ユーザが Program Files にプログラムをインストールしていると、このコマンドは、関係のない他のプログラムも含め、 Program Files フォルダ内のすべてを削除してしまいます。また、プログラムのファイルではない他のファイルを置いており、それらはプログラムによって削除されると思っているかもしれません。インストーラによってインストールされたファイルだけを簡単にアンインストールするための方法については、Uninstall only installed files を参照してください。

4.9.1.9 SetOutPath

outpath

出力パス($OUTDIR)を設定し、存在しない場合は作成します(必要であれば再帰的に)。フルパスで指定する必要があります。通常は $INSTDIR です($INSTDIR を "-" で指定することもできます)。

SetOutPath $INSTDIR
File program.exe

4.9.2 レジストリ、INIファイル命令

以下に示すレジストリ命令において、空の文字列("")はデフォルトのキー(regedit.exe で "(既定)" と表示されるキー)を指定するためのキー名として使用されます。

INI 操作命令において、フルパスが指定されない場合は、Windows ディレクトリが使用されます。

4.9.2.1 DeleteINISec

ini_filename section_name

INI ファイル ini_filename から、section_name という名前のセクション全体を削除します。INI ファイルからセクションが削除できない場合は、エラーフラグがセットされます。セクションが見つからない場合は、エラーフラグはセットされません。

WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
WriteINIStr $TEMP\something.ini section2 nsis true
DeleteINISec $TEMP\something.ini section1

4.9.2.2 DeleteINIStr

ini_filename section_name str_name

INI ファイル ini_filename のセクション section_name から、str_name という名前の文字列を削除します。INI ファイルから文字列が削除できない場合は、エラーフラグがセットされます。文字列が見つからない場合は、エラーフラグはセットされません。

WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
DeleteINIStr $TEMP\something.ini section1 somethingelse

4.9.2.3 DeleteRegKey

[/ifempty] root_key subkey

レジストリキー subkey を削除します。/ifempty が指定された場合は、子のキーを持たない場合だけレジストリキーが削除されます。/ifempty の指定がない場合は、レジストリ木の全体が削除されます。root_key に指定可能な値については、WriteRegStr で一覧を示します。レジストリからキーが削除できない場合、あるいは存在しない場合は、エラーフラグがセットされます。

DeleteRegKey HKLM "Software\My Company\My Software"
DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys"

4.9.2.4 DeleteRegValue

root_key subkey key_name

レジストリの値を削除します。root_key に指定可能な値については、WriteRegStr で一覧を示します。レジストリから値が削除できない場合、あるいは存在しない場合は、エラーフラグがセットされます。

DeleteRegValue HKLM "Software\My Company\My Software" "some value"

4.9.2.5 EnumRegKey

user_var(output) root_key subkey index

root_key\subkey にある index 番目のレジストリキーの名前を、ユーザ変数 $x にセットします。root_key に指定可能な値については、WriteRegStr で一覧を示します。それ以上、キーがない場合は、空の文字列を返します。エラーがある場合は、エラーフラグをセットして空の文字列を返します。

StrCpy $0 0
loop:
  EnumRegKey $1 HKLM Software $0
  StrCmp $1 "" done
  IntOp $0 $0 + 1
  MessageBox MB_YESNO|MB_ICONQUESTION "$1$\n$\nMore?" IDYES loop
done:

4.9.2.6 EnumRegValue

user_var(output) root_key subkey index

root_key\subkey にある index 番目のレジストリ値の名前を、ユーザ変数 $x にセットします。root_key に指定可能な値については、WriteRegStr で一覧を示します。それ以上、値がない場合、あるいはエラーがある場合は、エラーフラグをセットして空の文字列を返します。

StrCpy $0 0
loop:
  ClearErrors
  EnumRegValue $1 HKLM Software\Microsoft\Windows\CurrentVersion $0
  IfErrors done
  IntOp $0 $0 + 1
  ReadRegStr $2 HKLM Software\Microsoft\Windows\CurrentVersion $1
  MessageBox MB_YESNO|MB_ICONQUESTION "$1 = $2$\n$\nMore?" IDYES loop
done:

4.9.2.7 ExpandEnvStrings

user_var(output) string

string の環境変数を展開して、ユーザ変数 $x に格納します。環境変数が存在しない場合、置換されません。例えば、"%var%" を使用し、var が存在しない場合、結果は "%var" となります。エラーがある場合は、変数は空に設定され、エラーフラグがセットされます。

ExpandEnvStrings $0 "WINDIR=%WINDIR%$\nTEMP=%TEMP%"

4.9.2.8 FlushINI

ini_filename

INI ファイルのバッファーをフラッシュします。Windows 9x は INI ファイルに対するすべての変更をメモリに保持しています。このコマンドは、変更を即座にディスクに書き出すよう指示します。このコマンドは、WriteINIStrDeleteINISecDeleteINStr によって変更した直後に、INI を手動で編集したり、削除したり、移動したり、コピーしたりする場合に利用します。

WriteINIStr $TEMP\something.ini test test test
FlushINI $TEMP\something.ini
Delete $TEMP\something.ini

4.9.2.9 ReadEnvStr

user_var(output) name

環境変数 name から読み出して、ユーザ変数 $x にセットします。読み込みに失敗した場合は、ユーザ変数は空にセットされ、エラーフラグがセットされます。

ReadEnvStr $0 WINDIR
ReadEnvStr $1 TEMP

4.9.2.10 ReadINIStr

user_var(output) ini_filename section_name entry_name

INI ファイル ini_filename のセクション section_name 内の、entry_name から読み出して、ユーザ変数 $x にセットします。エントリーが見つからない場合、ユーザ変数には空の文字列が割り当てられ、エラーフラグがセットされます。

ReadINIStr $0 $INSTDIR\winamp.ini winamp outname

4.9.2.11 ReadRegDWORD

user_var(output) root_key sub_key name

レジストリから 32 ビットの DWORD を、ユーザ変数 $x に読み出します。root_key に指定可能な値については、WriteRegStr で一覧を示します。DWORD が存在しない場合は、エラーフラグがセットされ、ユーザ変数には空の文字列(0を表す "")がセットされます。値は存在するが、DWORD でない場合は、文字列として読まれます。このとき、エラーフラグがセットされます。

ReadRegDWORD $0 HKLM Software\NSIS VersionBuild

4.9.2.12 ReadRegStr

user_var(output) root_key sub_key name

レジストリから読み出して、ユーザ変数 $x にセットします。root_key に指定可能な値については、WriteRegStr で一覧を示します。文字列が存在しない場合は、エラーフラグがセットされ、ユーザ変数には空の文字列がセットされます。値は存在するが、REG_DWORD(訳注:REG_SZでは?) でない場合は、文字列に変換されて読まれます。このとき、エラーフラグがセットされます。

ReadRegStr $0 HKLM Software\NSIS ""
DetailPrint "NSIS is installed at: $0"

4.9.2.13 WriteINIStr

ini_filename section_name entry_name value

INI ファイル ini_filename のセクション section_name に、entry_name=value を書きます。INI ファイルに文字列が書き込めない場合、エラーフラグがセットされます。

WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
WriteINIStr $TEMP\something.ini section2 nsis true

4.9.2.14 WriteRegBin

root_key subkey key_name valuedata

このコマンドは、バイナリデータのブロックをレジストリに書き込みます。root_key に指定可能な値については、WriteRegStr で一覧を示します。valuedata は16進数で指定します(例: DEADBEEF01223211151)。バイナリデータがレジストリに書き込めない場合、エラーフラグがセットされます。レジストリキーが存在しない場合は、作成されます。

WriteRegBin HKLM "Software\My Company\My Software" "Binary Value" DEADBEEF01223211151

4.9.2.15 WriteRegDWORD

root_key subkey key_name value

このコマンドは、DWORD(32ビット整数)をレジストリに書き込みます。ユーザ変数も指定できます。root_key に指定可能な値については、WriteRegStr で一覧を示します。DWORD がレジストリに書き込めない場合、エラーフラグがセットされます。レジストリキーが存在しない場合は、作成されます。

WriteRegDWORD HKLM "Software\My Company\My Software" "DWORD Value" 0xDEADBEEF

4.9.2.16 WriteRegStr

root_key subkey key_name value

文字列をレジストリに書き込みます。詳細については、WriteRegExpandStr を参照してください。

WriteRegStr HKLM "Software\My Company\My Software" "String Value" "dead beef"

4.9.2.17 WriteRegExpandStr

root_key subkey key_name value

文字列をレジストリに書き込みます。root_key には、以下のいずれかを指定します。

  • HKCR もしくは HKEY_CLASSES_ROOT
  • HKLM もしくは HKEY_LOCAL_MACHINE
  • HKCU もしくは HKEY_CURRENT_USER
  • HKU もしくは HKEY_USERS
  • HKCC もしくは HKEY_CURRENT_CONFIG
  • HKDD もしくは HKEY_DYN_DATA
  • HKPD もしくは HKEY_PERFORMANCE_DATA
  • SHCTX もしくは SHELL_CONTEXT

root_key が、SHCTX もしくは SHELL_CONTEXT の場合については、SetShellVarContextall にセットされている場合は HKLM に、current にセットされている場合は HKCU に置換されます。

文字列がレジストリに書き込めない場合、エラーフラグがセットされます。文字列の型は、WriteRegStr は REG_SZ、WriteRegExpandStr は REG_EXPAND_STR になります。レジストリキーが存在しない場合は、作成されます。

WriteRegExpandStr HKLM "Software\My Company\My Software" "Expand String Value" "%WINDIR%\notepad.exe"

4.9.3 汎用命令

4.9.3.1 CallInstDLL

dllfile function_name

NSIS の拡張 DLL (プラグイン)の中にある function_name という名前の関数を呼び出します。作り方については、example plugin を参照してください。拡張 DLL は、スタックや変数にアクセスすることができます。注意: プラグイン DLL を自動的に抽出して呼び出すためには、CallInstDLL の代わりにプラグイン命令を使用します。

Push "a parameter"
Push "another parameter"
CallInstDLL $INSTDIR\somedll.dll somefunction

プラグインをより簡単に扱うためには、新しい プラグインの呼び出し構文 を使用してください。

4.9.3.2 CopyFiles

[/SILENT] [/FILESONLY] filespec_on_destsys destination_path [size_of_files_in_kb]

インストールシステムのおいて、コピー元 filespec_on_destsys からコピー先 destination_path へファイルをコピーします。インストールメディアからコピーする場合や、システムのある場所からある場所へコピーする場合に、$EXEDIR が有用です。操作に長い時間がかかる場合は、コピー操作に関する Windows のステータス画面が表示されます(無効にするには /SILENT を使います)。最後の引数は、インストーラが必要なディスク容量を概算できるよう、コピーするファイルのサイズをキロバイトで指定します。エラーの場合、あるいはユーザがコピーをキャンセルした場合(/SILENT が指定されていない場合のみ可能)、エラーフラグがセットされます。/FILESONLY が指定された場合、ファイルのみがコピーされます。

この命令においては、常に、完全に限定されたパス名を使用しなくてはいけません。相対パスを使用すると、予測できない結果となります。

CreateDirectory $INSTDIR\backup
CopyFiles $INSTDIR\*.dat $INSTDIR\backup

4.9.3.3 CreateDirectory

path_to_create

指定されたディレクトリを作成します(必要であれば再帰的に)。ディレクトリが作成できない場合、エラーフラグがセットされます。

常に絶対パスで指定しなくてはなりません。

CreateDirectory $INSTDIR\some\directory

4.9.3.4 CreateShortCut

link.lnk target.file [parameters [icon.file [icon_index_number [start_options [keyboard_shortcut [description]]]]]]

target.file へのショートカット link.lnk を作成します。付加パラメータは parameters で指定します。ショートカットに使われるアイコンは icon.fileicon_index_number で指定します。デフォルトのアイコン設定を使う場合は、icon.fileicon_index_number に空の文字列を指定します。 start_options には、SW_SHOWNORMALSW_SHOWMAXIMIZEDSW_SHOWMINIMIZED、空の文字列のいずれかを指定します。keyboard_shortcut は、'flag|c' の形式で指定します。flag は、ALTCONTROLEXTSHIFT の組み合わせ(| を使用)です。c は、使用する文字です(a-z、A-Z、0-9、F1-F24 など)。空白は指定できない点に注意してください。例えば、"ALT|CONTROL|F8" のように指定します。$OUTDIR が作業ディレクトリとして使用されます。ショートカットを作成する前に、SetOutPath を使用すれば作業ディレクトリを変更することができます。description はショートカットの説明です。XP ではコメントと呼ばれています。ショートカットが作成できなかった場合は(link や target のパスが存在しない場合など)、エラーフラグがセットされます。

CreateDirectory "$SMPROGRAMS\My Company"
CreateShortCut "$SMPROGRAMS\My Company\My Program.lnk" "$INSTDIR\My Program.exe" \
  "some command line parameters" "$INSTDIR\My Program.exe" 2 SW_SHOWNORMAL \
  ALT|CONTROL|SHIFT|F5 "a description"

4.9.3.5 GetDLLVersion

filename user_var(high dword output) user_var(low dword output)

filename という名前の DLL (あるいはバージョン情報を含むその他の実行ファイル)からバージョン情報を取得します。成功した場合は、バージョン情報の DWORD の上位、下位がユーザ変数にセットされます。失敗した場合は、出力は空であり、エラーフラグがセットされます。以下の例は DLL のバージョンを取得して、人間が読める形式に変換したものを $0 にコピーしています。

GetDllVersion "$INSTDIR\MyDLL.dll" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $0 "$R2.$R3.$R4.$R5"

4.9.3.6 GetDLLVersionLocal

localfilename user_var(high dword output) user_var(low dword output)

これは、GetDLLVersion と類似していますが、インストーラを構築しているシステムにだけ作用します(実際には、2つの StrCpy コマンドにコンパイルします)。ビルドシステム上の DLL のバージョン情報を2つの出力変数にセットします。

4.9.3.7 GetFileTime

filename user_var(high dword output) user_var(low dword output)

filename の最終更新日時を取得します。成功した場合は、タイムスタンプの DWORD の上位、下位がユーザ変数にセットされます。失敗した場合は、出力は空であり、エラーフラグがセットされます。

4.9.3.8 GetFileTimeLocal

localfilename user_var(high dword output) user_var(low dword output)

これは、GetFileTime と類似していますが、インストーラを構築しているシステムにだけ作用します(実際には、2つの StrCpy コマンドにコンパイルします)。ビルドシステム上のファイルのタイムスタンプを2つの出力変数にセットします。

4.9.3.9 GetFullPathName

[/SHORT] user_var(output) path_or_file

指定されたファイルのフルパスを、ユーザ変数 $x に格納します。引数のパス部分が見つからない場合、エラーフラグがセットされ、$x は空になります。/SHORT が指定された場合は、パスは、短いファイル名の形式に変換されます。しかしながら、/SHORT が指定されてなくても、パスが長いファイル名の形式に変換されることはありません。長いファイル名を取得するには、System プラグインを使って GetLongPathName を呼び出します。注意: GetLongPathName は、Windows 98、Windows 2000以降でのみ利用可能です。

StrCpy $INSTDIR $PROGRAMFILES\NSIS
SetOutPath $INSTDIR
GetFullPathName $0 ..
DetailPrint $0 # will print C:\Program Files
GetFullPathName /SHORT $0 $INSTDIR
DetailPrint $0 # will print C:\Progra~1\NSIS
StrCpy $0 C:\Progra~1\NSIS
System::Call 'kernel32::GetLongPathName(t r0, t .r1, i ${NSIS_MAX_STRLEN}) i .r2'
StrCmp $2 error +2
StrCpy $0 $1
DetailPrint $0 # will print C:\Program Files\NSIS, where supported

4.9.3.10 GetTempFileName

user_var(output) base_dir

一時ファイルの名前を、ユーザー変数 $x に格納します。ファイルは作成されるため、後で上書きすることができます。一時ファイルの名前はユニークになるように生成されます。Windows の一時ディレクトリではなく、他のディレクトリに一時ファイルを作成したい場合は、base_dir を指定します。作業が終わったら、ファイルを削除してください。

GetTempFileName $0
File /oname=$0 something.dat
# something.dat で何かをやる
Delete $0

4.9.3.11 SearchPath

user_var(output) filename

filename のフルパスを、ユーザー変数 $x に格納します。ファイルが見つからない場合は、エラーフラグがセットされ、$x は空になります。システムパスからファイルを検索する場合に、SearchPath を使用します。

4.9.3.12 SetFileAttributes

filename attribute1|attribute2|...

filename のファイル属性を設定します。以下の属性を | で組み合わせて指定します。

  • NORMAL もしくは FILE_ATTRIBUTE_NORMAL (省略のために 0 を使うことができる)
  • ARCHIVE もしくは FILE_ATTRIBUTE_ARCHIVE
  • HIDDEN もしくは FILE_ATTRIBUTE_HIDDEN
  • OFFLINE もしくは FILE_ATTRIBUTE_OFFLINE
  • READONLY もしくは FILE_ATTRIBUTE_READONLY
  • SYSTEM もしくは FILE_ATTRIBUTE_SYSTEM
  • TEMPORARY もしくは FILE_ATTRIBUTE_TEMPORARY

ファイル属性が設定できなかった場合(ファイルが存在しない、権限がないなど)、エラーフラグがセットされます。属性を設定することだけができます。解除することはできません。属性を取り除きたい場合は、NORMAL を使用します。この方法は、すべての属性を取り除きます。このコマンドは、ワイルドカードをサポートしていません。

4.9.3.13 RegDLL

dllfile [entrypoint_name]

指定された DLL をロードして、DllRegisterServer(entrypoint_name が指定されている場合は、entrypoint_name)を呼び出します。エラーが発生した場合(DLL がロードできない、OLE が初期化できない、エントリーポイントが見つからない、関数がERROR_SUCCESS (=0)以外を返した、など)、エラーフラグがセットされます。

他の DLL に依存している DLL のために、カレントディレクトリを設定するには、SetOutPath を利用します。例えば、foo.dll が$INSTDIR にある bar.dll に依存している場合、次のようにします。

 SetOutPath $INSTDIR
 RegDLL $INSTDIR\foo.dll

4.9.3.14 UnRegDLL

dllfile

指定された DLL をロードして、DllUnregisterServer を呼び出します。エラーが発生した場合(DLL がロードできない、OLE が初期化できない、エントリーポイントが見つからない、関数がERROR_SUCCESS (=0)以外を返した、など)、エラーフラグがセットされます。

4.9.4 フロー制御命令

4.9.4.1 Abort

user_message

インストールをキャンセルします。スクリプトを実行を停止し、ステータス画面に user_message を表示します。注意: コールバック関数 からAbort を呼び出した場合は、特別な動作をします。ページのコールバック においても、Abort は特別な目的で使用されます。

Abort
Abort "can't install"

4.9.4.2 Call

function_name | :label_name | user_var(input)

function_name という名前の関数、label_name という名前のラベル、アドレスを保持している変数を呼び出します。アドレスは、GetCurrentAddressGetFunctionAddressGetLabelAddress によって取得できます。呼び出し先において、Return 命令が実行されると、呼び出し元へ戻ります。セクションや関数は、自動的に Return 命令で終了しています。アンインストール関数は、インストーラの関数やセクションから呼び出すことができません。逆も同様です。

Function func
  Call :label
  DetailPrint "#1: これは、一回だけ表示される。"
label:
  DetailPrint "#2: これは、メッセージ #1 の前後で表示される。"
  Call :.global_label
FunctionEnd

Section
  Call func
  Return

.global_label:
  DetailPrint "#3: global label が呼び出された"
SectionEnd

4.9.4.3 ClearErrors

エラーフラグをクリアします。

ClearErrors
IfErrors 0 +2
  MessageBox MB_OK "このメッセージボックスは表示されません"

4.9.4.4 GetCurrentAddress

user_var(output)

現在の命令のアドレスを取得して、ユーザ変数に格納します。その後、ユーザ変数は Call や Goto に渡すことができます。

Function func
  DetailPrint "function"
  IntOp $0 $0 + 2
  Call $0
  DetailPrint "function end"
FunctionEnd

Section
  DetailPrint "section"
  DetailPrint "section"
  GetCurrentAddress $0
  Goto callFunc

  DetailPrint "back to section"
  Return

callFunc:
  Call func
  DetailPrint "section end"
SectionEnd

4.9.4.5 GetFunctionAddress

user_var(output) function_name

関数のアドレスを取得して、ユーザ変数に格納します。その後、ユーザ変数は Call や Goto に渡すことができます。注意: GetFunctionAddress で出力されたアドレスに Goto した場合、呼び出し元に戻ってくることはできません。Goto 先の関数が終了すると、即座に終了します。

Function func
  DetailPrint "function"
FunctionEnd

Section
  GetFunctionAddress $0 func
  Call $0
SectionEnd

4.9.4.6 GetLabelAddress

user_var(output) label

ラベルのアドレスを取得して、ユーザ変数に格納します。その後、ユーザ変数は Call や Goto に渡すことができます。注意: 関数からアクセス可能なラベルに対してのみ呼び出すことができます。どこからでも呼び出せるわけではありません(これは潜在的に危険です)。GetLabelAddress の出力を Call した場合、Return するまで(明示的、あるいは暗示的な関数の終わりまで)コードが実行されます。その後、Call の次の文に戻ります。

label:
DetailPrint "label"
GetLabelAddress $0 label
IntOp $0 $0 + 4
Goto $0
DetailPrint "done"

4.9.4.7 Goto

label_to_jump_to | +offset| -offset| user_var(target)

ラベルが指定された場合は、label_to_jump_to にジャンプします。

+offset または -offset が指定された場合は、オフセットによる相対的なジャンプとなります。Goto +1 は、次の命令に移動し、Goto -1 は前の命令に移動します。

ユーザ変数が指定された場合は、絶対アドレス(通常、GetLabelAddress などの関数で取得)にジャンプします。コンパイラフラグコマンドとSectionInは命令ではないため、それらをジャンプしても効果はありません。

Goto label
Goto +2
Goto -2
Goto $0

4.9.4.8 IfAbort

label_to_goto_if_abort [label_to_goto_if_no_abort]

Abort が呼び出された場合、true が返されます。これは、ファイルの作成や上書きに失敗した際にユーザが Abort を選択するか、ユーザが手動で Abort した場合に発生します。この関数は、instfiles ページの leave_function からのみ呼び出すことができます。

Page instfiles "" "" instfilesLeave

Function instfilesLeave
  IfAbort 0 +2
    MessageBox MB_OK "user aborted"
FunctionEnd

4.9.4.9 IfErrors

jumpto_iferror [jumpto_ifnoerror]

エラーフラグをチェックしてクリアします。エラーフラグがセットされている場合は、jumpto_iferror にジャンプし、セットされていない場合は、jumpto_ifnoerror にジャンプします。回復可能なエラー(使用中のファイルの削除を試みる、など)が発生した場合、エラーフラグは他の命令によってセットされます。

ClearErrors
File file.dat
IfErrors 0 +2
  Call ErrorHandler

4.9.4.10 IfFileExists

file_to_check_for jump_if_present [jump_otherwise]

ファイル file_to_check_for (ワイルドカードやディレクトリが指定できる)が存在するかチェックし、 存在する場合は jump_if_present に、存在しない場合は jump_otherwise にジャンプします。ディレクトリかどうかチェックしたい場合は、IfFileExists DIRECTORY\*.* を使用します。

IfFileExists $WINDIR\notepad.exe 0 +2
  MessageBox MB_OK "notepad is installed"

4.9.4.11 IfRebootFlag

jump_if_set [jump_if_not_set]

リブートフラグをチェックし、セットされている場合は jump_if_set に、されていない場合は jump_if_not_set にジャンプします。リブートフラグは、 Delete や Rename によってセットされます。SetRebootFlag を利用して手動でセットすることも可能です。

IfRebootFlag 0 noreboot
  MessageBox MB_YESNO "A reboot is required to finish the installation. Do you wish to reboot now?" IDNO noreboot
    Reboot
noreboot:

4.9.4.12 IfSilent

jump_if_silent [jump_if_not]

サイレントフラグをチェックし、インストーラがサイレントの場合は jump_if_silent に、そうでない場合は jump_if_not にジャンプします。サイレントフラグは、 SilentInstallSilentUninstallSetSilentによってセットされます。コマンドラインで /S を渡した場合もセットされます。

IfSilent +2
  ExecWait '"$INSTDIR\nonsilentprogram.exe"'

4.9.4.13 IntCmp

val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more]

2つの整数 val1val2 を比較します。val1val2 が等しい場合は jump_if_equal に、val1 < val2 なら jump_if_val1_less に、val1 > val2 なら jump_if_val1_more にジャンプします。

IntCmp $0 5 is5 lessthan5 morethan5
is5:
  DetailPrint "$$0 == 5"
  Goto done
lessthan5:
  DetailPrint "$$0 < 5"
  Goto done
morethan5:
  DetailPrint "$$0 > 5"
  Goto done
done:

4.9.4.14 IntCmpU

val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more]

2つの符号なし整数 val1val2 を比較します。val1val2 が等しい場合は jump_if_equal に、val1 < val2 なら jump_if_val1_less に、val1 > val2 なら jump_if_val1_more にジャンプします。符号なし整数として比較されます。

4.9.4.15 MessageBox

mb_option_list messagebox_text [/SD return] [return_check jumpto] [return_check_2 jumpto_2]

テキスト messagebox_text を含む MessageBox を表示します。mb_option_list は以下を | で組み合わせて指定します(例: MB_YESNO|MB_ICONSTOP)。

  • MB_OK - OK ボタンを表示
  • MB_OKCANCEL - OK と キャンセル ボタンを表示
  • MB_ABORTRETRYIGNORE - 中止、再試行、無視 ボタンを表示
  • MB_RETRYCANCEL - 再試行 と キャンセル ボタンを表示
  • MB_YESNO - はい と いいえ ボタンを表示
  • MB_YESNOCANCEL - はい、いいえ、キャンセル ボタンを表示
  • MB_ICONEXCLAMATION - エクスクラメーションアイコンを表示
  • MB_ICONINFORMATION - インフォメーションアイコンを表示
  • MB_ICONQUESTION - クエスチョンマークアイコンを表示
  • MB_ICONSTOP - ストップアイコンを表示
  • MB_USERICON - インストーラのアイコンを表示
  • MB_TOPMOST - メッセージボックスを最前面にする
  • MB_SETFOREGROUND - フォアグラウンドウインドウにする
  • MB_RIGHT - テキストを右寄せにする
  • MB_RTLREADING - テキストを右から左へ表示する
  • MB_DEFBUTTON1 - Button 1 をデフォルトにする
  • MB_DEFBUTTON2 - Button 2 をデフォルトにする
  • MB_DEFBUTTON3 - Button 3 をデフォルトにする
  • MB_DEFBUTTON4 - Button 4 をデフォルトにする

return_check には 0 (または空の文字列、または引数の指定なし)、または、以下のいずれかが指定できます。

  • IDABORT - 中止 ボタン
  • IDCANCEL - キャンセル ボタン
  • IDIGNORE - 無視 ボタン
  • IDNO - いいえ ボタン
  • IDOK - OK ボタン
  • IDRETRY - 再試行 ボタン
  • IDYES - はい ボタン

MessageBox の返り値が return_check である場合、インストーラは jumpto にジャンプします。

インストーラがサイレントの場合に使用されるオプションを指定するためには、/SD を使用します。return には、上述の return_check の値のひとつを指定します。詳細については、 4.12 を参照してください。

MessageBox MB_OK "simple message box"
MessageBox MB_YESNO "is it true?" IDYES true IDNO false
true:
  DetailPrint "it's true!"
  Goto next
false:
  DetailPrint "it's false"
next:
MessageBox MB_YESNO "is it true? (defaults to yes on silent installations)" /SD IDYES IDNO false2
  DetailPrint "it's true (or silent)!"
  Goto next2
false2:
  DetailPrint "it's false"
next2:

4.9.4.16 Return

関数やセクションから戻ります。

Function func
  StrCmp $0 "return now" 0 +2
    Return
  # do stuff
FunctionEnd

Section
  Call func
  ;"Return" will return here
SectionEnd

4.9.4.17 Quit

可能な限り即座にインストーラを終了します。Quit が呼び出された後、インストーラは終了します(コールバックは呼び出されません)。

4.9.4.18 SetErrors

エラーフラグをセットします。

SetErrors
IfErrors 0 +2
  MessageBox MB_OK "this message box will always show"

4.9.4.19 StrCmp

str1 str2 jump_if_equal [jump_if_not_equal]

str1str2 を比較します(大文字と小文字を区別しない)。 str1str2 が等しい場合は jump_if_equal に、等しくない場合は jump_if_not_equal にジャンプします。

StrCmp $0 "a string" 0 +3
  DetailPrint '$$0 == "a string"'
  Goto +2
  DetailPrint '$$0 != "a string"'

4.9.4.20 StrCmpS

str1 str2 jump_if_equal [jump_if_not_equal]

StrCmp と同じですが、大文字と小文字が区別されます。

4.9.5 ファイル命令

4.9.5.1 FileClose

handle

FileOpen で開かれたファイルハンドルを閉じます。

4.9.5.2 FileOpen

user_var(handle output) filename openmode

filename という名前のファイルを開き、ユーザ変数にファイルハンドルを格納します。openmode には、"r" (読み取り用)、 "w" (書き込み用、既存ファイルの内容はクリアされる)、 "a" (追加書き込み用、読み書き用に開かれ、内容は保持される)のいずれかを指定します。すべての openmode において、ファイルポインタは、ファイルの先頭に置かれます。ファイルが開けない場合、ハンドルは空にセットされ、エラーフラグがセットされます。

絶対パスが指定されない場合は、カレントフォルダが使用されます。カレントフォルダは、最後の SetOutPath 命令で設定されたフォルダです。SetOutPath を一度も使用していない場合、カレントフォルダは $EXEDIR です。

FileOpen $0 $INSTDIR\file.dat r
FileClose $0

4.9.5.3 FileRead

handle user_var(output) [maxlen]

FileOpen で開かれたファイルから文字列を読みます。文字列は改行(\n あるいは \r\n)か、 null バイトまで読み込まれます。maxlen が指定されている場合は、maxlen に到達しても、読み込みが終了します。デフォルトでは、文字列は 1024 文字に制限されています(より大きな NSIS_MAX_STRLEN を指定した特別なビルドをコンパイルしたりダウンロードしたりできます)。EOF(End Of File)に到達し、それ以上のデータがなくなると、出力文字列は空になり、エラーフラグがセットされます。

ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileRead $0 $1
DetailPrint $1
FileClose $0
done:

4.9.5.4 FileReadByte

handle user_var(output)

FileOpen で開かれたファイルから1バイトを読みます。バイトは整数(0-255)として格納されます。EOF に到達して、それ以上データがない場合は、出力は空となり、エラーフラグがセットされます。

ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileReadByte $0 $1
FileReadByte $0 $2
DetailPrint "$1 $2"
FileClose $0
done:

4.9.5.5 FileSeek

handle offset [mode] [user_var(new position)]

FileOpen で開かれたファイルをシークします。mode に何も指定しないか、SET を指定した場合は、ファイルポインタをファイルの先頭から offset の位置に移動します。modeCUR を指定した場合は、現在の位置から offset の位置に移動します。modeEND を指定した場合は、sファイルの末尾から offset の位置に移動します。最後の引数 user_var を指定した場合は、変数に新しいファイル位置が格納されます。

ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileSeek $0 -5 END
FileRead $0 $1
DetailPrint $1
FileClose $0
done:

4.9.5.6 FileWrite

handle string

FileOpen で開かれたファイルに文字列を書きます。書き込みエラーが発生した場合、エラーフラグがセットされます。

ClearErrors
FileOpen $0 $INSTDIR\file.dat w
IfErrors done
FileWrite $0 "some text"
FileClose $0
done:

4.9.5.7 FileWriteByte

handle string

FileOpen で開かれたファイルに、文字列 string を整数に変換して書き込みます。もちろん、整数値を直接入力することもできます。以下のコードは、CR(13)とLF(10)を書き込みます(改行します)。

FileWriteByte file_handle "13"
FileWriteByte file_handle "10"

書き込みエラーが発生した場合、エラーフラグがセットされます。注意: 整数の下位バイトが使用されます。例えば 256(0x0100) を書くことと 0(0x0000) を書くことは同じです。

4.9.5.8 FindClose

handle

FindFirst で開かれた検索を閉じます。

4.9.5.9 FindFirst

user_var(handle output) user_var(filename output) filespec

filespec を検索し、最初に見つかったファイルを filename_output(ユーザ変数)に格納します。また、検索ハンドルを handle_output(ユーザ変数)に格納します。ファイルが見つからない場合、出力は両方とも空になり、エラーフラグがセットされます。FindNext や FindClose と一緒に使用します。注意: 見つかったファイル名は、パスなしでユーザ変数に格納されます。

FindFirst $0 $1 $INSTDIR\*.txt
loop:
  StrCmp $1 "" done
  DetailPrint $1
  FindNext $0 $1
  Goto loop
done:
FindClose $0

4.9.5.10 FindNext

handle user_var(filename_output)

FindFirst で開始された検索を継続します。handle には、FindFirst から返された検索ハンドルを渡します。検索が完了した(それ以上ファイルがない)場合は、filename_output は空がセットされ、エラーフラグがセットされます。注意: 見つかったファイル名は、パスなしでユーザ変数に格納されます。

4.9.6 アンインストーラ命令

4.9.6.1 WriteUninstaller

[Path\]exename.exe

指定された(パス付きの)ファイル名をアンインストーラに書き込みます。インストールセクションかインストール関数内からのみ利用でき、スクリプト内にアンインストールセクションが存在する必要があります。アンインストール設定の節も参照してください。アンインストーラのコピーを1回以上書き出すためには、これを一回以上呼び出します。

WriteUninstaller $INSTDIR\uninstaller.exe

4.9.7 その他の命令

4.9.7.1 GetErrorLevel

user_var(error level output)

SetErrorLevel によって最後に設定されたエラーレベルを取得します。一度も設定されていない場合は -1 が返ります。

GetErrorLevel $0
IntOp $0 $0 + 1
SetErrorLevel $0

4.9.7.2 GetInstDirError

user_var(error output)

ディレクトリページの leave_function で使用します。'DirVerify leave' が使用された場合に、セットされたフラグを読み出します。フラグの値は以下のとおりです。

0: エラーなし

1: 不正なインストールディレクトリ

2: インストールドライブに十分な空き領域がない

!include LogicLib.nsh
PageEx directory
  DirVerify leave
  PageCallbacks "" "" dirLeave
PageExEnd

Function dirLeave
  GetInstDirError $0
  ${Switch} $0
    ${Case} 0
      MessageBox MB_OK "有効なインストールディレクトリ"
      ${Break}
    ${Case} 1
      MessageBox MB_OK "不正なインストールディレクトリ!"
      Abort
      ${Break}
    ${Case} 2
      MessageBox MB_OK "十分な空き領域がない!"
      Abort
      ${Break}
  ${EndSwitch}
FunctionEnd

4.9.7.3 InitPluginsDir

プラグインディレクトリ($PLUGINSDIR)が初期化されていなければ、初期化します。

InitPluginsDir
File /oname=$PLUGINSDIR\image.bmp image.bmp

4.9.7.4 Nop

何もしません。

4.9.7.5 SetErrorLevel

error_level

インストーラ、あるいはアンインストーラのエラーレベルを error_level に設定します。 詳細については、エラーレベル を参照してください。

IfRebootFlag 0 +2
  SetErrorLevel 4

4.9.7.6 SetRegView

32|64|lastused

レジストリ命令 の影響を受けるレジストリビューを設定します。Windows x64 では、2つのビューがあります。ひとつは 32 ビットアプリケーションで、もうひとつは x64 アプリケーションです。デフォルトは、WOW64 下の x64 システムで動作する 32 ビットアプリケーションは、32 ビットビューにのみアクセスできます。"SetRegView 64" とすると、インストーラはレジストリの x64 ビューのキーにアクセスできるようになります。

DeleteRegKeyDeleteRegValueEnumRegKeyEnumRegValueReadRegDWORDReadRegStrWriteRegBinWriteRegDWORDWriteRegStrWriteRegExpandStr の動作に影響を与えます。

InstallDirRegKey には影響しません。代わりに、.onInit から ReadRegStr を使用して、レジストリを読むことができます。

SetRegView 32
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
DetailPrint $0 # prints C:\Program Files (x86)
SetRegView 64
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
DetailPrint $0 # prints C:\Program Files
Function .onInit
  SetRegView 64
  ReadRegStr $INSTDIR HKLM Software\NSIS ""
  SetRegView 32
FunctionEnd

4.9.7.7 SetShellVarContext

current|all

$SMPROGRAMS および、その他のシェルフォルダのコンテキストを設定します。current (デフォルト)が設定された場合は、カレントユーザのシェルフォルダが使用されます。all が設定された場合は、「すべてのユーザ」のシェルフォルダが使用されます。「すべてのユーザ」のフォルダをサポートしていない OS もあります。「すべてのユーザ」フォルダが見つからない場合は、カレントユーザのフォルダが使用されます。「通常のユーザ」は、「すべてのユーザ」の領域への書き込み権限を持っていないという点に注意してください。管理者のみが「すべてのユーザ」領域への全アクセス権限を持っています。UserInfo プラグインを使用することで、これをチェックすることができます。Contrib\UserInfo\UserInfo.nsi の例を参照してください。

注意: インストーラのコードで使用した場合は、インストーラに対してのみ影響があります。また、アンインストーラのコードで使用した場合は、アンインストーラに対してのみ影響があります。両方に対して設定したい場合は、両方のコードで使用する必要があります。

SetShellVarContext current
StrCpy $0 $DESKTOP
SetShellVarContext all
StrCpy $1 $DESKTOP
MessageBox MB_OK $0$\n$1

4.9.7.8 Sleep

sleeptime_in_ms

sleeptime_in_ms ミリ秒の間、インストーラの実行を一時停止します。sleeptime_in_ms には変数も利用できます。"$0" や "666" などの数値で指定します。

DetailPrint "sleeping..."
Sleep 3000
DetailPrint "back to work"

4.9.8 文字列操作命令

4.9.8.1 StrCpy

user_var(destination) str [maxlen] [start_offset]

ユーザ変数 $x に str を設定します。str には、他の変数や、同じユーザ変数を含めることができます(これにより文字列を連結したりすることが可能です)。maxlen が指定された場合、文字列の最大文字数は maxlen になります。maxlen が負の場合、文字列の終わりから abs(maxlen) 文字に切り詰められます。start_offset が指定された場合、入力文字列のオフセットとして使用されます。start_offset が負の場合、文字列の終わりから abs(start_offset) の位置がオフセットとなります。

StrCpy $0 "a string"       # = "a string"
StrCpy $0 "a string" 3     # = "a s"
StrCpy $0 "a string" -1    # = "a strin"
StrCpy $0 "a string" "" 2  # = "string"
StrCpy $0 "a string" "" -3 # = "ing"
StrCpy $0 "a string" 3 -4  # = "rin"

4.9.8.2 StrLen

user_var(length output) str

ユーザ変数 $x に str の長さを設定します。

StrLen $0 "123456" # = 6

4.9.9 スタックのサポート

4.9.9.1 Exch

[user_var | stack_index]

引数が指定されない場合は、スタックの先頭にある2つの要素が交換されます。引数にユーザ変数が指定された場合は、スタックの先頭の要素とユーザ変数が交換されます。引数に正の整数が指定された場合は、先頭の要素と、先頭からオフセット stack_index の位置にある要素を交換します。スタックに十分な要素が存在せず、交換できない場合は、致命的なエラーが発生します(デバッグ作業を助けるため)。

Push 1
Push 2
Exch
Pop $0 # = 1
Push 1
Push 2
Push 3
Exch 2
Pop $0 # = 1
StrCpy $0 1
Push 2
Exch $0 # = 2
Pop $1 # = 1

4.9.9.2 Pop

user_var(out)

スタックから文字列をポップして、ユーザ変数 $x に格納します。スタックが空の場合は、エラーフラグがセットされます。

Push 1
Pop $0 # = 1

4.9.9.3 Push

string

スタックに文字列をプッシュします。文字列は後でスタックからポップすることができます。

Push "a string"

4.9.10 整数のサポート

4.9.10.1 IntFmt

user_var(output) format numberstring

フォーマット format を使用して、numberstring の数字を整形し、結果をユーザ変数 $x に格納します。フォーマット文字列の例は、"%08X" "%u" のようです。

IntFmt $0 "0x%08X" 195948557
IntFmt $0 "%c" 0x41

4.9.10.2 IntOp

user_var(output) value1 OP [value2]

value1value2OP に依存)を組み合わせて、指定されたユーザ変数 user_var に格納します。OP には以下のいずれかを指定します。

  • +    value1value2 の加算
  • -    value1 から value2 の減算
  • *    value1value2 の乗算
  • /    value1value2 による除算
  • %    value1value2 による剰余
  • |    value1value2 のビット和(OR)
  • &    value1value2 のビット積(AND)
  • ^    value1value2 のビット排他的論理和(XOR)
  • >>    value1value2 ビットだけ右シフト
  • <<    value1value2 ビットだけ左シフト
  • ~    value1 のビット否定 (例: 7 は 4294967288に)
  • !    value1 の論理否定 (例: 7 は 0 に)
  • ||    value1value2 の論理和(OR)
  • &&    value1value2 の論理積(AND)
IntOp $0 1 + 1
IntOp $0 $0 + 1
IntOp $0 $0 << 2
IntOp $0 $0 ~
IntOp $0 $0 & 0xF

4.9.11 再起動命令

4.9.11.1 Reboot

コンピュータを再起動します。次の点に注意してください。失敗した場合は、.onRebootFailed が呼び出されます。Quitのように、どのような場合においても、この命令はリターンしません。

MessageBox MB_YESNO|MB_ICONQUESTION "Do you wish to reboot the system?" IDNO +2
  Reboot

4.9.11.2 SetRebootFlag

true|false

リブートフラグを truefalse に設定します。このフラグの値は、IfRebootFlag を利用して読み出すことができます。

SetRebootFlag true
IfRebootFlag 0 +2
  MessageBox MB_OK "this message box will always show"

4.9.12 インストールロギング命令

4.9.12.1 LogSet

on|off

インストールログを $INSTDIR\install.log に出力するかどうかを設定します。この関数を呼び出す前に $INSTDIR に値を設定する必要があります。設定しないと動作しません。注意: これをサポートするためには、コンパイル時に NSIS_CONFIG_LOG ビルド設定を設定する必要があります(scons NSIS_CONFIG_LOG=yes、これはデフォルトではありません)。NSIS のコンパイルについての詳細については、NSIS のビルド を参照してください。

4.9.12.2 LogText

text

インストーラのロギングが有効になっている場合において、テキスト text をログファイルに挿入します。

IfFileExists $WINDIR\notepad.exe 0 +2
  LogText "$$WINDIR\notepad.exe exists"

4.9.13 セクションの管理

4.9.13.1 SectionSetFlags

section_index section_flags

セクションのフラグを設定します。フラグは、32ビットの整数です。第1ビット(最下位)は、セクションが現在、選択されているいるかどうかを表します。第2ビットは、セクションがセクショングループかどうかを表します(何をやっているか本当に理解していない限りは変更してはいけません)。第3ビットは、セクションがセクショングループの終わりかどうかを表します(繰り返しになりますが、変更してはいけません)。第4ビットは、セクションがボールド体で表示されているかどうかを表します。第5ビットは、セクションが読み取り専用かどうかを表します。第6ビットは、セクショングループが自動的に展開されているかどうかを表します。第7ビットは、部分的に選択されているセクショングループに対して設定されます。第8ビットは、部分的に選択されているセクショングループのトグルに対して内部的に利用されます。第9ビットはセクション名の変更を反映するために使用されます。範囲外のセクションが指定された場合は、エラーフラグがセットされます。

それぞれのフラグは、"SF_" から始まる名前を持ちます。

!define SF_SELECTED   1
!define SF_SECGRP     2
!define SF_SECGRPEND  4
!define SF_BOLD       8
!define SF_RO         16
!define SF_EXPAND     32
!define SF_PSELECTED  64

使い方の例については、 one-section.nsi の例を参照してください。

その他の有用なマクロや定義については、 Include\Sections.nsh を参照してください。

Section test test_section_id
SectionEnd

Function .onInit
  # セクション 'test' を選択状態、および読み取り専用に設定する。
  IntOp $0 ${SF_SELECTED} | ${SF_RO}
  SectionSetFlags ${test_section_id} $0
FunctionEnd

4.9.13.2 SectionGetFlags

section_index user_var(output)

セクションのフラグを取得します。フラグの説明については、SectionSetFlags を参照してください。範囲外のセクションが指定された場合は、エラーフラグがセットされます。

Section test test_section_id
SectionEnd

Function .onSelChange
  # セクション 'test' を選択状態にする
  SectionGetFlags ${test_section_id} $0
  IntOp $0 $0 | ${SF_SELECTED}
  SectionSetFlags ${test_section_id} $0
FunctionEnd

4.9.13.3 SectionSetText

section_index section_text

セクション section_index の説明テキストを設定します。section_text に空の文字列 "" を設定すると、隠しセクションとなります。範囲外のセクションが指定された場合は、エラーフラグがセットされます。

Section "" test_section_id
SectionEnd

Function .onInit
  # セクション名を $WINDIR に変更
  SectionSetText ${test_section_id} $WINDIR
FunctionEnd

4.9.13.4 SectionGetText

section_index user_var(output)

セクション section_index の説明テキストをユーザ変数に格納します。隠しセクションの場合は、空の文字列が格納されます。範囲外のセクションが指定された場合は、エラーフラグがセットされます。

Section test test_section_id
SectionEnd

Function .onInit
  # セクション名に $WINDIR を追加します
  SectionGetText ${test_section_id} $0
  StrCpy $0 "$0 - $WINDIR"
  SectionSetText ${test_section_id} $0
FunctionEnd

4.9.13.5 SectionSetInstTypes

section_index inst_types

section_index で指定されたセクションのインストールタイプを設定します。section_index は0から始まるという点に注意してください。inst_types の各ビットは、セクションがそのインストールタイプに含まれるかどうかを表すフラグとなっています。例えば、3つのインストールタイプがあり、第1のセクションがインストールタイプ 1 と 3 に含まれる場合、コマンドは以下のようになります。

SectionSetInstTypes 0 5

5 は2進数で表記すると、"00000101" です。範囲外のセクションが指定された場合は、エラーフラグがセットされます。

Section test test_section_id
SectionEnd

Function .onInit
  # セクション 'test' をインストールタイプ 3 と 4 に割り当てる
  SectionSetInstTypes ${test_section_id} 12
FunctionEnd

4.9.13.6 SectionGetInstTypes

section_index user_var(output)

セクションのインストールタイプフラグを取得する。出力値の意味については、上述の SectionSetInstTypes の説明を参照してください。範囲外のセクションが指定された場合は、エラーフラグがセットされます。

Section test test_section_id
SectionEnd

Function .onInit
  # 既存の割り当てに加えて、セクション 'test' をインストールタイプ 5 に割り当てる
  SectionGetInstTypes ${test_section_id} $0
  IntOp $0 $0 | 16
  SectionSetInstTypes ${test_section_id} $0
FunctionEnd

4.9.13.7 SectionSetSize

section_index new_size

section_index で指定されたセクションのサイズを設定します。section_index は0から始まるという点に注意してください。new_size はキロバイトで指定します。整数のみサポートします。

Section test test_section_id
SectionEnd

Function .onInit
  # セクション 'test' の要求サイズを100キロバイトに設定する
  SectionSetSize ${test_section_id} 100
FunctionEnd

4.9.13.8 SectionGetSize

section_index user_var

section_index で指定されたセクションのサイズをユーザ変数に格納します。section_index は0から始まるという点に注意してください。

Section test test_section_id
SectionEnd

Function .onInit
  # セクション 'test' の要求サイズを100キロバイトだけ増やす
  SectionGetSize ${test_section_id} $0
  IntOp $0 $0 + 100
  SectionSetSize ${test_section_id} $0
FunctionEnd

4.9.13.9 SetCurInstType

inst_type_idx

現在のインストールタイプを設定します。inst_type_idx は 0 から 31 の範囲でなくてはなりません。範囲外のインストールタイプが使用されてもエラーフラグはセットされません

4.9.13.10 GetCurInstType

user_var

現在のインストールタイプを取得し、user_var に格納します。最初のインストールタイプが選択された場合、user_var には 0 が格納されます。2番目が選択された場合は、1 が格納されます。${NSIS_MAX_INST_TYPES} の値(デフォルトは32)は、カスタムインストールタイプが選択されたことを意味します。

4.9.13.11 InstTypeSetText

inst_type_idx text

指定されたインストールタイプのテキストを設定します。テキストが空の場合は、そのインストールタイプは取り除かれます。使用されていない inst_type_idx を使用して、新しいインストールタイプを作成することができます。この新しいインストールタイプに、セクションを追加、削除する方法については、 SectionSetInstTypes を参照してください。SectionIn とは異なり、インデクスは 0 から始まります。

InstType a
InstType b

Function .onInit
  # 第1のインストールタイプの名前を $WINDIR に設定する
  InstTypeSetText 0 $WINDIR
  # 第2のインストールタイプの名前を $TEMP に設定する
  InstTypeSetText 1 $TEMP
FunctionEnd

4.9.13.12 InstTypeGetText

inst_type_idx user_var

指定されたインストールタイプのテキストを取得する。

InstType a
InstType b

Function .onInit
  InstTypeGetText 0 $0
  DetailPrint $0 # prints 'a'
  InstTypeGetText 1 $0
  DetailPrint $0 # prints 'b'
FunctionEnd

4.9.14 ユーザインターフェース命令

4.9.14.1 BringToFront

インストーラ画面を可視状態にして、前面に表示します。インストーラの前面に現れるアプリケーションが実行されている場合、BringToFront はインストーラにフォーカスを戻します。

最近のウインドウズのバージョンでは、前面ウインドウの設定が制限されています。インストール中、他のアプリケーションで作業している場合は、他の方法を使って通知されるかもしれません。

4.9.14.2 CreateFont

user_var(handle output) face_name [height] [weight] [/ITALIC] [/UNDERLINE] [/STRIKE]

フォントを作成し、そのハンドルをユーザ変数に格納します。他のパラメータについての詳細は、 Win32 API 関数 CreateFont() に関する MSDN のページ を参照してください。

^Font と ^FontSize LangString を使用すると、NSIS で使用されてる現在のフォントを取得することができます。

!include WinMessages.nsh
GetDlgItem $0 $HWNDPARENT 1
CreateFont $1 "Times New Roman" "7" "700" /UNDERLINE
SendMessage $0 ${WM_SETFONT} $1 1

4.9.14.3 DetailPrint

user_message

インストーラの詳細表示に文字列 user_message を追加します。

DetailPrint "this message will show on the installation window"

4.9.14.4 EnableWindow

hwnd (1|0)

指定された画面やコントロールに対するマウスやキーボード入力を有効/無効にします。可能な状態は、0(無効)か1(有効)です。

GetDlgItem $0 $HWNDPARENT 1
EnableWindow $0 0
Sleep 1000
EnableWindow $0 1

4.9.14.5 FindWindow

user_var(hwnd output) windowclass [windowtitle] [windowparent] [childafter]

ウインドウを探索します。Win32 の FindWindowEx() のような動作をします。ウインドウクラス windowclass や、ウインドウタイトル windowtitle )によって探索します。windowparent あるいは childafter が指定されている場合は、探索はそのように制限されます。windowclasswindowtitle に "" が指定された場合、それらは検索に使用されません。ウインドウが見つからない場合は、ユーザ変数には 0 が返ります。 FindWindow のような古いスタイルの動作を実現するには、FindWindow と SendMessage を利用します。

FindWindow $0 "#32770" "" $HWNDPARENT
FindWindow $0 "my window class" "my window title"

4.9.14.6 GetDlgItem

user_var(output) dialog item_id

指定されたダイアログボックス dialogから、item_id で識別されるコントロールのハンドルを取得します。内部ダイアログ上のコントロールのハンドルを取得したい場合は、まず、「FindWindow user_var(output) "#32770" "" $HWNDPARENT」 によって内部ダイアログのハンドルを取得します。

GetDlgItem $0 $HWNDPARENT 1 # 次へ/インストール ボタン

4.9.14.7 HideWindow

インストーラを隠します。

4.9.14.8 IsWindow

HWND jump_if_window [jump_if_not_window]

HWND がウインドウなら、jump_if_window にジャンプします。そうでなければ、jump_if_not_window にジャンプします(指定されていれば)。

GetDlgItem $0 $HWNDPARENT 1
IsWindow $0 0 +3
  MessageBox MB_OK "ウインドウが見つかった"
  Goto +2
  MessageBox MB_OK "ウインドウではない"

4.9.14.9 LockWindow

on|off

on を指定すると、メイン画面が再描画されないようになります。off を指定すると、on を指定して以降、再描画が停止されていたすべてのコントロールを再描画します。これにより、個々のコントロールをその都度、再描画するのではなく、コントロールのグループを同時に再描画できるため、ページのちらつきを目立ちにくくすることができます。個々のコントロールのちらつきは、古いコンピュータではより顕著となります。

4.9.14.10 SendMessage

HWND msg wparam lparam [user_var(return value)] [/TIMEOUT=time_in_ms]

HWND にメッセージを送信します。ユーザ変数 $x を指定した場合は、SendMessage の返り値が格納されます。msg には、メッセージの整数値を指定します。wparamlparam として文字列を送信したい場合は、"STR:a string" を使用します。

  • WM_CLOSE 16
  • WM_COMMAND 273
  • WM_USER 1024

定義されているすべての Windows メッセージをスクリプトで使用するには、WinMessages.nsh をインクルードします。

文字列のパラメータを送信するには、パラメータの前に "STR:" をつけます。例えば、 "STR:Some string" のようです。

/TIMEOUT=time_in_ms は、タイムアウトする時間をミリ秒で指定するために利用します。

!include WinMessages.nsh
FindWindow $0 "Winamp v1.x"
SendMessage $0 ${WM_CLOSE} 0 0

4.9.14.11 SetAutoClose

true|false

自動的にウインドウを閉じるかどうかのデフォルトのフラグ(インストーラは AutoCloseWindow で設定され、アンインストーラは false が設定されている)を上書きします。true を指定した場合、インストールが完了すると、即座にインストーラ画面が閉じられます。false を指定した場合は、手動で閉じるよう設定されます。

4.9.14.12 SetBrandingImage

[/IMGID=item_id_in_dialog] [/RESIZETOFIT] path_to_bitmap_file.bmp

ブランドの画像として表示するビットマップファイルを設定します。IMGID が指定されない場合は、最初に見つかったイメージコントロールが使用されます。あるいは、AddBrandingImage によって作成されたイメージコントロールが使用されます。このビットマップはユーザのコンピュータ上で表示される必要があります。File コマンドを使用して、最初にその画像ファイルをユーザのマシンに保存してください。/RESIZETOFIT が指定された場合は、画像は、コントロールのサイズに自動的にリサイズされます(非常に簡易な手法で)。AddBrandingImage を使用すると、このサイズを取得することができます。スクリプトをコンパイルして、AddBrandingImage の出力を確認することによって、サイズを知ることができます。SetBrandingImage は、.onInit! から呼び出された場合は動作しません。

4.9.14.13 SetDetailsView

show|hide

詳細画面を表示したり、隠したりします。ShowInstDetails によって設定されるデフォルトの設定を上書きします。

4.9.14.14 SetDetailsPrint

none|listonly|textonly|both|lastused

どのコマンドによってステータスを出力するか設定します。none は出力なしです。listonly はステータステキストをリストボックスに追加し、textonly はステータスバーにステータステキストを出力します。both は両方に出力します(デフォルト)。小さなファイルを大量に抽出する場合、textonly を推奨します(特に、滑らかなスクロールが有効になっている win9x)。

SetDetailsPrint none
File "secret file.dat"
SetDetailsPrint both

4.9.14.15 SetCtlColors

hwnd [/BRANDING] [text_color] [transparent|bg_color]

静的コントロール、エディットコントロール、ボタン、ダイアログの背景やテキストの色を設定します。text_colorbg_color には、変数は使用できません。コントロールのハンドル hwnd を取得するには、GetDlgItem を使用してください。コントロールを透過にするには、背景色の値に transparent を指定してください。/BRANDING を指定すると、コントロールを完全な灰色(あるいは、テキスト色と背景色で指定されたその他の色)にすることができます。これは、MUI のブランドテキストコントロールで使用されます。

FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1006
SetCtlColors $0 0xFF0000 0x00FF00

警告:XPStlye on」 を使用している場合、チェックボックスの背景色を transparent に設定しても適切に機能しない可能性があります。特定の Windows テーマにおいては、背景は透過ではなく完全な黒になります。

4.9.14.16 SetSilent

silent | normal

インストーラをサイレントモード、あるいは通常モードに設定します。サイレントインストールの詳細については、SilentInstall を参照してください。.onInit 内においてのみ使用できます。

4.9.14.17 ShowWindow

hwnd show_state

ウインドウの表示状態を設定します。show_states には、Windows ShowWindow 関数と同様の値が指定できます。SW_* 定数は、Include\WinMessages.nsh で定義されています。

!include WinMessages.nsh
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 ${SW_HIDE}
Sleep 1000
ShowWindow $0 ${SW_SHOW}

4.9.15 多言語命令

4.9.15.1 LoadLanguageFile

language_file.nlf

言語テーブルの構築のための言語ファイルをロードします。NSIS に組み込まれているすべての言語ファイルは、Contrib\Language Files にあります。

言語ファイルをロードすると、言語 ID として ${LANG_langfile} が定義されます(例: ${LANG_ENGLISH}は1033)。これを、LangStringLicenseLangString、LangDLL、VIAddVersionKey で使用します。

4.9.15.2 LangString

name language_id string

多言語文字列を定義します。言語ごとに値が異なる文字列を定義するために利用します。スクリプトに大量の分岐を追加する必要なく、簡単にインストーラを多言語化することができます。

それぞれの文字列は、文字列を識別するための名前 name を持ち、インストーラでは各言語に対応する値が使用されます。スクリプト内における実行時の文字列でも使用することができます。言語文字列は、挿入したい場所で $(言語文字列の名前) と記述するだけで使用できます。

注意点:

  • 波括弧 {} を使用する define とは異なり、言語文字列は丸括弧 () を使用します。
  • .onInit 関数で言語を変更した場合でも、.onInit 内の言語文字列はユーザの Windows のデフォルト言語のままであるという点に注意してください。言語は、 .onInit の後で初期化されるためです。
  • スクリプトにおいては、常に、すべての言語に対して言語文字列を設定してください。
  • 言語 ID を 0 に設定した場合、LangString や LoadLanguageFile で最後に使用された言語が使用されます。

使い方の例:

 LangString message ${LANG_ENGLISH} "英語のメッセージ"
 LangString message ${LANG_FRENCH} "フランス語のメッセージ"
 LangString message ${LANG_KOREAN} "韓国語のメッセージ"

 MessageBox MB_OK "翻訳されたメッセージ: $(message)"

4.9.15.3 LicenseLangString

name language_id license_path

LangString と同様に振る舞いますが、LicenseLangString はテキスト/RTF ファイルから文字列を読み込み、LicenseData でだけ利用できる特殊な言語文字列を定義します。

LicenseLangString license ${LANG_ENGLISH} license-english.txt
LicenseLangString license ${LANG_FRENCH} license-french.txt
LicenseLangString license ${LANG_GERMAN} license-german.txt
LicenseData $(license)

4.10 多言語

[原文]

バージョン 2 以降、NSIS は多言語を完全サポートしています。ひとつのインストーラのインターフェースで多言語をサポートすることができます。

デフォルトのインターフェーステキストや言語のプロパティをロードするには、各言語に対する LoadLanguageFile を使用してください。

デフォルトのインターフェーステキストは、ComponentText などの命令を利用することで、簡単に変更することができます。

また、スクリプト内で標準の言語文字列を使用することも可能です(例えば、$(^Name)はインストーラの名前を保持し、Name 命令で設定されます)。標準の言語文字列の一覧は、言語ファイルの文字列の上にあるコメントに記述されています。言語ファイルは、Contrib\Language Files にあります。

独自の言語文字列を作成するためには、LangString を利用します。

多言語インストーラの例については、languages.nsi を参照してください。

4.10.1 言語の選択

インストーラの開始時において、インターフェース言語を選択するために、以下のようなステップが実行されます。

  1. ユーザのデフォルトの Windows UI 言語を取得する
  2. その言語の完全一致を探索する
  3. 完全一致しない場合は、一次言語(primary language)が一致するものを探索する
  4. 一致しない場合、スクリプトで定義された第一言語を使用する(第一言語は英語など一般的なものであるか確認しておくこと)
  5. .onInit で言語変数 $LANGUAGE が変更された場合、NSIS は2から4のステップを再実行する

4.10.2 LangDLL プラグイン

LangDLL プラグインを使用すると、インストーラの言語を選択するためのオプションをユーザに提示することができます。言語 ID (${LANG_langfile})とインストーラにおける全言語の名前をスタックに Push した後、言語の数、キャプション、言語の選択をユーザを知らせるテキストを Push し、LangDialog という名前のプラグイン関数を呼び出します。最後に、返り値を $LANGUAGE に Pop し、処理を続行します。ユーザがキャンセルボタンをクリックした場合、戻り値は "cancel" となります。

使い方の例については、 languages.nsi を参照してください。

4.10.3 RTL 言語

RTL 言語は、右から左へと記述される言語です(例: アラビア語やヘブライ語)。NSIS は、RTL 言語を完全サポートしています。言語ファイルには、言語が RTL かどうかを指定するための箇所があります。実行時において、現在の言語が RTL であるかどうかを判定するためには、$(^RTL) 言語文字列の値をチェックしてください。RTL であれば 1、そうでなければ 0 が格納されています。これは、ダイアログ(通常は、RTL 設定を持っている)を生成するプラグインを利用する際に有用です。

4.11 プラグイン DLL

[原文]

NSIS スクリプト言語の能力は、DLL ファイルで提供される機能を利用することによって拡張することが可能です。プラグイン DLL に関する一番の例は、おそらく、NSIS にバンドルされている InstallOptions.dll です。

NSIS コンパイラが開始されると、プラグインディレクトリから DLL を探索し、見つかったプラグインとエクスポート関数のリストを作成します。コンパイル中は、予約語が記述されるべき位置において、「fred::flintstone」のような文字列に遭遇すると、コンパイラはそのリストを調べます。fred.dll が flintstone という関数をエクスポートしていれば、NSIS は fred.dll ファイルを作成されたインストーラのバイナリに追加します。

プラグインコマンドの実行中は、NSIS は必要な DLL を一時フォルダ($PLUGINSDIR)に展開し、指定されたすべての引数を Push してから(右から左の順)、DLL 関数を実行します。

4.11.1 プラグインコマンドの使用

プラグインの呼び出しは次のようです。

InstallOptions::dialog "ini_file_location.ini"

すべての引数はスタックに Push されます(この例では、プラグイン関数の引数は1つだけ)。スタックに引数を必要としないプラグイン関数もあれば、より多くの引数を要求する関数もあるかもしれません。プラグインコマンドを利用するためには、その関数がどのような引数を要求するのかを知るために、プラグインのドキュメントを読む必要があります。

4.11.2 プラグインの手動呼び出し

ユーザのハードディスクに保存されているプラグインを呼び出したりしたい場合は、CallInstDLL を使用します。ほぼすべてのプラグインは、インストーラの機能を提供しているため、プラグインコマンドを使用するのが近道です。あなたのアプリケーションの特定のバージョンにリンクする必要があるプラグインを作成し、それがインストールフォルダにコピーされているという場合には、CallInstDLL は有用かもしれません。

4.12 サイレント インストーラ/アンインストーラ

[原文]

サイレントインストーラは、ユーザからの入力を必要とせず、ユーザインターフェースも持たないインストーラです。ユーザはダイアログを見ることなく、何か質問されることもありません。これは、ネットワーク管理者が、多くのコンピュータを素早く処理するために、ユーザの介入なしで何かをインストールやアンインストールする際に有用です。また、開発者が、自身のインストーラに他のインストーラを組み込む場合において、2つのインストーラを表示する代わりに、必要な情報を自身のインストーラ上で収集したい場合においても有用です。

NSIS インストーラ/アンインストーラは、サイレントモードと通常モードの両方をサポートします。インストーラ/アンインストーラがサイレントの場合、一部のコールバックは呼び出されません。.onGUIInit.onGUIEnd、アンインストーラに対応するもの、特定のページやページタイプに関係するコールバックは呼び出されません。

インストーラ/アンインストーラをサイレントにするには、いくつかの方法があります。

  1. SilentInstallSilentUninstall
  2. SetSilent
  3. /S をコマンドラインに渡す(大文字と小文字の区別あり)

インストーラ/アンインストーラがサイレントかどうかをチェックするには、IfSilent を利用します。

インストーラがサイレントがどうかを確認するためには、ユーザの介入を要求したり、ウインドウを作成したりするコマンドの前において、IfSilent でチェックする必要があります。サイレントモードにおいて最も問題となる MessageBox コマンドには、サイレントインストーラに対するデフォルトの答えを設定するための /SD スイッチがあります。インストーラ/アンインストーラを完全にサイレントにするためには、このスイッチを使用する必要があります。NSIS の内部のメッセージボックスは、すべてサイレントインストーラに対するデフォルトが設定されています。このトピックの詳細に関しては、silent.nsi を参照してください。

サイレントインストーラにおいては、ディレクトリページを表示することができないため、コマンドラインでインストールディレクトリを指定するためのオプションがあります(このオプションはサイレントでないインストーラ/アンインストーラでも動作します)。以下の例のように、 /D スイッチを使用します。

foo.exe /S /D=C:\Program Files\Foo

インストーラ/アンインストーラが、サイレントでは収集ができないその他の情報を必要とする場合、ユーザにそれらの情報をコマンドラインで指定させ、.onInit で処理することもできます。GetOptions が利用できます。

!include FileFunc.nsh
!insertmacro GetParameters
!insertmacro GetOptions

Function .onInit
  ${GetParameters} $R0
  ClearErrors
  ${GetOptions} $R0 /USERNAME= $0
FunctionEnd

上述の例では、/USERNAME= で渡された値を $0 に格納しています。これにより、必要な情報をコマンドラインで指定することが可能となっています。ユーザは次のように使用します。

foo.exe /S /USERNAME=Bar /D=C:\Program Files\Foo

あるいは

foo.exe /S /USERNAME=string with spaces /D=C:\Program Files\Foo

あるいは

foo.exe /S /USERNAME="string with spaces" /D=C:\Program Files\Foo

より多くの情報を必要とするインストーラ/アンインストーラをサイレントにしたい場合は、答えファイル(アンサーファイル)へのパスを渡せるようにするべきです。これにより、コマンドラインにすべての情報を記述するよりも、はるかに使いやすいものとなります。

前へ | 目次 | 次へ


SourceForge Logo

3. Command Line Usage - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

第3章: コマンドラインの使い方

3.1 MakeNSIS の使い方

MakeNSIS コマンドを使用して、スクリプトファイル(.nsi)を実行可能なインストーラにコンパイルします。NSIS 開発キットをインストールすると、エクスプローラ上で .nsi ファイルを右クリックし、「コンパイル」を選択するだけでコンパイルすることができます。

コマンドラインから MakeNSIS を使用する場合、makensis コマンドの構文は以下のようです。

makensis [option | script.nsi | - [...]]

3.1.1 オプション

  • /LICENSE はライセンスページを表示します。
  • /V スイッチに続く0から4の数字は出力メッセージの量を設定します。0=出力なし、1=エラーのみ、2=警告とエラー、3=情報と警告、エラー、4=すべての出力。
  • /P スイッチに続く0から5の数字はコンパイラ プロセスの優先度を設定します。0=低、1=通常以下、2=通常(デフォルト)、3=通常以上、4=高、5=リアルタイム。
  • /O に続くファイル名はログの出力先を設定します(スクリーンには出力されなくなる)。
  • /PAUSE は終了する前に makensis を一時停止します。Windowsから直接実行した場合に有効です。
  • /NOCONFIG は nsisconf.nsh の読み込みを抑制します。このオプションを指定しない場合、インストーラは nsisconf.nsh からデフォルトを設定します。
  • /CMDHELP は指定されたコマンドの基本的な使い方を表示します。コマンドが指定されない場合は、すべてのコマンドを表示します。
  • /HDRINFO は makensis がどのようなオプションでコンパイルされたかを出力します。
  • /NOCD は .nsi ファイルがあるディレクトリにカレントディレクトリを変更することを抑制します。
  • /D スイッチを利用すると、グローバルな define リスト(!define を参照)にシンボルを追加することができます。このスイッチは複数回利用することができます。
  • /X スイッチを利用すると、続けて指定したコードを実行することができます。このスイッチは複数回利用することができます。例: "/XAutoCloseWindow false"
  • スクリプトファイル名の代わりにダッシュ(-)を指定すると、makensis は標準入力をソースに設定します。

3.1.2 注意点

  • 引数は順番どおりに処理されます。「makensis /Ddef script.nsi」と「makensis script.nsi /Ddef」は同じではありません。
  • 複数のスクリプトを指定された場合は、結合されたひとつのスクリプトとして扱われます。
  • Windows 95、98、NTでは、プロセスの優先度に「通常以下」と「通常以上」を設定することができません。これらのシステムでは、「通常以下」は「低」に、「通常以上」は「高」に設定されます。

3.1.3 環境変数

makensis は、ディレクトリの場所を保持しているいくつかの環境変数をチェックします。それらの変数を示します。

  • NSISDIR, NSISCONFDIR - NSIS データと設定ファイルがインストールされた場所。NSISDIR は、スクリプト変数 ${NSISDIR} に割り当てられます。詳しくは 4.2.3 を参照してください。
  • APPDATA (Windows) または HOME (他のプラットホーム) - ユーザごとの設定ファイルの場所。

3.1.4 例

基本的な使い方:

makensis.exe myscript.nsi

クワイエットモード:

makensis.exe /V1 myscript.nsi

圧縮方式の強制:

makensis.exe /X"SetCompressor /FINAL lzma" myscript.nsi

スクリプトの振る舞いを変更:

makensis.exe /DUSE_UPX /DVERSION=1.337 /DNO_IMAGES myscript.nsi

パラメータの順序:

makensis /XSection sectioncontents.nsi /XSectionEnd

3.2 インストーラの使い方

生成されたインストーラやアンインストーラは、コマンドラインでいくつかのオプションを指定することができます。これらのオプションによって、インストール処理をもう少しだけ制御することができます。

3.2.1 一般的なオプション

  • /NCRC は CRC チェックを無効にします。ただし、スクリプト内で 「CRCCheck force」 が使用されていない場合に限ります。
  • /S はインストーラやアンインストーラをサイレンとモードで実行します。詳細については 4.12 を参照してください。
  • /D はデフォルトのインストールディレクトリ( $INSTDIR )を設定し、 InstallDir および InstallDirRegKey を上書きします。このオプションは、コマンドラインにおける一番最後のパラメータでなくてはいけません。また、たとえパスにスペースが含まれてたとしても、クォートを含めてはいけません。絶対パスのみサポートします。

3.2.2 アンインストーラ特有のオプション

  • _?= は $INSTDIR を設定します。このオプションは、また、アンインストーラを一時ディレクトリにコピーしてから実行することを抑制します。アンインストーラの終了を待つために、 ExecWait を利用することもできます。このオプションは、コマンドラインにおける一番最後のパラメータでなくてはいけません。また、たとえパスにスペースが含まれてたとしても、クォートを含めてはいけません。

3.2.3 例

installer.exe /NCRC
installer.exe /S
installer.exe /D=C:\Program Files\NSIS
installer.exe /NCRC /S /D=C:\Program Files\NSIS
uninstaller.exe /S _?=C:\Program Files\NSIS
# uninstall old version
ExecWait '"$INSTDIR\uninstaller.exe" /S _?=$INSTDIR'

前へ | 目次 | 次へ


 

SourceForge Logo

2. Tutorial: The Basics - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

第2章: チュートリアル: 基本

2.1 はじめに

[原文]

ダウンロードあるいは購入したソフトウェアパッケージの多くには、インストーラが付属しています。インストーラはファイルをコピーしたり、更新したり、レジストリキーを書き込んだり、設定を書き込んだり、ショートカットを作成したり、と様々な処理を実行します。これらは、すべて自動的に実行されます。ユーザはいくつかの情報を入力するだけで、残りはインストーラがやってくれます。ユーザはウェザードを通じて適切なオプションを選択し、インストーラが完了するまで待ちます。インストーラが完了した後、ユーザに残されているのはプログラムを開始するという単純なタスクだけです。必要なステップはすべてインストーラによって実行されていますので、何か忘れていないかと心配する必要はありません。

NSIS はインストーラを作成するための開発者用のツールです。NSIS によって、ファイルをコピーするだけの基本的なインストーラから、レジストリキーを書き込んだり、環境変数を設定したり、最新のファイルをインターネットからダウンロードしたり、設定ファイルをカスタマイズしたり、など多くのタスクを実行する複雑なインストーラまで、あらゆるインストーラを作成することができます。NSIS は非常に柔軟で、そのスクリプト言語は簡単に習得が可能です。

NSIS は、すべてのインストールファイルとスクリプトを単一の実行ファイルにコンパイルするため、アプリケーションを簡単に配布することができます。インストールデータに追加される NSIS 自身のコードは約 34KB のみです(標準的な設定の場合)。オーバーヘッドが非常に小さいにも関わらず、NSIS は強力なスクリプト言語と外部プラグインによって多くのオプションを提供することが可能です。

2.2 スクリプトファイル

[原文]

NSIS インストーラを作成するためには、まず NSIS スクリプトを書かなくてはいけません。NSIS スクリプトは特別な文法で記述されるテキストファイルです。スクリプトは、様々なテキストエディタで編集することが可能です。NSIS は、エラーやエラーの恐れがある箇所を、行番号を利用して警告するため、行番号が表示できるテキストエディタをおすすめします。構文強調表示がサポートされているエディタもおすすめです。NSIS Wiki から、NSIS 専用のエディタと構文強調表示のためのファイルをダウンロードすることが可能です。

NSIS スクリプトにおいて、すべての行はコマンドとして扱われます。コマンドが長すぎる場合は、行末にバックスラッシュ \ を書いて行を分割することができます。コンパイラは、分割された行を新しいコマンドとはみなさず、前の行の続きとして扱います。例を示します。

Messagebox MB_OK|MB_ICONINFORMATION \
"This is a sample that shows how to use line breaks for larger commands in NSIS scripts"

文字列の中でダブルクォテーションを使用したい場合は、$\" のようにエスケープしたり、` や ' のような別の引用記号で文字列をクォートしたりします。

スクリプトファイルの詳細については、 スクリプトファイルの形式 を参照してください。

スクリプトファイルのデフォルトの拡張子は .nsi であり、ヘッダファイルの拡張子は .nsh です。ヘッダファイルを利用することによって、スクリプトを複数のコードブロックに分割したり、ヘッダファイルに関数やマクロを置き、複数のインストーラからインクルードしたりすることが可能です。これによって更新が容易となり、またスクリプトを読みやすくすることができます。ヘッダファイルをインクルードするには、!include を利用します。NSIS ディレクトリの下のインクルードディレクトリにあるヘッダファイルは、ファイル名だけでインクルードできます。例を示します。

!include Sections.nsh

2.3 スクリプトの構造

[原文]

NSIS スクリプトには、「インストーラ属性(Installer Attribute)」と「セクション(Section)」、「関数(Function)」を記述することができます。また、コンパイル時の制御のために「コンパイラ指令(Compiler Command)」を利用することも可能です。スクリプトには少なくとも、インストーラの出力先を指定する OutFile 命令と、ひとつ以上のセクションが必要です。

2.3.1 インストーラ属性

[原文]

インストーラ属性コマンドはインストーラの挙動と見た目を決定します。これらの属性によって、インストール時に表示するテキストを変更したり、インストールタイプの数を変更したりすることができます。これらのコマンドの多くは、実行中に変更することができません。

その他の基本的な命令としては NameInstallDir があります。

インストーラ属性コマンドの詳細については、 インストーラ属性 を参照してください。

2.3.2 ページ

[原文]

サイレントではないタイプのインストーラは、インストールの設定を入力するためのウィザードページを持ちます。どのページを表示するかは、Page (あるいは、より高度な設定のための PageEx )コマンドによって設定します。典型的な Page コマンドの使用例は以下のようです。

Page license
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles

これらの Page コマンドは、インストーラにおいて、使用許諾、インストールするコンポーネントの選択画面、インストールディレクトリの選択画面を表示し、最後に instfiles ページで選択されたコンポーネントをインストールします。アンインストーラにおいては、確認ページを表示した後、instfiles ページでアンインストールを実行します。

2.3.3 セクション

[原文]

通常のインストーラでは、いくつかのコンポーネントを選択してインストールすることができます。例えば、NSIS のインストーラでは、ソースコード、追加のプラグイン、サンプルなどのインストールコンポーネントが選択できます。NSIS では、各コンポーネントは、それぞれに対応するコードを持ちます。ユーザが、あるコンポーネントのインストールを選択した場合、インストーラは対応するコードを実行します。スクリプトでは、このコードはセクションで定義されます。各セクションは、コンポーネントページにおける各コンポーネントに対応します。セクションの名前はコンポーネントの表示名となります。セクションがひとつだけのインストーラをビルドすることも可能ですが、コンポーネントページを利用してユーザにインストールするコンポーネントを選択させたい場合は、ひとつ以上のセクションを定義する必要があります。

アンインストーラも、複数のセクションを持つことができます。アンインストーラにおけるセクション名の前には、'un.' を付けます。例を示します。

Section "Installer Section"
SectionEnd

Section "un.Uninstaller Section"
SectionEnd

セクションに記述されるコードは、ユーザのコンピュータで実行時に実行されるものです。インストール属性における命令とは大きく異なります。これらの命令によって、ファイルを抽出したり、レジストリやファイルを読み書きしたり、ディレクトリを作成したり、ショートカットを作成したり、と様々な処理が実行できます。詳細については、命令 を参照してください。

最も基本的な命令は、どこにファイルを展開するかを指示する SetOutPath と、ファイルを抽出する File です。

例を示します。

Section "My Program"
  SetOutPath $INSTDIR
  File "My Program.exe"
  File "Readme.txt"
SectionEnd

セクションの詳細については、 セクション を参照してください。

2.3.4 関数

[原文]

関数には、セクションと同じようにスクリプトコードを記述することができます。関数とセクションの違いは呼び出しの方法です。関数には、ユーザ関数とコールバック関数の2種類があります。

ユーザ関数は、セクションや他の関数の中から Call 命令によって呼び出されます。ユーザ関数は、呼び出されるまで実行されることはありません。インストーラは、関数内のコードを実行した後、Call 命令の後ろに続く命令を実行していきます。ただし、関数内でインストールが中断された場合はこの限りではありません。ユーザ関数は、同じような命令を、インストーラの複数の箇所で実行する必要がある場合に、非常に役立ちます。関数の利用により、コードをコピーする手間が省け、コードのメンテナンスもより簡単になります。

コールバック関数は、「インストーラが開始した時」のようなイベント発生時に、インストーラによって呼び出されます。必要ない場合は、コールバックを設定しなくても構いません。例えば、インストーラの開始時にメッセージを表示したいなら、.onInit という名前の 関数を定義します。NSIS コンパイラは、.onInit という名前から、この関数はコールバック関数であると判断し、インストーラの開始時に呼び出します。

Function .onInit
  MessageBox MB_YESNO "プログラムをインストールします。続行しますか?" IDYES gogogo
    Abort
  gogogo:
FunctionEnd

Abort 命令はコールバック関数において特別な意味を持ちます。上述の例では、Abort は初期化を中止し、即座に終了することをインストーラに通知しています。コールバック関数の詳細については、 コールバック関数 を参照してください。

関数についての詳細は、 関数 を参照してください。

2.3.5 スクリプトの仕組み

[原文]

2.3.5.1 コードの論理構造

StrCmpIntCmpIfErrorsGoto によって、条件分岐や繰り返しを実現することができます。また LogicLib によって、より簡単に記述することも可能です。LogicLib は複雑な論理構造を簡単に実現するためシンプルなマクロを提供します。その構文は( LogicLib.nsh を参照)、他のプログラミング言語と類似しており、初心者にとっても、上級者にとっても、分かりやすいものです。

例えば、LogicLib を使用せずに、変数の値をチェックする場合は以下のようになります。

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:

それに対して、LogicLib を利用すると、より読みやすく、理解しやすいコードになります。以下に例を示します。

${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}

同じことを Switch を使って実現することもできます。以下に例を示します。

${Switch} $0
  ${Case} 'some value'
    MessageBox MB_OK '$$0 is some value'
    ${Break}
  ${Case} 'some other value'
    MessageBox MB_OK '$$0 is some other value'
    ${Break}
  ${Default}
    MessageBox MB_OK '$$0 is "$0"'
    ${Break}
${EndSwitch}

複数条件もサポートされています。以下の例は $0 と $1 の両方が空である場合、ユーザに通知します。

${If} $0 == ''
${AndIf} $1 == ''
  MessageBox MB_OK|MB_ICONSTOP 'both are empty!'
${EndIf}

LogicLib では、ラベルや相対ジャンプを意識する必要がないため、スクリプトを変更するたびに、ラベル名の衝突を防いだり、ジャンプのオフセットを手動で調整したりする手間を省くことができます。

LogicLib は、while や do、 for といった繰り返し処理もサポートしています。以下はすべて、LogicLib を使って5までカウントする例です。

StrCpy $R1 0
${While} $R1 < 5
  IntOp $R1 $R1 + 1
  DetailPrint $R1
${EndWhile}
${For} $R1 1 5
  DetailPrint $R1
${Next}
StrCpy $R1 0
${Do}
  IntOp $R1 $R1 + 1
  DetailPrint $R1
${LoopUntil} $R1 >= 5

LogicLib を利用するには, 次の行をスクリプトの先頭に記述する必要があります。

!include LogicLib.nsh

その他の例については、 LogicLib.nsi を参照してください。

2.3.5.2 変数

変数($VARNAME)を宣言するには、Var コマンドを利用します。変数はグローバル変数であり、すべてのセクション、および関数から参照することができます。

ユーザ変数の宣言と利用の例です。

Var BLA ;変数の宣言

Section bla

  StrCpy $BLA "123" ;ここで変数 $BLA を使うことができる

SectionEnd

スタックも用意されています。スタックは、一時的な記憶領域としても利用が可能です。スタックにアクセスするには、PushPop コマンドを利用します。Push はスタックに値を追加し、Pop は値を取り出して変数にセットします。

共有コードにおいては、$0 や $R0のような 20個のレジスタ を利用することができます。これらの静的な変数は、宣言の必要がなく、名前の衝突もありません。これらの変数を共有コードの中で利用する場合は、まず始めに元の値をスタックに格納し、処理が終わった後で元の値に復元します。

以下の例では、変数には呼び出し前と同じ値が格納されます。複数の変数を利用する場合は、Push、Popの呼び出し順序に注意してください。スタックは、「last-in first-out(後入れ先出し)」です。

Function bla

  Push $R0
  Push $R1

    ...code...

  Pop $R1
  Pop $R0

FunctionEnd

2.3.5.3 デバッグスクリプト

NSIS を使えば使うほど、スクリプトはどんどん複雑になってきます。特に、多くの変数を扱う場合、誤りが混入する可能性が高まります。コードのデバッグを助けるための、いくつかの方法を紹介します。変数の内容を表示するには、 MessageBoxes あるいは DetailPrint を利用します。すべての変数の簡単な概要を取得するには、 DumpState プラグインを利用します。デフォルトでは、インストーラのすべてのアクションはログウインドウに出力されます。ログウインドウで右クリックし、「クリップボードに詳細をコピー」を選択すれば、ログにアクセスすることができます。ログを直接ファイルに出力する方法もあります。 ここ を参照してください。

[原文]

2.3.6 スクリプトの実行

ユーザがインストーラやアンインストーラを実行すると、スクリプトで定義された順番でページが表示されます。instfiles ページまで到達すると、選択されたコンポーネントに対応するセクションが、スクリプトで定義された順番で実行されます。コンポーネントページが表示されなかった場合は、すべて選択されたものと仮定して、すべてのセクションを実行します。

セクション以外のコードとしては、コールバック関数があります。コールバック関数が定義されている場合は、セクションのコードよりも前に実行されます。例えば、.onInit コールバック関数は、スクリプト内のどのコードよりも前に実行されます。ページ表示のある時点において実行される ページコールバック関数 もあります。

2.3.7 コンパイラ指令

[原文]

コンパイラ指令は、インストーラのコンパイル時に開発者のコンピュータにおいて実行される命令です。条件付コンパイルやヘッダファイルのインクルード、アプリケーションの実行、作業ディレクトリの変更などに利用されます。もっとも一般的なものは define です。define はコンパイル時の定数です。製品のバージョン番号を define で定義しておき、スクリプト内で利用したりすることができます。例を示します。

!define VERSION "1.0.3"
Name "My Program ${VERSION}"
OutFile "My Program Installer - ${VERSION}.exe"

詳細については、 条件付コンパイル を参照してください。

もうひとつの代表的な利用方法はマクロです。マクロは、コンパイル時にコードを挿入するために利用されます。マクロでは、define の値が使用されます。マクロのコマンドはコンパイル時に挿入されます。これにより、汎用的なコードを一度だけ記述しておき、それを少しだけ修正して何度も利用したりすることが可能となります。例を示します。

!macro MyFunc UN
Function ${UN}MyFunc
  Call ${UN}DoRegStuff
  ReadRegStr $0 HKLM Software\MyProgram key
  DetailPrint $0
FunctionEnd
!macroend

!insertmacro MyFunc ""
!insertmacro MyFunc "un."

このマクロによって、インストーラ用とアンインストーラ用に同じコードを記述することを避けられます。2つの !insertmacros は2つの関数を挿入します。ひとつは、MyFunc という名前のインストーラ用の関数で、もうひとつは un.MyFunc という名前のアンインストーラ用の関数です。両方ともまったく同じ処理を実行します。

より詳しい情報については、 コンパイル時のコマンド を参照してください。

2.4 コンパイラ

[原文]

スクリプトを作成した後は、スクリプトをコンパイルする必要があります。MakeNSIS.exe は NSIS コンパイラです。コンパイラはスクリプトを読み込んで、構文を解析し、インストーラを生成します。

スクリプトをコンパイルするには、作成した .nsi ファイルを右クリックして「NSISスクリプトをコンパイル」を選択します。NSIS コンパイラのインタフェースである MakeNSISW が起動され、スクリプトをコンパイルするために MakeNSIS が呼び出されます。MakeNSISW は MakeNSIS の出力を取得して、画面に表示します。画面では、出力結果を確認したり、出力結果をコピーしたり、インストーラをテストしたり、インストーラをブラウズしたりすることが可能です。コマンドプロンプトから makensis.exe を実行することも可能です。

コンパイラはスクリプトをチェックして、警告やエラーを表示します。エラーが発生した場合は(例: 引数が2つ必要なのに1つしかない)、コンパイラは処理を中断し、行番号を含む短いエラーメッセージを表示します。致命的でないエラーに対しては、コンパイラは警告を表示します(例: 1つのスクリプトに2つの DirText コマンド)。スクリプトにエラーがない場合は、配布用のインストーラを出力します。

ここ で説明しているように、NSIS は異なる圧縮方式をサポートしています。ZLIB はデフォルトの圧縮方式です。高速でメモリ消費が少ないという特徴があります。また、LZMA はインターネットでの配布など、小さなインストーラを作成するのに適した方式です。BZIP2 は、通常は ZLIB よりも高い圧縮率が得られますが、LZMA ほどの性能は得られません。メモリ使用を抑えたい場合や、高速にスクリプトをコンパイルしたい場合に有効です。

Linux や BSD、Mac OS X サーバで Windows インストーラをコンパイルすることも可能です。詳細については、 NSISの構築 を参照してください。

2.5 モダンユーザインターフェース

[原文]

NSIS の一般的なユーザインターフェースは、「モダンユーザインターフェース」です。最近の Windows バージョンにおけるウィザードのようなインターフェースです。モダンユーザインターフェースは、リソースファイルがカスタマイズされているだけでなく、多くの新しいインターフェースを持っています。現在のステップを説明する白いヘッダや、コンポーネントページにおける説明エリア、ウェルカムページ、アプリケーションの起動やシステムのリブートを選択する完了ページなどです。

その他の情報については、 Modern UI 2 ReadmeModern UI Examples を確認してください。

2.6 プラグイン

[原文]

NSIS は、スクリプト内から呼び出しが可能なプラグインをサポートしています。プラグインは C、C++、Delphiやその他のプログラミング言語で記述される DLL ファイルです。プラグインは、NSIS に対してより強力なコードを提供します。

プラグインの呼び出しは以下のようです。

DLLName::FunctionName "parameter number 1" "parameter number 2" "parameter number 3"

プラグイン関数の呼び出しの際に必要となる引数は、関数によって様々です。ある関数は引数が必要ないかもしれませんし、ある関数は多くの引数を必要とするかもしれません。例を示します。

nsExec::ExecToLog '"${NSISDIR}\makensis.exe" /CMDHELP'
InstallOptions::dialog "$PLUGINSDIR\test.ini"
NSISdl::download http://download.nullsoft.com/winamp/client/winamp291_lite.exe $R0

NSIS が認識しているプラグインはコンパイラ出力の最初に表示されています。NSIS は、 NSIS ディレクトリの下の Plugins フォルダ を探索して、利用可能な関数を一覧表示します。!addplugindir を使って、他のディレクトリも探索するよう NSIS に指示することも可能です。

NSIS には、最初から多くのプラグインが含まれています。NSIS Page コマンド( Pages を参照)と組み合わせてカスタムページを作成する InstallOptions は人気のあるプラグインです。Startmenu プラグインは、ユーザにスタートメニューのフォルダを選択させるページを提供します。様々な目的のための多くのプラグインがあります。Docs フォルダ のヘルプやサンプルを参照してください。NSIS Wiki でも、他のプラグインを見つけることができます。

プラグインを自分自身で作成することも可能です。C/C++ および Delphi のヘッダファイルが利用できます。作成方法については サンプルプラグイン を参照してください。NSIS のプラグインのソースコードも、ソースコードパッケージに含まれています。

2.7 より詳しい理解のために

[原文]

このチュートリアルでは、NSIS の基本的な機能を説明しました。NSIS ができるすべてのことについて詳しく知りたいなら、時間をかけてこのマニュアルを読んでください。

前へ | 目次 | 次へ


SourceForge Logo

1. Introduction to NSIS - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

第1章: NSISの紹介

1.1 NSISについて

[原文]

ユーザがあなたのアプリケーションにおいて最初に出会うものはインストーラです。インストールが遅かったり、失敗したりすると、非常にイライラさせられます。速くてユーザに優しいインストーラは、ソフトウェア製品において非常に重要な要素です。

NSIS (Nullsoft Scriptable Install System) を使えば、速くてユーザに優しいWindows用のインストーラを作ることができます。NSISはオープンソースライセンスの下で公開されており、あらゆる利用において完全に無料です。

NSIS は、インストール、アンインストール、システム設定、ファイルの抽出などが可能なインストーラを生成します。NSIS はスクリプトファイルに基づいているため、インストーラのすべての部分を完全にコントロールすることができます。このスクリプト言語は、通常のプログラミング言語のように変数、関数、文字列操作をサポートしています(インストーラ作成のために設計されてはいますが)。これらすべての特徴があるにも関わらず、NSIS は最も小さなインストーラシステムとなっています。デフォルトの設定では、オーバーヘッドはわずか 34KB です。

1.2 主な特徴

[原文]

小さなオーバーヘッドサイズ

NSIS は小さく、速く、そして効率的になるよう設計されています。他のインストーラは数百キロバイトから数メガバイトのデータをインストーラデータに加えることがありますが、フル機能のNSIS インストーラのオーバーヘッドはわずか 34KB です。

すべての主なWindowsバージョンとの互換性

Windows 95、Windows 98、Windows ME、Windows NT、Windows 2000、Windows XP、Windows Server 2003、Windows Vista に対応した単一ファイルのインストーラを生成することができます。

独自の圧縮方式

3種類の圧縮方式(ZLib、BZip2、LZMA)からいずれかを選択することができます。新しい方式である LZMA 圧縮は他の圧縮方式よりも高い効果が得られます。サイズの大きな自己展開書庫モジュールや、他のアプリケーションを利用する必要はありません。圧縮のサポートは 34KB のオーバーヘッドに含まれています。

スクリプトベース

ファイルとレジストリキーの一覧に基づいてインストーラを生成するだけのシステムとは違い、NSIS は強力なスクリプト言語を持っています。このスクリプト言語は、インストーラのために設計されており、多くのインストール作業を手助けするコマンドが備えられています。簡単に独自のロジックを追加したり、アップグレードやバージョンチェックを実行したりすることが可能です。詳細については NSIS Wiki を参照してください。

単一のインストーラで複数の言語

単一のインストーラで複数のインタフェース言語をサポートすることが可能です。NSIS には、40以上の翻訳がすでに含まれています。独自の言語ファイルを作成することも可能です。アラビア語やヘブライ語のようなRTL (right-to-left)言語も完全にサポートしています。

ターゲットシステムに対する多くの機能とチェック

スクリプト言語は、インストール先のシステムで利用できるコマンド群を提供します。フォルダ生成やレジストリ編集のような単純な機能から、テキストやバイナリファイルの修正や環境変数の変更、システムの再起動まで様々です。プラグインを利用すれば、Windows API を利用することも可能です。

ダイアログとインターフェースのカスタマイズ

ユーザからの入力を得たり、構成オプションを統合したりするための独自のウィザードページを作成することが可能です。NSIS ではクラシック形式、あるいはモダン形式のウィザードインターフェースが利用できます。独自のインターフェースを作成することも可能です。

プラグインシステム

NSIS は、プラグインを利用して拡張することができます。プラグインは、C、C++、Delphi やその他の言語で記述することが可能であり、インストール作業におけるタスクを実行したり、インストーラのインターフェースを拡張したりするために利用できます。プラグインは一行のスクリプトコードで呼び出すことができます。利用されているプラグインだけがインストールデータに加えられ、他のデータと同様に圧縮されます。

ウェブインストール、ファイルパッチングのサポート

NSIS には、インターネットからファイルをダウンロードしたり、インターネットに接続したり、既存ファイルにパッチを当てたりするためのプラグインのセットが含まれています。

プロジェクトの統合、異なるリリース、自動ビルド

NSIS コンパイラは強力なプリプロセッサを持ってます。これによって、複数のプロジェクトをひとつのインストーラにまとめたり、自動的にインストーラを生成したりすることが簡単に実現できます。ライトバージョンとフルバージョンのように、異なるリリースを生成することも可能です。

人間が読める簡単なファイルフォーマット

NSIS スクリプトおよびインターフェースダイアログは、人間が読める簡単なテキストフォーマットで記述されます。そのため、好きなテキストエディタでファイルを編集することが可能です。テキスト形式であるため、スクリプト自体を自動生成することも可能です。

1.3 特徴の一覧

[原文]

  • 自己完結で実行可能なインストーラを生成
  • ZLIB、BZIP2、LZMA データ圧縮のサポート(ファイルは個別あるいは、まとめて圧縮することが可能)
  • アンインストールのサポート(インストーラはアンインストーラを生成することが可能)
  • カスタマイズ可能なユーザインターフェース(ダイアログ、フォント、背景、アイコン、テキスト、チェックマーク、画像、など)
  • クラシック形式とモダン形式のウィザードインターフェース
  • 単一のインストーラで多言語をサポート。40以上の翻訳が利用可能で、独自の翻訳も作成可能
  • ページシステム: 標準的なウィザードページやカスタムページを追加することが可能
  • インストールするコンポーネント選択のためのツリー表示
  • 複数のインストール設定(一般的には、最小インストール、通常、完全インストール)とカスタム設定
  • CRC32 チェックサムによるインストーラの自己検証機能
  • 圧縮データサイズに対して小さなオーバーヘッド(デフォルト設定で34KB)
  • テキスト形式あるいは RTF 形式での使用許諾の表示機能
  • レジストリからインストール先ディレクトリを検出する機能
  • 簡単に使用できるプラグインシステム(カスタムダイアログの生成、インターネット接続、HTTP ダウンロード、ファイルのパッチング、Win32 API の呼び出しなど、多くのプラグインが含まれる)
  • インストーラは 2GB 程度の大きさまで可能
  • 自動インストールのためのサイレントモードオプション
  • 記号の定義やマクロ、条件付きコンパイル、標準的な定義をサポートするプリプロセッサ
  • PHP やアセンブリの要素による美しいコーディング(ユーザ変数やスタック、フロー制御など)
  • インストーラは独自の仮想マシン(VM)を持ち、以下の機能をサポートするコードを記述可能

    • ファイルの抽出 (上書きはパラーメータで設定可能)
    • ファイルおよびディレクトリのコピー、名前変更、削除、検索
    • プラグイン DLL の呼び出し
    • DLL/ActiveX コントロールの登録および登録解除
    • 実行ファイルの実行(シェルによる実行と wait オプション)
    • ショートカットの生成
    • レジストリキーの読み込み、設定、列挙、削除
    • INI ファイルの読み書き
    • 一般的なテキストファイルの読み書き
    • 強力な文字列操作および整数操作
    • クラス名やタイトルによるウインドウの検索
    • ユーザインターフェースの操作(フォントやテキストの設定)
    • ウインドウメッセージの送信
    • メッセージボックスやカスタムページによるユーザインターフェース
    • 分岐や比較など
    • エラーチェック
    • 再起動のサポート、また再起動時に削除あるいは名前変更する機能のサポート
    • インストーラ挙動コマンド(show/hide/wait など)
    • スクリプトにおけるユーザ関数
    • ユーザアクションに対するコールバック関数

  • どのような利用目的でも完全に無料。ライセンスを参照
  • 他にもいろいろ

前へ | 目次 | 次へ


 

SourceForge Logo

NSIS Users Manual 日本語訳

NSIS Users Manual (未完成)

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

[原文]

NSIS is a free scriptable win32 installer/uninstaller system that doesn't suck and isn't huge.

ニュースや情報、サポート、サンプル、チュートリアルなどについては http://nsis.sf.net を確認してください。

クイックリンク:
FAQ - よくある質問の一覧
NSIS Wiki - サンプル、関数、チュートリアル、プラグイン、ソフトウェアなど
フォーラム - 質問の投稿、NSISに関する議論

Copyright (C) 1999-2009 Contributors


 
SourceForge Logo

[C++Builder] ActiveXでエラーダイアログが表示されるのを抑制する

ActiveXコントロールをインストールして利用する際に、何らかのエラーが発生するとHRCHECK: というタイトルのエラーダイアログが表示されます。例外ではないため、try catch で囲ってもダイアログの表示を抑制することができません。

ソースを見ると、このダイアログは PROMPT_ON_HRCHECK_FAILURE が define されていると表示されるようです。そのため、プロジェクトのオプションで NO_PROMPT_ON_HRCHECK_FAILURE を定義しておけば、このダイアログを表示しないようすることができます。

さらに詳しく知りたい人のためのキーワード:utilcls.h、OLECHECK、DebugHlpr_THROW

« 2009年7月 | トップページ | 2011年7月 »