2012年5月27日 (日)

Thunderbirdで[リモートコンテンツを表示する]ボタンをキーボードで操作する

普段、Ubuntu Linux上でThunderbirdを使っていますが、いつの間にかキーボード(「Alt+アルファベット+...」のように・・・、アクセスキーと呼ぶんでしょうか)でメインメニューを操作できなくなってしまい不便だったので、「Keyconfig extension」を導入しました。
これを使うと、自分で書いたスクリプトをキーボードショートカットで呼び出すことができます。例えば、
Fig02
のように書いて、割り当てたキーを押すと、
Fig03
のように表示されます。

さて、ThunderbirdでWebメールを受け取ると、[リモートコンテンツを表示する]ボタンを押さないと絵が表示されません。
Fig11_2
そこで、キーボードショートカットでリモートコンテンツを表示するようにしたいと思います。では、どんなスクリプトにすれば良いか、DOM Inspectorを使って調べていきます。
まず、DOM Inspectorを開いて、メニューから
  [File]-[Inspect Chrome Document]
項目以下の一番上の項目を選択します。
Fig12
そして、一番左上のボタンを押して、
Fig13
Tunderbirdのメインウィンドウに戻って、[リモートコンテンツを表示する]ボタンを押します。そうすると、DOM Inspector上のこのボタンの要素が選択されます。
Fig14_3
右側ペインのoncommand欄が、ボタンを押した時に実行されるコマンドです。さっそく、Keyconfig extensionに入力しましょう。
Fig15
これで、割り当てたショートカットキーを押すと、リモートコンテンツが表示されます。

2012年5月 5日 (土)

Thunderbirdに「フォルダを既読にする」ボタンを付ける

最近、Thunderbirdの拡張機能の作り方を勉強していますが、これがなかなか情報が少なくて難儀します。検索にうまく引っかかると、MDNの素晴らしいドキュメントに出会えるのですが・・・。
さて、Thunderbirdのツールバーに「フォルダを既読にする」ボタンを付けたくて、いろいろ調べているうちに、超簡単な方法を見つけたので紹介します。ちなみに確認した環境は Ubuntu Linux ですが、きっと他の環境でも使えると思います。
以下、手順です。

  1. MDNのCustom toolbar buttonのページの一番下にある、「custom-toolbar-button.xpi」をダウンロードします。
  2. 拡張子をzipに変えて、適当なディレクトリに解凍します。Ubuntuだったら拡張子を変えなくても解凍できます。
  3. 解凍先ディレクトリを「custom-toolbar-button」とした場合、「custom-toolbar-button/chrome/button.js」をテキストエディタで開きます。
  4. 4行目の
      alert("Just testing")

      document.getElementById('cmd_markAllRead').doCommand();
    に差し替えます。
  5. 再度、zip圧縮し、拡張子をxpiに変更します。この時、zip内のディレクトリ構造は、最初にダウンロードしたものと同じになるようにしてください。私は「custom-toolbar-button」ディレクトリを圧縮してしまい、動かなくて悩みました。
  6. Thunderbirdのアドオンマネージャを開き、「ファイルからアドオンをインストール...」を実行します。画面右上の「アドオンを検索」の左にあるレンチとドライバーのアイコンをクリックするとメニューが出てきますので、そこから実行できます。
  7. 先ほど保存たxpiファイルを選択します。
  8. 「作者を信頼しているアドオン以外はインストールしないでください」ダイアログで[今すぐインストール]ボタンを押します。拡張機能の一覧に追加されますので、そこにある「今すぐ再起動する」を押します。
  9. ツールバー上でコンテキストメニューを開き、「カスタマイズ...」を選択。アイテムに新しいアイコンが追加されているので、ツールバーにドラッグ&ドロップします。
「cmd_markAllRead」の部分を別のコマンドに置き換えれば、自由に好みの動作に変えることができます。どのようなコマンドがあるかは、拡張機能「DOM Inspector」で調べましょう。

2012年4月28日 (土)

InstallShieldのオートメーションでビルド中のメッセージを表示する

InstallShieldではインストーラーをビルドする方法が3種類あります。

  (1)InstallShieldのGUI上からビルド
  (2)ISCmdBld.exeコマンドでビルド
  (3)オートメーション インターフェース経由でビルド
3つ目の「オートメーション」でインストーラをビルドするには、「ISWiReleaseオブジェクト」の「Build メソッド」を使うわけですが、ビルド中に何のメッセージも出ないため、途中経過が全くわかりません。
ユーザーズガイドには「ビルドのステータスイベント」として、次の3つが使える、とあります。
  • Public Event ProgressIncrement(ByVal lIncrement As Long, pbCancel As Boolean)
  • Public Event ProgressMax(ByVal lMax As Long, pbCancel As Boolean)
  • Public Event StatusMessage(ByVal sMessage As String, pbCancel As Boolean)
これらを呼べれば、きっとビルド経過を知ることができるに違いありません。
が、使い方がわかるまで少し大変だったので、サンプルのコードを載せておきます。 このサンプルスクリプトは、スクリプトと同じディレクトリにある「xxx.ism」というInstallShieldのプロジェクトファイルをビルドします。「製品構成 1」とか「リリース 1」は、自分のインストーラーに合わせる必要があります。また、「IswiAuto16」はInstallShield2010用です。これも自分の環境に合わせる必要があります。
@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" ""%*""
pause
GOTO :EOF
@end
//
var prjFileName="\\xxx.ism";
var pProject = WScript.CreateObject("IswiAuto16.ISWiProject"); // InstallShield2010 StandAloneBuildを使用
var fso = WScript.CreateObject("Scripting.FileSystemObject");
if(pProject.OpenProject(fso.GetParentFolderName(WScript.ScriptFullName) + prjFileName) == 0){
    WScript.ConnectObject(pProject.ISWiProductConfigs.Item("製品構成 1").ISWiReleases.Item("リリース 1"), "ON_");
    pProject.ISWiProductConfigs.Item("製品構成 1").ISWiReleases.Item("リリース 1").Build();
    pProject.CloseProject();
}else{
    WScript.echo(prjFileName + " を開けませんでした。");
    WScript.quit();
}
//
// ビルド中のメッセージ表示
//
function ON_StatusMessage(sMessage, pbCancel){
    WScript.echo(sMessage);
}
このスクリプトを実行するには、エクスプローラでtest.batをダブルクリックするか、コマンドプロンプトでtest.batを実行します。

2012年4月25日 (水)

JScriptでInputBoxの代わりに・・・

WSH上のVBScriptでは、対話的なプログラムのためにInputBox関数が用意されています。しかし、JScriptにはInputBox関数がありません。VBScriptとJScriptを混在させる手段を考える人もいるようですが、私はWScriptオブジェクトの標準入出力機能の使用をお勧めします。
例えば、こんなコードになります。

var WshShell = WScript.CreateObject("WScript.Shell");
//
WScript.StdOut.Write(">>> ");
str = WScript.StdIn.ReadLine();
WshShell.popup(str);
これをコマンドプロンプトから、
 > cscript test01.js
などとすれば、ユーザーが入力した文字が変数strに格納されていることがわかります。

・・・が、しかし、MSDNにも書いてある通り、この機能はcscriptからは使えますが、wscriptからは使えません。要するに、
  test01.jsをダブルクリックして起動すると使えない
ってことです。
ではどうするかというと、以前書いた「バッチファイルにJScriptを記述する」との合わせ技で解決します。
先ほどのtest01.jsを、次のように改造し、拡張子を.batに変えます。
@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" ""%*""
pause
GOTO :EOF
@end
//
var WshShell = WScript.CreateObject("WScript.Shell");
//
WScript.StdOut.Write(">>> ");
str = WScript.StdIn.ReadLine();
WshShell.popup(str);
これで、test02.batをダブルクリックすると、コマンドプロンプトのウィンドウが表示され、その上でスクリプトが実行されます(プログラムが終了したら、何かキーを押せば、コマンドプロンプトのウィンドウが閉じます)。コマンドプロンプトからは、
 > test02
とだけタイプすれば実行できるので、キータイプも楽になります。素晴らしい!

2012年3月 2日 (金)

Windows Installer Examples 12回目 - An Installation Example(11) Adding Registry Information

Windows Installer Examples 12回目 - An Installation Example(11) Adding Registry Information

Registry Table

Registry Table では、どのようなレジストリ項目を、どのコンポーネントでインストールするか記述します。まず、Registry Table を追加し、
Windowsinstaller12a
ここにある表の情報を入力しましょう。
Windowsinstaller12b_3

Registry
この行の名前です。
Root
レジストリのルートキーを指定します。-1を指定した場合は、インストールのタイプに応じてルートキーが決まります。詳細は後述します。
Key
レジストリキー(多言語対応)。
Name
レジストリ値の名前(多言語対応)。Null の場合は、データは(既定)になります。
もし Value が Null なら、Nameに含まれる以下の文字が特別な意味を持ちます。
文字意味
+コンポーネントがインストールされるとき、キーがなければ作ります。
-コンポーネントがアンインストールされるとき、キーのすべての値とサブキーが削除されます。
*コンポーネントがインストールされるとき、キーがなければ作ります。さらに、コンポーネントがアンインストールされるとき、キーのすべての値とサブキーが削除されます。
コンポーネントがレジストリにインストールしたキーと共にその下の値とサブキーを削除するには、RemoveRegistry table を使う必要があります。
Value
決められたフォーマットに従った、(国際化可能な)レジストリ値を格納します。もし、下表に挙げた文字が値の先頭に付け加えられていたら、その意味はこの表の説明に従います。もし、先頭に(#)が2回以上続いていたら、先頭1文字の(#)は無視され、2文字目以降を文字列として扱います。
添えられる文字意味
#x16進数(REG_BINARY)
#%展開可能な文字列(REG_EXPAND_SZ)
#整数(REG_DWORD)
  • REG_MULTI_SZ形式で文字を表現するには、各文字列をチルダ[~]で区切ります。例えば、a、b、cの3つの文字を表現するには、「a[~]b[~]c」とします。
  • チルダ[~]の部分は、内部的にNull文字に変換されます。
  • 先頭にチルダ[~]を指定すると、既存の文字列に、指定した文字列を後尾に追加します。追加しようとしている文字列がすでに存在するときは、既存の文字列を削除します。
  • 後尾にチルダ[~]を指定すると、既存の文字列の前に指定した文字列を挿入します。追加しようとしている文字列がすでに存在するときは、既存の文字列を削除します。
  • 先頭と後尾にチルダ[~]を指定すると、既存の文字列全体を削除し、指定した文字列で置き換えます。
  • 他の文字列表現の場合は、単一の文字列(REG_SZ)として扱われます。
Component_
Component table の最初の列にある値の一つを指定します。このコンポーネントの設定が、レジストリ値のインストールを制御します。

このテーブルの設定は、sequence tables のWriteRegistryValues アクションと RemoveRegistryValues アクションで処理されます。さらなる情報はUsing a Sequence Tableを参照してください。
このテーブルの設定は、関連付けられた Component がローカルにインストールされるときと、ソースから実行されるときの両方で、レジストリに書かれます。
インストーラーは、レジストリキーを削除するとき、その下にある値やサブキーも一緒に削除します。アンインストール時にレジストリキーが空になることを防ぐために、Name列にダミーの値に(+)を添えた文字を指定してください。もし、Name列に(*)を添えて文字列を入れたら、関連付けられたComponentがアンインストールされるとき、そのキー以下の値やサブキーが指定したキーと共に削除されます。
カスタムアクションを使って、インストール、アンインストール、修復インストール時に、Registry table に行を追加できます。このとき追加した行は、現在のインストール処理中だけ有効です。このカスタムアクションは、これら追加された行の情報を必要とする、インストール、アンインストール、修復インストールのすべてで実行されなければなりません。このカスタムアクションは、アクションシーケンスの RemoveRegistryValues アクションと WriteRegistryValues アクションの前に実行されなければなりません。
安全にレジストリキーを扱う方法は、MsiLockPermissionsEx TableLockPermissions Table を見てください。

Registry Table の Root

Registry Table の Root に設定できる値は、次の通りです。
なし (-1)
もし、ユーザーごとのインストールなら、レジストリ値は HKEY_CURRENT_USER 以下に書かれます。もし、全ユーザーに対するインストールなら、HKEY_LOCAL_MACHINE 以下に書かれます。ALLUSERS property が1であれば、全ユーザーに対するインストールになります。
msidbRegistryRootClassesRoot (0)
ルートキーは HKEY_CLASSES_ROOT になります。
インストーラーがこのキーを指定して値を書いたり消したりすると、ユーザーごとのインストール時には、HKEY_CURRENT_USER\Software\Classes にリダイレクトされます。また、全ユーザーに対するインストールの時には、 HKEY_LOCAL_MACHINE\Software\Classes にリダイレクトされます。詳細は、installation contextを見てください。
msidbRegistryRootCurrentUser (1)
ルートキーは HKEY_CURRENT_USER になります。
msidbRegistryRootLocalMachine (2)
ルートキーは HKEY_LOCAL_MACHINE になります。
msidbRegistryRootUsers (3)
ルートキーは HKEY_USERS になります。
Component table のキーパスとしてレジストリを指定する場合、レジストリ値を HKEY_CURRENT_USER に書くことを推奨します。これにより、コンピューターをマルチユーザーで運用しているとき、レジストリ値が確実に書きこまれます。

2012年2月12日 (日)

Windows Installer Examples 11回目 - An Installation Example(10) Specifying Feature-Component Relationships

FeatureComponents Table

FeatureComponents Table では、どの Component がどの Feature に属しているか記述します。まず、FeatureComponents Table を追加し、
Windowsinstaller11a
ここにある表の情報を入力します。Feature_ には Feature Table の Feature 欄にある名前を記入し、Component_ には Component Table の Component 欄にある名前を記入します。しかし、これだけではつまらないので、もっと入力を楽にする工夫をしてみましょう。

OrcaのTableのエクスポートとインポート

Orcaではテーブルにデータを入れる際、いちいちダイアログボックスを開いて、入力して、確定して、またダイアログボックスを開いて、・・・
と、とても面倒くさいです。テキストエディタで一気に入力して、インポートできないもんでしょうか。インポートできるデータが、どういったフォーマットなのか、既存のテーブルをエクスポートして調べてみます。以前、入力した Component Table をエクスポートします。メインメニューから
  [Tables]-[Export Tables...]
を選択します。
Windowsinstaller11b
[OK]ボタンを押すと、「Component.idt」というファイルができます。テキストエディタで開くと、こんな感じです。
Windowsinstaller11c
あー、なるほど、4行目以降にタブ区切りでデータが並んでいるようです。3行目までは、Table 固有のデータですね。詳細は、こちらを読むと分かりますが、・・・ん~、理解したら役に立つんだろうか。
でも必要なのは、Component Table ではなくて、FeatureComponents Table なので、データがない状態で FeatureComponents Table をエクスポートしてみます。エクスポートした、「FeatureComponents.idt」をテキストエディタで開きます。
Windowsinstaller11d
おぉ、3行分の Table 固有のデータが書き出されています。データ部分をタブ区切りで追記すればインポートできるデータが完成しそうです。やってみましょう。
Windowsinstaller11e
これをインポートします。メインメニューから
  [Tables]-[Import Tables...]
を選択し、「FeatureComponents.idt」を開きます。
Windowsinstaller11f
ここで[OK]ボタンを押せば、インポートできます。
Windowsinstaller11g

2012年2月11日 (土)

マウスレス環境への挑戦

以前からPCを使っているとき、「キーボードとマウスの間を右手が行ったり来たり」というのが嫌で、「マウスなしで、どこまでPCを操作できるか」という課題に挑戦しています。
Windows自身のキーボード ショートカットとして、ここを押さえておくのは当然として、最近便利に使っているのは「西表海猫(西表山猫改め)」です。キーボードカーソルやフォーカスの位置に、かなり目立つカーソルを点滅してくれます。相当古いユーティリティですが、Windows7(64bit版)でも使えています。タスクトレイアイコンをクリックするとクラッシュしてしまいますが、実用上問題ないです。これがないと、Windowsコントロールのフォーカスを見失って、怖くてEnterキーも押せません。
さて、この挑戦を始めて、よく使うようになったキーボードショートカットを紹介します。

キー操作説明
Windows ロゴ キースタートメニューを開き、「プログラムとファイルの検索」にキーボードフォーカスが当たります。「西表海猫」を起動しておくと、Tabキーを押すごとにキーボードフォーカスが変化する様が分かります。
F6キーボードフォーカスを次の領域に飛ばします。WindowsデスクトップでF6キーを押すと、次のようにキーボードフォーカスが移動していきます。
[スタートボタン]→[QuickLaunch]→[タスクバー]→[通知領域]→[デスクトップの表示ボタン]→[デスクトップ]→[スタートボタン]
Windows ロゴ キー + Dデスクトップを表示します。同時にキーボードフォーカスもデスクトップに移動するので、デスクトップに置いたアイコンを操作する場合に使います。
Windows ロゴ キー + B通知領域(タスクトレイ)にキーボードフォーカスを移動します。
Tab言うまでもなく、ある領域内で、次のWindowsコントロールにキーボードフォーカスを移動します。
Alt + Spaceキーウィンドウのシステムメニューを表示します。キーボードだけでウィンドウの最小化、最大化、リサイズなどができます。
Alt + ↓ドロップダウン リストのリストを開きます。アプリをキーボードで操作していると、意外と使います。
Ctrl + +Explorerの右側ペインにフォーカスがあり、詳細表示になっているとき、各列のサイズを調整して、文字がすべて表示されるようにします。
キーボード中心の操作を行なっていると、実はWebブラウザの操作が結構難しくなります。特に、リンクがたくさんあるページを開いているとき、ページの中ほどまでキーボードフォーカスを移動するには、何十回もTabキーを押すはめになります。そこで、リンクで使われている文字を検索して、簡単にリンク先にジャンプできるブックマークレットを作ってみました。
まず、動作を紹介します。
最初にリンクに使われている文字を、検索のために入力します。ここでは、「Windows」と入れます。
01kensakugo_2
そうすると、「Windows」の文字が含まれたリンクがリストアップされます。
02linklist_3
ジャンプさせたいページの番号を入力すると、希望のページにジャンプできます。
プログラムは以下のとおりです。
javascript:res=prompt("検索語を入力","");str="";for(var i=0;i<document.links.length;++i){reg=new RegExp(res,"i");if(document.links[i].innerText.search(reg)!=-1)str+=i.toString()+" : "+document.links[i].innerText+"\n";}res=prompt(str,"");document.location.href=document.links[res].toString();
これをURLの代わりに入れてあげればOKです。
ブックマークレットゆえ、1行になっていますから、読みやすいように整形すると次のようになります。
res=prompt("検索語を入力","");
str="";
for(var i=0;i<document.links.length;++i){
  reg=new RegExp(res,"i");
  if(document.links[i].innerText.search(reg)!=-1)
    str+=i.toString()+" : "+document.links[i].innerText+"\n";
}
res=prompt(str,"");
document.location.href=document.links[res].toString();

2012年2月 2日 (木)

Windows Installer Examples 10回目 - An Installation Example(9) Specifying Features

Feature Table

Windows Installerでは、ファイルやレジストリ項目は File Table に、File Table の各行は Component Table に、Component Table の各行は Feature Table にひも付けします。Feature Table では、インストール物を機能毎に分類し、ユーザーにどの機能をインストールするのか、選択させることができます。もし、複数の機能に分割する必要がなくても、必ず機能は1つ作る必要があります。
この Example では、機能を次のように分割しています。
Notepad
+ Readme
+ Help
Gate
+ January
+ NewYears
Sport
+ Baseball
+ Football
Arts
+ Concert
+ Dance
ブランクデータベースには、Feature Table がないので、追加し、
Windowsinstaller10a
ここにある情報を入力しましょう。
Windowsinstaller10b
それでは、各列の意味を見ていきます。
Feature
この行を識別するID文字列。このテーブルの他の行と重複してはいけません。38文字以内の文字列を指定できます。
Feature_Parent
親の行のID文字列を指定します。空欄にすることもできます。
Title
Feature を省略した短い名前で指定します。ここに指定した文字列は、Selection Dialog の Text Control に使われます。
Description
Feature を説明する説明文です。Selection Dialog の Text Control に表示されます。
Display
ユーザーインターフェース上で、どのような順で Feature を列挙するか指定します。ゼロを指定すると、 Feature を表示しません。また、奇数を指定すると Feature のツリーは展開され、偶数を指定するとツリーはたたまれます。
Level
この Feature の installation level の初期値です。Condition Table でこの値を変えることができます。
ゼロに設定すると、この Feature はインストールされません。
Directory_
Directory Table の Directory 列にある名前を指定します。ユーザーがディレクトリを変更可能にするには、ここに Public Property(すべて大文字の Property)を使用し、Selection Dialog に Browseボタンを表示します。
Attributes
この Feature に属するするファイルを、コンピュータにコピーして使うのか、Source から直接使うのか、設定します。設定できる値の詳細は、以下で説明します。

Feature Table の Attributes

Feature Table の Attributes に設定できる値は、次の通りです。括弧内の数値を足した値を設定します。空欄の場合は、ゼロを設定したとみなされます。
msidbFeatureAttributesFavorLocal (0)
この Feature に属する Component が Source から実行するように指定していなければ、ファイルがコンピュータにコピーされます。1つの Component が、msidbFeatureAttributesFavorLocal を指定した Feature と、msidbFeatureAttributesFavorSource を指定した Feature の両方に登録されている場合、コンピュータにファイルがコピーされます。Component Table の Attributes に msidbComponentAttributesSourceOnly を指定した Component は、常に Source から実行されます。ADVERTISE Property にこの Feature が含まれていると、msidbFeatureAttributesFavorLocal の指定は無視されます。
この Feature に属する Component が、コンピュータにファイルをコピーして使うように指定していないなら、その Component のファイルは Source から実行するようになります。1つの Component が、msidbFeatureAttributesFavorLocal を指定した Feature と、msidbFeatureAttributesFavorSource を指定した Feature の両方に登録されている場合、コンピュータにファイルがコピーされます。Component Table の Attributes に msidbComponentAttributesLocalOnly を指定した Component は、常にコンピュータにファイルがコピーされます。ADVERTISE Property にこの Feature が含まれていると、msidbFeatureAttributesFavorSource の指定は無視されます。
msidbFeatureAttributesFollowParent (2)
このフラグを指定すると、この Feature の設定状態を親の Feature と同じにします。一番最初の親の Feature にはこのフラグを設定できません。このフラグを指定しなかった場合、Feature の設定は、msidbFeatureAttributesDisallowAdvertise、msidbFeatureAttributesFavorLocal、msidbFeatureAttributesFavorSource の各設定が使用されます。
初期状態で、Feature のツリーに表示しないよう設定されていても、親の設定状態を子と同じにするために、msidbFeatureAttributesFollowParent と msidbFeatureAttributesUIDisallowAbsent を子の Fearture に指定するべきです。
msidbFeatureAttributesUIDisallowAbsent を指定せずに msidbFeatureAttributesFollowParentを指定した場合、Feature のツリーに表示しない Feature の設定状態を親と同じにすることはできません。Feature のツリーに表示する設定になっていれば、親と同じにすることができます。
Feature の設定状態を親の Feature と同じにするのであれば、msidbFeatureAttributesFollowParent と msidbFeatureAttributesUIDisallowAbsent を両方指定してください。
msidbFeatureAttributesFavorAdvertise (4)
このフラグを指定すると、Feature が advertise に指定されます。この Feature がADDDEFAULT Property に列挙されている場合は、設定が無視され、Feature の設定は msidbFeatureAttributesFavorLocal と msidbFeatureAttributesFavorSource の指定に応じて決まります。
このフラグを指定しなかった場合は、Feature の設定は msidbFeatureAttributesDisallowAdvertise と msidbFeatureAttributesFavorLocal と msidbFeatureAttributesFavorSource の指定に応じて決まります。
msidbFeatureAttributesDisallowAdvertise (8)
このフラグは、ADVERTISE Property に Feature が列挙されているときにのみ意味があります。
このフラグを指定すると、Feature が advertise に指定されることを防ぎます。 ADVERTISE Property に親子共に Feature が列挙されていないときに、このフラグを指定すると、Feature の設定は msidbFeatureAttributesFavorLocal と msidbFeatureAttributesFavorSource の指定に応じて決まります。ADVERTISE Property に子が列挙されている時、親がこのフラグを指定すると、親はインストールされます。ADVERTISE Property に親が列挙されている時、子がこのフラグを指定すると、子はインストールされません。
このフラグを指定しなかったとき、親も子も ADVERTISE Property に列挙されていなければ、この Feature は Advertise されます。
msidbFeatureAttributesUIDisallowAbsent (16)
このフラグを指定すると、この Feature をインストールしない選択肢がUIから取り除かれます。この Feature がUIに表示されていても、いなくても、このフラグを指定することで Feature がインストールされます。
このフラグを指定しなかった場合、UI上にこの Feature をインストールしない選択肢が現れます。
msidbFeatureAttributesFollowParent と msidbFeatureAttributesUIDisallowAbsent を指定することで、子の Feature を自分と同じにすることができます。
この Feature がUI上に表示されていても、いなくても、このフラグの設定は、UI上の選択肢の操作だけでなく、Feature をインストールするかしないか、の操作も行われます。
msidbFeatureAttributesNoUnsupportedAdvertise (32)
このフラグを指定すると、OSが Advertise を使えないとき、Advertise を無効にします。このフラグを指定しなければ有効なままです。
いくつかのフラグは、同時に設定できません。そのような設定を同時に有効にした場合は、Package Validation に失敗します。
  • msidbFeatureAttributesFavorAdvertise と msidbFeatureAttributesDisallowAdvertise は同時に使えません。
  • msidbFeatureAttributesNoUnsupportedAdvertise と msidbFeatureAttributesDisallowAdvertise は同時に使えません。
  • msidbFeatureAttributesFollowParent と msidbFeatureAttributesFavorSource は同時に使えません。
  • msidbFeatureAttributesFollowParent と msidbFeatureAttributesFavorLocal ほ同時に使えません。msidbFeatureAttributesFollowParent が使われていたら、msidbFeatureAttributesFavorLocal の設定は無効になります。
子の Feature がインストールされれば、その親の Feature もインストールされます。しかし、親の Feature がインストールされるからといって、必ずしもその子の Feature がインストールされる訳ではありません。その子の Feature をインストールするには、子の msidbFeatureAttributesFollowParent と msidbFeatureAttributesUIDisallowAbsent を指定する必要があります。こういった Feature の親子関係は、UI表示と、実際にインストールするかしないかを制御し、コマンドラインから Propaty を指定することで制御できます。

さらなる解説

Component は2つ以上の Feature で共有できますが、別々のインストーラー間でも共有できます。片方の Feature が選択されていれば、共有する Component はインストールされます。これは、親の Feature がアンインストールされても、別の共有する Feature が有効なら、Component はアンインストールされません。これは、インストーラー間で Component を共有している場合も当てはまります。この仕組みは、アプケーション間のファイル共有の仕組みとして使うことができます。
詳しくは、Controlling Feature Selection States を参照してください。

Install Level について

  • インストーラーには Install Level が設定されていて、1から32,767までの値を指定できます。初期値は、Propaty Table の INSTALLLEVEL で設定します。
  • Feature は、Feature Levelが現在の Install Level以下の時だけインストールされます。UIはインストールを初期化する際、インストーラーはユーザーに各 Feature の Install Levelを変更させることができます。例えば、Custom、Typical、Minimumといったインストールオプションを選択させることで、Install Levelを再設定することができます。この選択肢は、SetInstallLevel ControlEvents を使えば、ダイアログボックスを表示して、これら選択肢を示すことができます。
  • ユーザーがダイアログボックスでどれを選択するかによって、Install Levelプロパティに選択に応じた値が設定されます。Typical の選択肢に100というレベルを設定してあれば、ユーザーが Typical を選択すると、100以下の Feature Level を持つ Feature がインストールされます。さらに、Custom オプションを選択すると、SelectionTree Control をもつダイアログボックスを表示することができます。SelectionTree Control はそれぞれの Feature をインストールするかどうか、個々に設定することができます。

2012/02/03
「Install Level について」を追記。

2012年1月30日 (月)

Windows Installer Examples 9回目 - An Installation Example(8) Specifying Source Media

Media Table

Media Tableは、Sourceファイルを複数のディスクに分割したり、圧縮した Sourceファイルと圧縮しない Sourceファイルを混在して使用する場合などに、活躍します。今回は、Sourceファイルを圧縮しないので、非常にシンプルです。
まずは、Media Table を追加し、
Windowsinstaller9a
ここにある情報を入力しましょう。
Windowsinstaller9b

それでは、各列の意味を見ていきましょう。
DiskId
テーブル上の順番を決める番号です。1以上の数字である必要があります。
LastSequence
この行が指し示すソースメディアに含まれるファイルに付けられたシーケンス番号(File Table 参照)の最大値と同じか、最大値より大きい数値を指定します。また、この行が指し示すソースメディアの前に別のソースメディアがあれば、この行が指し示すソースメディアには、その前のソースメディアの LastSequence 値より大きいシーケンス番号のファイルを入れます。
マイナスの数値を指定することはできません。
この Example では、File Table のすべての行について Sequence を「1」に設定したので、ここも「1」になります。
DiskPrompt
通常は Source を格納したディスクに印刷されたディスク名を指定します。ここで指定した文字列は、ユーザーにディスクの入れ替えを促すダイアログボックスに表示されます。
Cabinet
すべての Sourceファイルをキャビネットファイルに圧縮した場合、キャビネットファイル名を指定します。キャビネットファイルを使わないのなら、空欄にしなければなりません
VolumeLabel
Source を格納したディスクがリムーバブルメディアなら、ユーザーがディスクを交換したあと、ここに指定した文字列と、ディスクのボリューム名が一致しているか確かめることができます。
Source
パッチで使用される Sourceファイルやキャビネットファイルの場所を、プロパティで指定します。パッチを使わないのであれば、空欄にする必要があります。Cabinet 列が空欄の場合は、ここで指定した値は無視されます。

2012/02/01
各列の意味を追記。
2012/02/02
LastSequenceに説明追記。

2012年1月29日 (日)

Windows Installer Examples 8回目 - An Installation Example(7) Specifying Files and File Attributes

File Table

インストーラーで配置するファイルを File Table で定義します。ブランクデータベースには File Table がないので、自分で追加します。
Windowsinstaller8a
追加したテーブルに、ここにある情報を追加しましょう。
Windowsinstaller8b
これを見ればわかるように、File Table では、ファイルとコンポーネントを関連付けます。それでは、各列に何を設定したのか見ていきましょう。

File
この行の ID です。ID としては大文字小文字を区別しないので、意図せず他の行と名前が重複しないように気をつけてください。
Component_
この行に指定したファイルが、どの Component に属するか、指定します。ここには、Component Table の Component に設定した値を指定します。
FileName
インストールに使用するファイル名を指定します。
web経由でソースファイルをダウンロードする場合は大文字小文字を厳密に区別することもあるので、この欄に指定るる名前も、大文字小文字を厳密に指定すべきです。
FileSize
ファイルのサイズを指定します。単位はバイト(byte)です。マイナスの数値を指定してはいけません。
Version
この行に、リソースにバージョン番号が含まれるファイルを指定している場合は、そのバージョン番号を文字列で指定します。ファイルにバージョン番号が含まれない場合は、空欄にします。ここに指定したバージョンは、インストールするファイルと一致している必要があります。
ここには、バージョン番号ではなく、このテーブルの他の行にある File 列の ID を指定することもできます。この場合、参照先のファイルがインストールされるときは、この行のファイルもインストールされます。また、参照先のファイルがアンインストールされるときは、この行のファイルもアンインストールされます。詳しくは、Companion Files を参照してください。Version に ID を指定したファイルを、Companion File と呼び、このファイルを Component の Keypath に設定することはできません。
Language
言語IDを10進数で指定します。複数あるときは、「,」(カンマ)で区切ります。
フォントファイルは言語IDをリソースに持たないので、この列を空欄にすべきです。
Attributes
ファイル自身のフアイル属性の他に、インストールに関わる属性も設定します。この Example では「0」ですので、何も指定していません。後ほど、設定できる値を説明します。
Sequence
インストール用の Sourceファイルを圧縮しないで使用する場合は、このテーブルのすべての行を同じ番号にすることができます。この Example ではすべて1に設定していますが、Sourceファイルを圧縮しないで使用するため、このようになっています。Sequence 列には、1以上の数値を設定する必要があります。
インストール用の Sourceファイルは、拡張子「.cab」を持つキャビネットファイルに圧縮して使用することもできます。キャビネットファイルに圧縮したファイルには順番を示す番号が振られており、この Sequence 列に示した順番と一致している必要があります。キャビネットファイル内に保持している順番を示す番号と、File Table の Sequence 列の番号は同じである必要はなく、順番が一致していることが必要です。そのため、Sequence 列には、飛び飛びの数値を指定することもできます。
詳しくは、こちらを参照してください。

File Table の Attributes

File Table の Attributes に設定できる値は、次の通りです。括弧内の数値を足した値を設定します。

msidbFileAttributesReadOnly (1)
ファイル属性を示します。Read-Onlyであることを示します。
msidbFileAttributesHidden (2)
ファイル属性を示します。Hiddenであることを示します。
msidbFileAttributesSystem (4)
ファイル属性を示します。Systemであることを示します。
msidbFileAttributesVital (512)
このファイルが必要不可欠であることを示します。インストール中に、このファイルの配置に失敗すると、インストールが中止され、ロールバックします。この場合、表示するダイアログボックスには、[無視する]ボタンがありません。
もし、この属性を指定していなかったら、ファイルの配置に失敗したときに表示されるダイアログボックスには[無視する]ボタンがあり、このファイルを配置できていなくても、インストールを続行することもできてしまいます。
msidbFileAttributesChecksum (1024)
このファイルのためのチェックサムが存在することを示します。チェックサムはファイルが破壊された時、修復インストールするために必要です。
msidbFileAttributesPatchAdded (4096)
ファイルがパッチで追加されたことを示します。
msidbFileAttributesNoncompressed (8192)、msidbFileAttributesCompressed (16384)
ファイルのソースが非圧縮である(msidbFileAttributesNoncompressed)のか、圧縮されている(msidbFileAttributesCompressed)のか示します。この属性を指定すると、Word Count Summary Property を無視します。もし、msidbFileAttributesNoncompressed も msidbFileAttributesCompressed も指定しなければ、Word Count Summary Property の値により圧縮か非圧縮か判断します。msidbFileAttributesNoncompressed と msidbFileAttributesCompressed の両方を同時に指定することはできません。


2012/01/30
調査中だった「Sequence」の解説を追記。

«Windows Installer Examples 7回目 - An Installation Example(6) Specifying Components