InstallShield 2010でゼロから作成されたInstallScriptプロジェクトがあります。これには、特に、MSMファイルをラップする3つのネイティブInstallShieldオブジェクトと4つのInstallShieldマージモジュールホルダーオブジェクトが含まれています。
プロジェクトを最初にテストしたときは、クリーンな環境に正常にインストールされましたが、新しいバージョンにアップグレードしようとすると、4つのマージモジュールホルダーオブジェクトのそれぞれで「エラー1706。製品XXXXの有効なソースが見つかりません」というメッセージが表示されました。 。
ネットで調べてみたところ、これはWindowsインストーラーのエラーであり、元のインストールメディアがなくなった後でも、MSIファイルがマシン上に存在している必要があるために発生します。これを確認するための推奨される方法は、[マージモジュールホルダーオブジェクト]プロパティダイアログの[msiパッケージをローカルにキャッシュする]チェックボックスをオンにすることです。
4つのマージモジュールすべてについてそのボックスにチェックマークを付けて再テストしましたが、問題は解決しませんでした。次に、これらのマージモジュールが実際にハードディスクのどこに配置されているかを調べました。プロパティダイアログには、実行時に{ProductGUID}<DISK1TARGET>
に解決されると書かれています。テストマシンを見ると、4つのマージモジュールすべてが同じ場所に書き込んでいるように見え、それによって互いのMSIファイルが上書きされていました。C:\Program Files\InstallShield Installation Information\
これを回避するために、各マージモジュールを編集して、一意のパス<DISK1TARGET>\
{Name}にキャッシュしました。コンパイルして再度テストしたところ、各マージモジュールが実際に一意のサブフォルダーに保存されていることがわかります。ただし、アップグレードしても、4つのエラー1706メッセージすべてが引き続き表示されます。
誰かアイデアはありますか?明らかな何かが欠けていると確信していますが、それはどこにも文書化されていないようです。:-)
アップデート:
InstallShieldフォーラムの多くの投稿によると、InstallShieldは、InstallScriptプロジェクトをビルドするたびに、埋め込まれたMSIごとに新しい製品GUIDを生成するようです。更新プロセス中に、InstallShieldエンジンはターゲットマシンにキャッシュされた各MSIファイルを新しいバージョンで上書きしますが、それらを実行する場合、Windowsインストーラーは「これは新しい製品です。古い製品のMSIはどこにあるので、それをアンインストールできますか?」、したがってエラー。
ビルドごとに組み込みMSIごとに製品GUIDを再生成しないようにInstallShieldに指示することはできますか?確かに、この動作は、マージモジュールをInstallScriptプロジェクトに埋め込むというアイデア全体を嘲笑しますか?:-(