Разница%ProgramFiles% в 64-битной Windows

Из командной строки я получаю следующее:

>echo %ProgramFiles%
C:\Program Files

Однако в некоторых приложениях (в данном случае PHP, хотя я видел такое же поведение в httpd.conf Apache), это:

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

Почему это?

Справочная информация: я разрабатываю сценарии, которые не зависят от операционной системы хоста 32-битной или 64-битной, и для файлов конфигурации это прекрасно работает. В 32-битной системе %ProgramFiles% это "C:\Program Files", и на 64-битной системе то же самое %ProgramFiles% казалось бы, возвращается C:\Program Files (x86), Мне просто любопытно, почему то же самое не выполняется, когда я пытаюсь сделать это из командной строки Windows (или в панели обозревателя и т. Д.). Есть 64-битная командная строка или что-то?

1 ответ

Решение

Когда 32-битное приложение, запущенное в 64-битной Windows, обращается к системным переменным среды% ProgramFiles% или% commonprogramfiles%, подсистема WoW64 заменяет значения этих переменных значениями переменных%ProgramFiles(x86)% и "%commonprogramfiles(x86)%. Таким образом, например, %ProgramFiles% будет открыт как "C:\Program Files (x86)" при обращении из 32-битной программы.

Это поведение определяется системой перенаправления регистров, которая обеспечивает обратную совместимость 32-разрядного программного обеспечения с 64-разрядными операционными системами. 32-битная среда эмулируется для 32-битных программ, даже несмотря на то, что данные, к которым они обращаются, расположены в другом месте.

Чтобы избежать такого перенаправления в 32-битной программе, вы должны использовать переменные окружения% programfiles% или%COMMONPROGRAMFILES% (т.е. с обратным регистром) или флаг KEY_WOW64_64KEY при доступе к соответствующим узлам регистра.

Другие вопросы по тегам