今までは 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 は Program Files を返し,32bit exe は 64bit OS では Program Files (x86) を返すという違いがある.
この挙動は昔から変わらないが,32bit/64bit の両方を扱うアプリでは意図しない動作につながることがある.
また CSIDL_PROGRAM_FILESX86 は 32bit/64bit exe どちらでも同じ x86 側を返す仕様になっている.
逆に,64bit exe から x86 側を参照してしまうと,設定ファイルや DLL の場所を誤る可能性がある.
0 of 0 people say this 投稿 is useful.