Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

Windows Installer & InstallShield はまり道

  • 「InstallShield公認ガイドブック」 (ASIN:475614425X) は必須! もしくは英語の勉強をすること。
  • 遅延実行されるカスタムアクションでは、殆んどのプロパティの読み出しが行えない。*1 そのようなカスタムアクションでは「カスタムアクションに値を渡すためのカスタムアクション」を別途作成して即時実行し、読み出す側は CustomActionData プロパティから値を読み出す。
  • UIシーケンスから実行シーケンスに渡されるパブリックプロパティは、そのままではカスタムアクションからアクセスできない。カスタムアクションに渡す必要のあるプロパティの名前を SecureCustomProperties プロパティにセミコロンで区切って列挙する必要がある *2 *3
  • 遅延実行シーケンスで実行されるカスタムアクションは、MSI を実行したユーザの権限で実行されるため、Windows Vista では多くの場合実行に失敗する *4。対策としては「遅延実行」の代わりに「システムの設定で遅延実行」(deferred execution in system context) を指定する *5ロールバックについても同様。
  • InstallScript のビルトイン関数 StrGetTokens で先頭にデリミタ文字のある文字列を tokenize すると、戻り値の配列の先頭に2番目の文字列を挿入して返す(先頭の空文字列からなるトークンを無視する)*6。対策としては、順序が自由になるのなら先頭に空文字列が来ないようにトークンを入れ替える。そうでない場合は、文字列の先頭がデリミタであるか判定して処理を分岐する。
  • InstallShield では、コンポーネントのインストール先を表す文字列として任意のプロパティを使用することができない。あらかじめディレクトリ構成が分かっている *7 場所にしかインストールすることができない。ファイルやレジストリから読んできたパスにファイルをインストールするのはだいぶややこしいので、できれば避けること。
  • InstallShield 12 には GUI から RemoveFile テーブルを操作する方法がない。このテーブルを使って任意のファイルやディレクトリを削除したい場合、ダイレクトエディタを使用する必要がある。
  • InstallShield 12 の MSI デバッガには「一部のアクションの実行条件が無視される」「ブレークポイントを指定した箇所で停止しない」「ブレークポイントを指定していない箇所で停止する」といった妙な挙動がある模様(再現条件は不明)。
  • Windows 2000 日本語版の上で InstallShield 2008 を実行すると、製品を登録する際に表示されるダイアログで文字が一切表示されないことがある。
  • InstallShield 2008 では、インターネットへの接続にプロキシを介する必要がある場合、オンラインでのユーザ登録が行えない。ベンダーからの回答は「メールで登録番号を受け取ってくれ」とのことで、回避方法はない模様。
  • InstallShield の提供するマージモジュールでは、CLSID や TypeLib の内容を Registory テーブルか何かで設定しようとするため、「Windows Vista 品質保証スイート」等の ICE による検証では必ず warning が出る。
  • InstallShield 12 では、Directory テーブルに矛盾のあるプロジェクトを作成して*8保存した後に開くと InstallShield が異常終了し、修正が行えなくなることがある。

*1:http://msdn2.microsoft.com/en-us/library/aa370543.aspx

*2:http://msdn2.microsoft.com/en-us/library/aa371571(VS.85).aspx

*3:カスタムアクションで呼び出される処理にセキュリティホールがあった際に、プロパティから値を読み出されないための仕様と思われる

*4:Windows Vita の UAC 環境下では、管理者権限を持つユーザは常に root として操作を行っているわけではない。必要になった段階で初めてダイアログが表示され、管理者権限が有効になる。自動で sudo が起動するようなもの

*5:これにより http://msdn2.microsoft.com/en-us/library/aa368069(VS.85).aspx の msidbCustomActionTypeNoImpersonate ビットが有効になる。http://sklave.jp/2007/200710230211 も参照

*6:http://helpnet.macrovision.com/robo/projects/devstudio9helplangref/LangrefStrGetTokens.htm

*7:Directory テーブルに載せられる

*8:ダイレクトエディタで Directoryj テーブルを編集する