web-dev-qa-db-ja.com

64ビットWindowsでの%ProgramFiles%の違い

コマンドプロンプトから、以下を取得します。

_>echo %ProgramFiles%
C:\Program Files
_

ただし、一部のアプリケーション(この例ではPHPですが、Apacheのhttpd.conf内から同じ動作を見てきました)は次のとおりです。

_>php -r "echo $_ENV['ProgramFiles'];"
C:\Program Files (x86)
_

どうしてこれなの?

背景:私は、ホストOSが32ビットまたは64ビットであることを認識しないスクリプトを開発しています。構成ファイルの場合、これはうまく機能します。 32ビットシステムでは、_%ProgramFiles%_は "C:\ Program Files"であり、64ビットシステムでは、同じ_%ProgramFiles%_はC:\Program Files (x86)を返すようです。 Windowsのコマンドプロンプト(またはエクスプローラーバーなど)から試しても同じことが当てはまらないのはなぜですか。 64ビットのコマンドプロンプトなどはありますか?

8
ken

64ビットWindowsで起動された32ビットアプリケーションがシステム環境変数%ProgramFiles%または%commonprogramfiles%をアドレス指定すると、WoW64サブシステムはこれらの変数の値を変数%ProgramFiles(x86)%および "% commonprogramfiles(x86)%。したがって、たとえば、32ビットプログラムからアドレス指定する場合、%ProgramFiles%は「C:\ Program Files(x86)」として開かれます。

この動作は、32ビットソフトウェアと64ビットオペレーティングシステムの下位互換性を提供するレジスタリダイレクトシステムによって決定されます。 32ビット環境は、アドレス指定しているデータが別の場所にあるにもかかわらず、32ビットプログラム用にエミュレートされています。

32ビットプログラムでのこのようなリダイレクトを回避するには、対応するレジスタノードにアクセスするときに、%programfiles%または%COMMONPROGRAMFILES%(つまり、逆の場合)環境変数またはKEY_WOW64_64KEYフラグを使用する必要があります。

12
justin0