none
x64マシン向けインストールパッケージ(*.msi)でレジストリをうまく参照できない RRS feed

  • 質問

  • 現在、x64マシン向けののインストールパッケージ(*.msiファイル)を作成しています。

    HKEY_LOCAL_MACHIN\SOFTWARE\xxx\配下のレジストリに書き込みを行い、
    他のインストールパッケージからこれを参照したいのですが、
    書き込みはHKEY_LOCAL_MACHIN\SOFTWARE\xxx\配下に行えるものの、
    参照時はHKEY_LOCAL_MACHIN\SOFTWARE\Wow6432Node\xxx\配下を
    見に行ってしまい困っています。

    インストールパッケージの作成には、Visual Studio 2005を使用し、
    プロジェクトのplatformプロパティにx64を指定していますが、
    これ以外にも64bit関連のプロパティがあるのでしょうか?

    2006年8月3日 13:31

回答

  • Visual Studio 2005 のみでの解決方法ではありませんが、
    解決方法が見つかりましたので、フィードバックいたします。

    Visual Studio 2005で作成した.msiファイルをOrcaなどで編集し、
    RegLocatorテーブルのTypeカラムにmsidbLocatorType64bitなるもの(0x010)を立てれば良いようです。

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/reglocator_table.asp

    Visual Studioの問題そのものは解決していませんが、一応の解決方法にたどり着きましたので、
    ひとまずこの質問は閉じさせていただきたいと思います。
    (もちろん、引き続き情報提供いただけるとありがたいですが。)

    中博俊さん、とっちゃんさんありがとうございました。

    2006年8月13日 14:28

すべての返信

  • 書き込みはHKEY_LOCAL_MACHIN\SOFTWARE\xxx\配下に行えるものの、
    参照時はHKEY_LOCAL_MACHIN\SOFTWARE\Wow6432Node\xxx\配下を

    書き込みもxxxに行っているように見えてWOWに書き込んでいるはずです。

    2006年8月3日 15:37
  • 早速の返信ありがとうございます。

    >書き込みもxxxに行っているように見えてWOWに書き込んでいるはずです。

    regeditでレジストリを確認してみましたが、書き込み時はWow6432Node\xxx\ではなく、
    SOFTWARE\xxx\に書かれていました。

    platformの指定をx64からx86に変更するとWow6432Node\xxx\に書かれて、これは予想通りの動きなのですが。。。

    参照時は、x64/x86に関係なく、Wow6432Node\xxx\を見に行ってしまうようで、
    x86で書き込んだレジストリ(Wow6432Node\xxx\)は、x64/x86に関係なく参照できるけど、
    x64で書き込んだレジストリ(SOFTWARE\xxx\)は、x64/x86に関係なく参照できないという状態です。

    せめて書き込みと参照で、SOFTWARE\xxx\ か Wow6432Node\xxx\ か統一されていれば、まだ良いのですが。

    引き続き、情報をお待ちしております。
    よろしくお願い致します。

    2006年8月3日 21:34
  • とっちゃんです。

    整理させてください。

    書き込みが、誰で、読み込みが誰か、可能な限り具体的に教えてください。

    書き込みは、msi のデータとして用意しているように読み取れますが、実際はどうかわかりませんし、他のインストールパッケージというのも気になります。

    また、使ってるかどうかも判りませんが、VSのカスタム動作を利用している場合は、本当に x64 で動いてるかどうか判らないというのもあります(これ、ドキュメントされてないから実際どうなってるのかさっぱり判りません...が、多分対応していないんじゃないかと...)。

    WindowsInstaller の世界はそうでなくても、通常のアプリケーション作成とは異なる次元に存在していますし、さらに msi の中の世界、MSIのカスタムアクションの世界、VSのカスタム動作の世界とさまざまな異なる次元の世界が存在しています。

    そのため 5W1H がはっきりしていないと、言及が難しいというのがあります。

    おそらく、そのあたりの錯綜が原因だと思いますが、この情報だけでははっきりしたことが判りません。

     

    2006年8月4日 2:47
  • とっちゃんさん、返信ありがとうございます。

    詳細な説明ができておらず、申し訳ありません。

    まず、インストール対象となるマシンはx64マシン(Windows 2003 Server)でローカルでmsiファイルを実行しています。
    また、実行しているユーザーはAdministrator権限を持つユーザーです。

    msiファイルは以下の2つを用意しています。

    • Writer.msi : レジストリ(HKEY_LOCAL_MACHIN\SOFTWARE\xxx\配下)に書き込みを行う。
    • Checker.msi : レジストリ(HKEY_LOCAL_MACHIN\SOFTWARE\xxx\配下)を参照し起動チェックを行う。

    Writer.msiは、Visual Studio2005のセットアッププロジェクトで、
    「レジストリ」-「対象コンピュータのレジストリ」でHKEY_LOCAL_MACHIN\SOFTWARE\xxx\配下に
    書き込みを行う設定を行っています。
    書き込むレジストリ情報はWriter.msiによるインストール先ディレクトリのパスです。

    Checker.msiは、同じくVisual Studio2005のセットアッププロジェクトで、
    「起動条件」-「対象コンピュータの必要条件」-「対象コンピュータの検索」-「レジストリ検索の追加」で
    HKEY_LOCAL_MACHIN\SOFTWARE\xxx\配下のレジストリ(Writer.msiで書き込んだもの)を検索し、
    「起動条件」-「対象コンピュータの必要条件」-「対象コンピュータの検索」-「起動条件」で
    検索したレジストリが存在するかどうかでインストーラの起動チェックを行っています。

    なお、Writer.msi、Checker.msiともに、カスタム動作は行っておりません。

    Writer.msi ⇒ Checker.msiの順に実行することで、Writer.msiで書き込まれたレジストリを
    Checker.msiで参照し、起動チェックを行うことができると考えていますが、うまくいっておりません。

    現象としては、Writer.msiによる書き込みは、HKEY_LOCAL_MACHIN\SOFTWARE\xxx\配下に行われるものの、
    Checker.msiによる参照ではHKEY_LOCAL_MACHIN\SOFTWARE\xxx\配下を見れていないというものです。
    なお、regeditを用いて、HKEY_LOCAL_MACHIN\SOFTWARE\Wow6432Node\xxx\配下にレジストリを書き込み、
    Checker.msiを実行するとこの情報を参照して動作することは確認できています。

    この現象の原因について心当たりのある方、些細な情報でも構いませんので教えてください。
    また、原因はわからなくても、同様の現象を経験したという情報でもありがたいです。

     

    2006年8月4日 13:09
  • その2つのセットアッププロジェクトのプラットフォームはどうなっていますか?
    2006年8月5日 12:55
  • 中博俊さん、再び返信ありがとうございます。

    セットアッププロジェクトのプラットフォームとは、ソリューション構成×ソリューションプラットフォームに応じて、
    各プロジェクト毎の構成とプラットフォームを選択できる画面での設定のことを言われているのだと思いますが、
    C#やVBのプロジェクトと異なり、セットアッププロジェクトではプラットフォームの選択ができないようです。

    通常、C#プロジェクトであれば、Win32、x86、Itanium、新規作成などが選べますが、「Default」があるのみで、
    新規作成することすらできません。

    また、メイン画面でのソリューションプラットフォームの選択についても、ソリューション内に
    セットアッププロジェクトしかない状態では、「Default」しか選択できないようです。

    期待を込めて、余分なC#プロジェクトを作成してみたところ、ソリューションプラットフォームはx64を指定できましたが、
    セットアッププロジェクトのプラットフォームは指定できないままであり、インストール時の結果も同じでした。

    なお、プロパティ画面で指定可能なplatformプロパティはx64を指定しています(Writer.msi、Checker.msiとも)。

    中博俊さんの環境では、セットアッププロジェクトでもプラットフォームの選択が可能なのでしょうか?
    もし、そうであれば、使用されているEditionなどを教えていただけないでしょうか?
    なお、私の環境はVisual Studio2005のTeam Edition for Software Testersです。
    (自分のEdition書くの忘れてましたね。すみません。)

    2006年8月5日 13:45
  • 本当は再現テストすればいいんでしょうが(^^;;

    セットアッププロジェクトのTargetPlatformにx86, x64, Itaniumがありますね。

    2006年8月5日 16:02
  • 中博俊さん、返信ありがとうございます。

    再現テストしていただければうれしいですが、64bitマシンを用意しないといけないので気軽には頼めませんね^^;

    で、自分の間違いを訂正します。
    >なお、プロパティ画面で指定可能なplatformプロパティはx64を指定しています(Writer.msi、Checker.msiとも)。
    platformプロパティでなくて、TargetPlatformプロパティでした。
    終始一貫して間違ってますね。
    すみません。

    と、いうわけで、
    >セットアッププロジェクトのTargetPlatformにx86, x64, Itaniumがありますね。
    こちらはx64を指定しておりました。

    今日は、英語のサイトを中心に情報漁って、同様の質問を見つけましたが、古い日付のまま、解決されてませんでした。
    そろそろ、別の手段でも考えないといけないかなと考えております。

    2006年8月7日 13:23
  • x64マシンは問題ないのですが、同じセットアップ環境を作るのは難しいと(^^;;

    自前のイベント処理をするようにして、そのプログラムをx64で動かすようにして・・・・

    ってやれば確実でしょうね

    2006年8月12日 2:19
  • 中博俊さん、返信ありがとうございます。

    現象の再現については、他の部署で試してもらって確認することができました(現在、100%再現)。
    もっとも、作り方があっているのか?という問題が残ったままなのですが。

    自前のイベントですか。
    カスタム動作は検討したのですが、Visual Studio 2005で作成したインストーラの動作は

    1. レジストリ等のの参照
    2. 起動チェック
    3. インストール(カスタム動作以外)
    4. インストール(カスタム動作)
    このような順序になってしまうようで、レジストリの情報は2,3で使用したいため、カスタム動作でも実現できなさそうなんです。
    もちろん、カスタム動作で全部やってしまうことは可能なんでしょうが、セットアッププロジェクトの意味ないですし。。。

    で、今はOrcaのような編集ツールで対処できないか調査してます。
    これもダメな場合はInstallShieldなどの他の作成ツールへ乗り換えることになりそうです。

    もちろん、OrcaもInstallShieldも使わずに、Visual Studioのみでできるのがベストなのですが。

    2006年8月12日 13:15
  • Visual Studio 2005 のみでの解決方法ではありませんが、
    解決方法が見つかりましたので、フィードバックいたします。

    Visual Studio 2005で作成した.msiファイルをOrcaなどで編集し、
    RegLocatorテーブルのTypeカラムにmsidbLocatorType64bitなるもの(0x010)を立てれば良いようです。

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/reglocator_table.asp

    Visual Studioの問題そのものは解決していませんが、一応の解決方法にたどり着きましたので、
    ひとまずこの質問は閉じさせていただきたいと思います。
    (もちろん、引き続き情報提供いただけるとありがたいですが。)

    中博俊さん、とっちゃんさんありがとうございました。

    2006年8月13日 14:28
  • とっちゃんです。

    #夏休み中に覗いてなかったらいつの間にか解決していた...(^^;

    RegLocator の問題は、おそらく VSセットアップが完全に64bit対応ができていないのではないかと思われます(VSセットアップに限らずちょっと古いと対応していないのがいくつか...w)。

    msi の 64bit 対応は、通常アプリケーションとは視点が逆で、x64 上であってもプライマリが x86 ベースになります(全情報でこうなっています)。

    そのため、64bit なアクセスを必要とする部分は随所にフラグを立てて、指定しなければならないという制約があります。

    きちんと下情報ではありませんが、おいらの Blog にこの辺をざっと調べたときのことを書いています。

    あと、英語になりますが、Windows Installer on 64-bit Platforms にも同じようなことが書いてあります(こっちのほうが少し詳しい)。

    どちらの記事も参考程度でしかありませんけどね(^^;

    2006年8月15日 3:07
  • とっちゃんさん、返信ありがとうございます。

    なるほど、Visual Studio以外でも、対応してないのがあるんですね。
    しかし、x64のmsiでもプライマリがx86ベースとは・・・予想外でした。
    x64マシン上でmsiexecは64bit動作してたので64bit側へのアクセスが標準だとばかり^^;

    とっちゃんさんのBlogは、調べてるときに見させていただいたのですが、
    Visual Stuidoの設定の問題だと考えていたため、半ば読み飛ばしてしまっていたようです。
    今、落ち着いて読めば、ヒント載ってましたね。(答えがわかっているからこそかもしれませんが。。。)

    ともあれ、参考情報程度であっても、こうした情報が公開されているというのは非常にありがたいです。
    特に、日本語の情報は。

    2006年8月15日 11:08
  • とっちゃんです。

     ネットクラゲ さんからの引用
    x64マシン上でmsiexecは64bit動作してたので64bit側へのアクセスが標準だとばかり^^;
    そうなんですよね。

    外から見える部分は 64bit なので判りづらいんです。でも内部のデータ(規定のシステムフォルダの各種依存情報などなど)は、殆どが x86 ベースを主軸にしているんですよ(多分互換性の問題)。

    そのため、Program Files フォルダの扱いも、標準のものは x86 をさしているなど、かなり細かい部分で注意点が必要です。

    本格的にインストーラを作りたいのであれば、ぜひ WindowsInstaller/WiX/InstallShield メーリングリスト にお越しください。

    VSのセットアップも含め、WindowsInstaller 関係なら何でもありでやってます。

    2006年8月16日 2:59
  •  とっちゃん さんからの引用

    本格的にインストーラを作りたいのであれば、ぜひ WindowsInstaller/WiX/InstallShield メーリングリスト にお越しください。

    VSのセットアップも含め、WindowsInstaller 関係なら何でもありでやってます。

    今のところ本格的にインストーラを作る予定はないですが、
    必要になってからじゃ遅いってことでML参加させていただきました。

    次にインストーラ作るときはVS以外も使ってみたいな、などと思いつつ。。

    2006年8月16日 10:27