64 비트 Windows에서 % ProgramFiles %의 차이점 $_ENV[‘ProgramFiles’];” C:\Program Files (x86) 왜

명령 프롬프트에서 다음을 얻습니다.

>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 비트 명령 프롬프트 또는 다른 것이 있습니까?



답변

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 플래그를 사용해야합니다.