ホーム » Windows » CSIDL_PROGRAM_FILES

CSIDL_PROGRAM_FILES

今までは 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(同じ)

SpFolder  B660 x64.exe


特に 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 の場所を誤る可能性がある.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.