今までは 32bit.exe が多かったが,徐々に 64 ビット化していくので,それで問題になりそうな部分を整理.
以前にも同じようなことを調べていたが,::SHGetFolderPath などで CSIDL を指定しての取得.
インストールしたものすべてが CSIDL_PROGRAM_FILES になれば良いが,しばらく時間がかかる.
デバッグ時の環境は,バージョンごとに切替できる様にしているが,βテストなどでは ProgramFiles に入れている.
SpFolder.exe を使って確認してみたところ,32bit.exe と 64bit.exe で返ってくるパスが異なることを再確認.
| exe の種類 | CSIDL_PROGRAM_FILES | CSIDL_PROGRAM_FILESX86 |
|---|---|---|
| 64bit exe | C:\Program Files | C:\Program Files (x86) |
| 32bit exe(64bit OS) | C:\Program Files (x86) | C:\Program Files (x86) |
| 32bit exe(32bit OS) | C:\Program Files | C:\Program Files(同じ) |

特に CSIDL_PROGRAM_FILES は「プロセスのビット数に依存する」ため,混在環境では注意が必要になる.
64bit exe は WOW64 の影響を受けないので Program Files を返すが,
32bit exe は 64bit OS 上では自動的に Program Files (x86) が返される.
この挙動は昔から変わらないが,32bit/64bit の両方を扱うアプリでは意図しない動作につながることがある.
また CSIDL_PROGRAM_FILESX86 は 64bit exe でも 32bit exe でも同じ値を返すため,
x86 側を明示的に取得したい場合に使うのが正しい.
逆に,64bit exe から x86 側を参照してしまうと,設定ファイルや DLL の場所を誤る可能性がある.