プログラムのアンインストールまたは変更の謎

ということで、インストールプログラムの挙動が変だと、コントロールパネルの「プログラムのアンインストールまたは変更」でインストールプログラムの順序で前のバージョンのエントリが残ったままになる。ということで調べてみた。

古い資料によると、レジストリHKEY_LOCAL_MACHINEの「SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall」のサブキーを列挙せい。とありますが、これがなんと出てるはずのサブキーが見当たらない。

レジストリエディタでごにょごにょするが、目的のエントリが見つからない。アプリケーションはWin32Apiの32bitアプリだ、ということで調べまくると、32bitはWOW64用のHKEY_LOCAL_MACHINE「SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall」に記録される。つまりレジストリエディタで見る場合は32bit(WOW64)と64bitを切り分けて考えないといけない。

そして、さてコードを書き始める。まずは、x86(32bit)ターゲットで動作環境がWOW64かをチェックして、確認した。上記二つのそれぞれのレジストリ領域を列挙するのだが?なぜか全く同じ列挙のデータが返ってくる?なぜだ?

そこで、x64でビルドしてみる、そしたら、WOW64を認識しない。はて?よく考えてみるとそうだ、ネィティブx64なんで、WOW64のサブシステムなどは必要ない、じゃ、64bitの場合はWOW64のチェックをスキップし、両方のレジストリを読みに行くと期待通りの列挙結果が出てきた。

じゃ?なぜ?x86環境だと、32bit 読んでも 64bit 読んでも、同じ列挙するのか?よーく考えてみたら、WOW64のサブシステムがAPIレベルで32bit読んでも、64bit読んでも同じ扱いにしたのかも?ということで、実行ビルドが32bit(x86)ならどっちを読んでも、同じ結果が返る。そして、実行ビルドが64bit(x64)なら両方を読みにいかなければダメだっていうこと、今回は32bit(x86)で仕上げるので、「SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall」のサブキーを列挙せい。ということで目的の動作は行ける感じである。しかし、64bit移植の時に、両方のレジストリを読まないと目的の結果が出せない。ということを覚えておいて、備忘録としておく、

Leave a Reply