Open11

WIX Installer 関連メモ

hymkorhymkor

COM登録

DLLと、TLBをレジストリに登録しないといけないようです。
regsvr32.exeをインストーラーの中で利用するのではなく、インストーラーが直接レジストリに登録する処理を行うと良いようです。
これも、heat.exeで、引数に、hoge.dll, hoge.tlb をそれぞれ指定して、登録する項目を集めます

セキュリティー上の理由で、インストーラーの中から一種のインストーラーである regsvr32 を呼ぶような真似はできないらしい。regsvr32 XXXXX.dll の相当の処理ができたかどうかは

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\XXXXX.dll

への登録が出来ているかどうかでわかるらしい
(※ 有識者に聞いたことを機械的に書いているので、解釈が間違っているかもしれないが)

hymkorhymkor

プロパティの値を別のプロパティの値に割り当てる直接的な方法はありません。 しかし、カスタム・アクションを使うと、この間隙を乗り越えることが出来ます。 Value 属性は書式指定文字列でも構いませんので、ちょっとした文字列操作もすることが出来ます (パスの参照には、常に末尾のバックスラッシュが自動的に追加されている事に注意して下さい。 バックスラッシュをもう一つ余計に追加する必要はありません)。

<CustomAction Id='PropertyAssign' Property='PathProperty'
  Value='[INSTALLDIR][FilenameProperty].[ExtensionProperty]' />

お、これは結構需要なテクかも。

どうも、どういう場所でプロパティーが設定できるのか、できないのかがよく分かっていない。

上の記載からすると、プロパティー値は基本的に static な値で、インストーラー起動時点で静的に決まっていなければいけないというものという印象を受ける。動的に変えるにはカスタムアクションを定義しなくてはいけないと。カスタムアクションは実行されるタイミングを別途定義しないといけないのも面倒だ。

hymkorhymkor

このサイト、いろいろ載ってるけど、逆引き的に調べられないのがつらいネ!

<CustomAction Id='LaunchFile' FileKey='FoobarEXE'
    ExeCommand='' Return='asyncNoWait' />

第二に、通常と同じ方法で、アクションを予定に入れなければなりません。 アクションとスケジュール項目の間のリンクは、Id — Action の整合する属性のペアで指定します。 インストールを実行する場合にだけ実行ファイルを起動し、製品を削除するときは起動しないように、条件を設定する必要があります

 <InstallExecuteSequence>
 ...
     <Custom Action='LaunchFile' After='InstallFinalize'>NOT Installed</Custom>
 </InstallExecuteSequence>

→ インストール時だけ実行させる方法を知らなかったので、前に実装したときはバッチファイルを実行させるようにして、バッチファイルの中で判断させるというマヌケなことをしていた。

hymkorhymkor
<Directory Id='TARGETDIR' Name='SourceDir'>
  • Id 属性
    • WXI の全ソース・ファイルで一意とされる識別子
    • ProgramFilesFolder のような定義済みの名前が使用可能
    • INSTALLDIR のようなプロパティ名(文字列変数とほぼ同じもの)も使用可能
    • Directory タグでは、インストール先を示す Id となる?
  • Name 属性
    • ディレクトリ名。既存ディレクトリ直下の場合は SourceDir 一択なのか?

Directory エレメント

hymkorhymkor
<Shortcut Id="startmenuHoge10"
                    Directory="ProgramMenuDir"
                    Name="ほげ 1.0"
                    WorkingDirectory='INSTALLDIR'
                    Icon="Hoge10.exe" IconIndex="0"
                    Advertise="yes" />
  • Directory は *.lnk ファイル自体のディレクトリ
  • WorkingDirectory はショートカット内に記入される、実行時ディレクトリ
  • Name は (Name).lnk のようにショートカットの名前として使われる? (Name属性は使われるタグによって用途が変わる?)
hymkorhymkor

Merge 要素

<Directory Id="TARGETDIR" Name="SourceDir">
  <Merge Id="$(var.SafeProdName)_msm"
    Language="1041" DiskId="1" SourceFile="$(var.ProdName)64.msm" />
</Directory>
  • SourceFile : マージモジュールのソース位置へのパス

Merge エレメント

hymkorhymkor

アイコン

 <Icon Id="icon.ico" SourceFile="$(var.HOGE_TargetDir)HOGE.exe"/>
hymkorhymkor

プロパティーに値を設定するには Property 要素を使う

<Property Id="INSTALLDIR">
  <RegistrySearch Id='PiyoHogeRegistry' Type='raw'
      Root='HKLM' Key='Software\Piyo\Hoge 1.0' Name='InstallDir' />
</Property>

【疑問】プロパティーを参照するルールが分からない。

  • Id 属性の場合は、そのままプロパティーの名前を書けばよいのか?
  • その他の属性の場合は、[プロパティー名] という形による引用でよいのか?

参照例(1)

<Condition>条件式</Conition> と <Publish>条件式</Publish>` の条件式の中でプロパティーが使える

参照例(2)

<Property Id="FILEEXISTS">
  <DirectorySearch Id="CheckFileDir" Path="[INSTALLDIR]" Depth="0">
    <FileSearch Id="CheckFile" Name="Lookfor.txt" />
  </DirectorySearch>
</Property>

私たちはまだユーザー・インタフェイスを持っていませんが、 ユーザーとの何らかの相互作用から値を受け取ってインストール・ロジックに引き渡すためのプロパティ (ユーザーが選択するインストール先フォルダや機能を示すプロパティなど)は、 public なプロパティである必要がある、ということは、もう覚えておいても良いでしょう。 プロパティを public なものにするためには、名前を全て大文字にする必要があります

まじか

WiX チュートリアル 日本語訳 Lesson 1 始めよう / 5. どこにインストールするか