% ProgramFiles% diferenças no Windows de 64 bits

7

Em um prompt de comando, recebo o seguinte:

>echo %ProgramFiles%
C:\Program Files

No entanto, algumas aplicações (PHP neste exemplo, embora eu tenha visto o mesmo comportamento de dentro do httpd.conf do Apache), é:

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

Por que isso acontece?

Antecedentes: Estou desenvolvendo scripts que são agnósticos do sistema operacional host sendo 32 bits ou 64 bits, e para arquivos de configuração isso funciona muito bem. Em um sistema de 32 bits, %ProgramFiles% é "C: \ Program Files" e, em um sistema de 64 bits, esse mesmo %ProgramFiles% aparentemente retorna C:\Program Files (x86) . Eu só estou curioso porque o mesmo não se aplica quando eu tento a partir do prompt de comando do Windows (ou na barra de explorador, etc.). Existe um prompt de comando de 64 bits ou algo assim?

    
por ken 01.08.2012 / 17:07

1 resposta

10

Quando um aplicativo de 32 bits iniciado em um Windows de 64 bits aborda as variáveis de ambiente do sistema% ProgramFiles% ou% commonprogramfiles%, o subsistema WoW64 substitui os valores dessas variáveis pelos valores das variáveis% ProgramFiles (x86)% e "% commonprogramfiles (x86)%. Assim, por exemplo,% ProgramFiles% será aberto como" C: \ Arquivos de Programas (x86) "ao endereçar de um programa de 32 bits.

Esse comportamento é determinado pelo sistema de redirecionamento de registro que fornece compatibilidade com versões anteriores do software de 32 bits com sistemas operacionais de 64 bits. O ambiente de 32 bits é emulado para programas de 32 bits, mesmo que os dados que eles estão endereçando estejam localizados em um local diferente.

Para evitar tal redirecionamento em um programa de 32 bits, você deve usar as variáveis de ambiente% programfiles% ou% COMMONPROGRAMFILES% (ou seja, com caso inverso) ou o sinalizador KEY_WOW64_64KEY ao acessar os nós de registradores correspondentes.

    
por 01.08.2012 / 17:12