Por que o Windows de 64 bits precisa de uma pasta separada "Arquivos de programas (x86)"?

178

Eu sei que em uma versão de 64 bits do Windows, a pasta "Arquivos de Programas" é para programas de 64 bits e a pasta "Arquivos de Programas (x86)" é para programas de 32 bits, mas por que isso é necessário?

Por "necessário", não quero dizer "por que a Microsoft não pode ter tomado outras decisões de design?" porque é claro que eles poderiam ter. Em vez disso, quero dizer, "por que, dado o design atual do Windows de 64 bits, os programas de 32 bits devem ter uma pasta de nível superior separada dos programas de 64 bits?" Em outras palavras, "o que daria errado se de alguma maneira eu evitasse o mecanismo de redirecionamento e forcei tudo a instalar de verdade C:\Program Files\?"

Existem muitas perguntas sobre o Superusuário e outros lugares que afirmam "uma é para programas de 32 bits, uma é para programas de 64 bits", mas nenhuma que eu possa encontrar fornece o motivo. Pela minha experiência, não parece importar se um programa de 32 bits está instalado no local correto ou não.

O Windows, de alguma forma, se apresenta de maneira diferente para um programa que está ficando sem "Arquivos de Programas (x86)"? Existe uma descrição que mostre exatamente o que é diferente para um programa instalado em "Arquivos de Programas (x86)" em vez de "Arquivos de Programas"? Eu acho improvável que a Microsoft introduza uma nova pasta sem uma razão técnica legítima.

Stephen Jennings
fonte
13
Em vez de responder sua pergunta, eu perguntaria - como você lida com \ arquivos de programas \ arquivos comuns?
sgmoore
8
Resposta de uma linha (e, portanto, um comentário): como você pode executar facilmente qualquer aplicativo de qualquer pasta sem conhecer sua arquitetura, claramente não há razão obrigatória para essa separação. É uma questão de conveniência oferecer suporte à instalação dupla de aplicativos com ambas as arquiteturas . Em alguns casos, faz diferença, pois não são necessariamente recompilações simples. O principal problema é que aplicativos de 32 bits não podem carregar dlls de 64 bits, portanto, não é possível instalar as duas versões no mesmo local. A outra alternativa é ter duas pastas "bin" para cada aplicativo.
Sklivvz
11
@ Synetech Eu até tinha programas instalados em (x86) apenas para ter binários x64 .. Às vezes é horrível.
precisa saber é o seguinte
10
Eu sempre me perguntei por que a Microsoft não colocou programas de 64 bits em um "Arquivos de Programas (x64)" em vez de * movendo" o 'legado' diretório Arquivos de Programas para Arquivos de Programas (x86)
LawrenceC
30
A verdadeira bagunça sobre a diferenciação de 64/32 bits é que / Windows / System32 contém conteúdo de 64 bits, enquanto / Windows / SysWOW64 contém o material de 32 bits ...
cutuque

Respostas:

92

Resposta curta: para garantir que aplicativos herdados de 32 bits continuem funcionando da mesma maneira que costumavam, sem impor regras feias aos aplicativos de 64 bits que criariam uma bagunça permanente.

Não é necessário. É apenas mais conveniente do que outras soluções possíveis, como exigir que cada aplicativo crie sua própria maneira de separar DLLs e executáveis ​​de 32 bits das DLLs e executáveis ​​de 64 bits.

O principal motivo é fazer com que aplicativos de 32 bits que nem sabem que existem sistemas de 64 bits "funcionem", mesmo que DLLs de 64 bits estejam instaladas nos locais em que os aplicativos possam parecer. Um aplicativo de 32 bits não poderá carregar uma DLL de 64 bits; portanto, era necessário um método para garantir que um aplicativo de 32 bits (que pode ser anterior aos sistemas de 64 bits e, portanto, não tenha idéia de arquivos de 64 bits) existe) não encontrou uma DLL de 64 bits, tentou carregá-la, falhou e, em seguida, gerou uma mensagem de erro.

A solução mais simples para isso é consistentemente separar diretórios. Realmente, a única alternativa é exigir que todo aplicativo de 64 bits "oculte" seus arquivos executáveis ​​em algum lugar que um aplicativo de 32 bits não seria exibido, como um bin64diretório dentro desse aplicativo. Mas isso imporia feiura permanente nos sistemas de 64 bits apenas para suportar aplicativos herdados.

David Schwartz
fonte
52
Eles não precisaram pular esses bastidores para permitir programas de 32 e 16 bits no mesmo sistema. Não me lembro de ter visto ProgramFiles (16)algo assim. Além disso, como exatamente um programa de 32 bits "encontraria uma DLL de 64 bits e tentaria carregá-la"? Quais programas andam à procura de DLLs aleatórias %programfiles%? Se for uma DLL compartilhada, será exibida no WinSxS; se não for compartilhado, cabe ao programador gerenciar suas próprias DLLs. A parte sobre isso ser feito como uma conveniência para os programadores é razoável.
21412 Synetech
30
O IIRC Win3.1 não tinha um diretório de arquivos de programa (ou a maioria dos aplicativos o ignorou); como resultado, não haveria nenhum aplicativo win16 herdado procurando coisas nos arquivos de programa para começar. Em vez disso, as bibliotecas compartilhadas do IIRC costumavam ser copiadas em algum lugar da própria pasta do Windows. O Win32 com windows \ system e windows \ system32 é um artefato disso.
Dan Neely
15
O Windows 3.1 não suporta nomes de arquivos longos, portanto, não seria capaz de ter uma pasta 'arquivos de programa'.
Darth Egrégio
14
@JarrodRoberson: Muito pelo contrário, é porque a Microsoft valoriza extremamente a compatibilidade com versões anteriores.
David Schwartz
24
@ Jarrod: Na verdade, como todo desenvolvedor sabe, a Microsoft valoriza muito a compatibilidade com versões anteriores . Literalmente, todas as APIs que possuem têm métodos herdados que se recusam a remover e, frequentemente, erros graves que se recusam a corrigir, porque têm medo de quebrar programas mais antigos que foram criados para essa API. O mesmo acontece com a maioria das APIs, mas não em qualquer lugar próximo da existente da Microsoft.
BlueRaja - Danny Pflughoeft
65

Ele permite que você instale as versões de 32 e 64 bits de um aplicativo sem que ele se sobrescreva.


Depois de analisar esta resposta e comentar o tópico no dia seguinte, percebo uma possível grande supervisão na minha resposta. Eu assumi falsamente um histórico de programação e, quando estava falando de você em meus comentários, não era o usuário, mas o programador.

Não trabalho para a Microsoft e não faço ideia do verdadeiro raciocínio por trás dessas pastas, mas acho que o motivo para ter essas pastas é tão óbvio que não tenho problema em argumentar.

Então, vamos dividir!

  1. Pastas são incríveis!

    Vamos concordar com alguma coisa. Pastas são ótimas! Não precisamos deles, temos nomes de arquivos possíveis suficientes para colocar todos os arquivos na raiz do seu disco rígido, então por que ter pastas?

    Bem, eles nos ajudam a encomendar nossas coisas. E encomendar coisas é ótimo. Isso nos ajuda a processar as coisas mais facilmente. Isso é especialmente útil ao trabalhar com uma máquina que requer estrutura.

  2. Separar dados e lógica é ótimo!

    Um paradigma frequentemente encontrado na programação é separar dados da lógica. Você quer uma parte que sabe como fazer algo e você quer outra parte você pode fazer algo com .

    Isso também é encontrado no sistema de arquivos.

    Temos pastas para aplicação (lógica) e pastas para nossos objetos de valor (dados):

    Lógica

    • %WINDIR%
    • %PROGRAMFILES%
    • %PROGRAMFILES(x86)%

    Dados

    • %PROGRAMDATA%
    • %HOMEDRIVE%%HOMEPATH%

    Portanto, parece que as pastas são incríveis e faz sentido colocar os programas em sua própria pequena pasta. Mas por que ter 2? Por que não deixar o instalador lidar com isso e colocar tudo em uma Programspasta?

  3. Instaladores não são mágicos

    Hoje, costumamos usar pequenos programas para instalar nossos programas maiores. Chamamos esses pequenos instaladores de programas .

    Instaladores não são mágicos. Eles precisam ser escritos por programadores e são aplicativos (com possíveis erros), como qualquer outro aplicativo existente. Então, vejamos a situação que um programador imaginário teria que enfrentar com e sem o sistema atual:

    1 pasta Arquivos de Programas

    O desenvolvedor mantém 2 instaladores. Um para a versão de 32 bits e outro para a versão de 64 bits de seu aplicativo. O instalador de 32 bits gravará C:\Program Files\App\e o instalador de 64 bits gravará C:\Program Files\App\sixtyfour\.

    2 pastas Arquivos de Programas

    O desenvolvedor mantém 1 instalador. O instalador sempre grava %PROGRAMFILES%e depende do sistema operacional para expandir o caminho adequadamente (na verdade, você não usa variáveis ​​de ambiente para esses casos, usaria SHGetKnownFolderPath com FOLDERID_ProgramFilespara recuperar o caminho correto).
    Tudo encontra seu lugar automaticamente e o padrão é idêntico a todos os aplicativos que você instala .

  4. Consistência faz sentido

    Quando você aprende algo, isso geralmente implica que um comportamento observado foi consistente. Caso contrário, não há realmente nada para observar e aprender.

    O mesmo vale para o nosso pequeno sistema de arquivos. Faz sentido sempre colocar as mesmas coisas nas mesmas pastas. Dessa forma, saberemos onde procurar quando procurarmos algo.

    O sistema de distinção de aplicativos 32/64 promove esse objetivo. Os aplicativos são separados em 2 locais para evitar conflitos de nomes, comportamento de carregamento binário e segurança (até certo ponto).

Eu ainda não entendi. Isso parece inútil

Você nunca deve esquecer uma coisa. As pessoas são incrivelmente estúpidas. Isso inclui usuários, superusuários e especialmente programadores.

É por isso que precisamos de coisas como o redirecionamento do sistema de arquivos para tornar nossos sistemas utilizáveis.

Os programadores simplesmente entram lá e tentam carregar C:\Windows\system32\awesome.dlle não se importam se estão rodando em um sistema de 32 ou 64 bits. Eles tentariam carregar a DLL de 64 bits e simplesmente travariam. Alguns programadores querem usar alguma DLL do Office, sem problemas, sabem onde encontrá-la! C:\Program Files\Microsoft\Office\14.0\wizards.dll... e outro acidente!

Todos esses pedidos pelo aplicativo de 32 bits são redirecionados para os correspondentes de 32 bits para evitar falhas no aplicativo.

Precisamos de alguns nomes de pastas fixos para construir esse sistema. Se não houver uma estrutura de pastas para suportar esse redirecionamento, como você fará isso funcionar?

Ok, agora entendi. Mas por que não usar C:\Program Files\x86\então?

Agora estamos ficando filosóficos ...

O que daria errado se de alguma forma evitasse o mecanismo de redirecionamento e obrigasse tudo a instalar o real C:\Program Files\?

Provavelmente nada (desde que outros aplicativos não dependam de um local fixo para esse aplicativo).

O mecanismo WOW64 se conecta CreateProcesse executará verificações mais sofisticadas (mais sofisticadas do que a verificação do nome da pasta do executável) na imagem executável para determinar se é de 32 ou 64 bits.

Sim, mas quero dizer, TODAS as aplicações!

  • O que aconteceria se eu colocar tanto diesel e gás no meu carro?
  • O que aconteceria se eu tentar usar tanto alternada e corrente contínua na mesma linha?
  • O que aconteceria se eu continuar tanto o meu gato e meu peixe no mesmo aquário?

Algumas perguntas não requerem respostas. Não é para ser feito, não faça. Não há nada a ser ganho aqui. A quantidade de problemas que essa mudança poderia causar sempre superará quaisquer possíveis benefícios que alguém possa ver nisso.

Der Hochstapler
fonte
3
Essa é a razão original? Eu não poderia simplesmente instalar o aplicativo C:\Program Files\App32e C:\Program Files\App64?
Stephen Jennings
4
@ StephenJennings: Mas isso exigiria que você tomasse a decisão manualmente. A maneira como agora funciona é que o processo é automático, porque o Windows sabe qual pasta fornecer quando um aplicativo chama SHGetSpecialFolderPathpara determinar o local da instalação.
Der Hochstapler
6
@ Synetech: Por que instalar em %PROGRAMFILES%primeiro lugar? Por que não colocar a versão de 32 bits na área de trabalho dos usuários e a de 64 bits na Lixeira? Só porque isso pode ser feito, não significa que é uma boa ideia. Desculpe, eu não sigo o seu raciocínio.
Der Hochstapler
4
@ Synetech: Sim, você deu um exemplo perfeitamente bom de como isso poderia ser feito. Outro exemplo perfeitamente bom de como isso pode ser feito é a maneira como está sendo feito no momento. Basta escrever um arquivo em% PROGRAMFILES% e ter certeza de que ele acabará na pasta correta. Verificar por si mesmo qual pasta é a correta é outra. Se você realmente não vê o benefício da abordagem anterior, não poderei convencê-lo. A questão era por que existem 2 pastas. Penso que a minha resposta é perfeitamente razoável a esse respeito.
Der Hochstapler
3
@OliverSalzburg, não exatamente. A questão é por que duas pastas são necessárias , e não por que existem . De fato, ele até ousou: por que isso é necessário? Você não explicou por que é necessário e o exemplo que eu dei (e até o seu próprio exemplo sarcástico) apenas mostra que não precisa ser feito da maneira que é.
21312 Synetech
14

TL; DR:

Resumindo, não, não é necessário ; eles poderiam ter usado uma única pasta e, não, o Windows não se apresenta de maneira diferente para um programa sendo executado de um local ou de outro.


Bem, todo mundo parece estar opinando sobre isso, então vou jogar meus 2 ¢. Outros já especulam sobre as razões por que motivo a Microsoft escolheu para criar pastas de nível superior separadas para versões de programas de 32 bits e 64 bits, então eu vou deixar essa parte (a melhor razão foi a explicação de David que é como um conveniência aos programadores). É claro que, mesmo assim, não aborda bem a questão direta, por que isso é necessário? , para o qual a resposta é presumivelmente: não é .

Em vez disso, abordarei o corpo principal da pergunta

O Windows, de alguma forma, se apresenta de maneira diferente para um programa que está ficando sem "Arquivos de Programas (x86)"?

Na verdade, não, mas a localização do programa pode afetar o comportamento, mas não da maneira que você pensaria.

Quando você executa um programa, o Windows configura um ambiente para executá-lo (quero dizer em termos de memória, endereçamento etc., não apenas variáveis ​​de ambiente). Esse ambiente depende do conteúdo do executável (os programas de 32 e 64 bits diferem internamente). Quando você executa um programa de 32 bits em um sistema de 64 bits, ele é executado no subsistema de 32 bits que emula um ambiente de 32 bits. Chama-se WoW64 (WoW64 significa Windows no Windows 64 bits ) e é semelhante à forma como os aplicativos de 16 bits seriam executados no XP usando o NTVDM .

Quando você executa um programa com ou sem privilégios de administrador, ele afeta a forma como é executado, mas o local não deve afetá-lo (embora existam alguns exemplos de dependência de local, como alguns drivers, por exemplo).

(Estou usando um computador diferente, por isso não posso confiar no histórico do navegador para voltar atrás, mas outro dia, ao responder a essa pergunta SU , acabei com essa pergunta SO, que me levou ao Google PROCESSOR_ARCHITEW6432, que levou a essa pergunta SO e publicação do blog da Microsoft .)

Em algum lugar ao longo do caminho, li um post sobre StackOverflow sobre como a variável ambiente %processor_architecutre% fornece resultados diferentes, dependendo de onde você executa o prompt de comando (tentarei encontrar a citação exata).

A resposta acabou sendo válida se a versão de 32 ou 64 bits do prompt de comando foi executada (ou seja, de System32\ou SysWoW64\). Em outras palavras, embora o local pareça afetar o comportamento do programa, é apenas porque existem versões diferentes do programa, não porque o Windows trata a pasta de uma maneira especial.

Isso faz sentido, porque o conteúdo do arquivo executável determina se é de 32 ou 64 bits, para que você possa colocar uma cópia de 32 e 64 bits do mesmo programa (por exemplo, foobar32.exee foobar64.exe) na mesma pasta e quando você executá-los, eles serão carregados corretamente (a versão de 64 bits será executada nativamente e a de 32 bits será executada na camada de emulação WoW64).

FreePascal permite que você instale as versões DOS e Windows e vão na mesma pasta: %programfiles%\FreePascal. Ele gerencia as diferentes arquiteturas, mantendo arquivos executáveis ( .exe, .sys, .dll, .ovr, etc.) em pastas separadas e compartilhar arquivos de recursos como imagens,-fonte arquivos, etc.) não há nenhuma razão técnica que isso não poderia também ser feito por 32 e Versões de 64 bits de um programa. Como David disse, é mais fácil para o programador se eles forem mantidos separados (por exemplo, usando variáveis ​​para fazer parecer que há apenas um conjunto de arquivos etc.)

Synetech
fonte
Vingança em baixa votação! Muahahaha! sigh
Synetech
Down-vote estranho: \. Entre bom explicar +1.
avirk
11

Outro motivo é que a maioria dos programas costumava usar variáveis ​​ambientais como% PROGRAMFILES% para apontar para onde o programa foi instalado. Para programas de 64 bits, ele vai para o local normal. Para programas de 32 bits, ele será redirecionado para a nova Program Files (x86)pasta.

Embora, pelo menos com o novo material .Net no Visual Studio, eles agora tenham a variável App.Local que elimina toda a necessidade disso.

Canadian Luke
fonte
4
Isso não explica isso. Quem exatamente está usando a variável de ambiente e por que se importaria se um programa é de 32 ou 64 bits?
Synetech
4
@ Synetech - O autor dos programas usa a variável de ambiente. Quanto ao motivo pelo qual ele se importaria, é devido a referências a dlls. Você não pode carregar uma dll de 32 bits em um processo de 64 bits e vice-versa.
Ramhound
11
E como fazer %programfiles%, %programfiles(x86)%ou %programw6432%fazer a diferença lá? Qualquer DLL compartilhada entra no diretório WinSxS único e qualquer DLL não compartilhada está lá com o executável. Isso só importaria se, por algum motivo, você tivesse as versões de 32 e 64 bits do mesmo programa instaladas e, mesmo assim, manteria as DLLs de 32 bits com o executável de 32 bits e a DLL de 64 bits com o executável de 64 bits. Você pode fazer o seguinte: %programfiles%\CoolApp\bin\32e% programfiles% \ CoolApp \ bin \ 64`, por que as pastas de nível superior separadas?
21412 Synetech
@Synetech Claro que sim; % programfiles% já existe há algum tempo. Se você instalar um programa de 32 bits em um computador de 64 bits, ter um local causaria problemas para esse aplicativo de 32 bits. No entanto, o WoW pode redirecionar% programfile% para a versão (x86) para aplicativos de 32 bits e a versão não-x86 para 64. #
AndyMay
eu acho que as pessoas não seriam tão confusas, se não houve redirecionamento implícita
kommradHomer
8

A solução da Microsoft para essa transição de 32 bits para 64 bits foi adicionar suporte legado à maioria dos aplicativos de 32 bits. Em outras palavras, a maioria dos aplicativos de 32 bits funcionará no ambiente operacional de 64 bits. Lembre-se de que outros sistemas operacionais que operam em uma arquitetura de 64 bits não podem carregar ou executar aplicativos de 32 bits.

Para ajudar a facilitar a transição, a Microsoft designou que todos os aplicativos de 32 bits devem, por padrão, ser carregados na pasta Arquivos de Programas (x86), em vez de serem misturados aos aplicativos de 64 bits verdadeiros na pasta Arquivos de Programas regulares.

Fonte

"o que daria errado se de alguma forma evitasse o mecanismo de redirecionamento e obrigasse tudo a instalar no C: \ Arquivos de Programas \ real?"

Nada. Os dois diretórios de programa são apenas para organização ou para manter os programas que possuem duas versões, uma versão de 32 e 64 bits, como o Internet Explorer. Mas você pode instalar um programa de 32 bits em "Arquivos de Programas" e um programa de 64 bits em "Arquivos de Programas x86" e nada acontecerá, o programa será executado da mesma forma.

O Wiki diz:

Alguns instaladores de aplicativos rejeitam espaços no local do caminho da instalação. Para sistemas de 32 bits, o nome abreviado da pasta Arquivos de Programa é Progra ~ 1 . Para sistemas de 64 bits, o nome abreviado da pasta Arquivos de Programas de 64 bits é Progra ~ 1 (o mesmo que em sistemas de 32 bits); enquanto o nome abreviado da pasta Arquivos de programas de 32 bits (x86) agora é Progra ~ 2 .

avirk
fonte
11
Ele Ele. Bom artigo. Os comentários a esse artigo são exatamente iguais aos aqui. Pior ainda, esse artigo era de mais de dois anos atrás, o que apenas mostra que esta pergunta não é nova e se ainda não pode ser respondida com autoridade, acho que nunca será (a menos que alguém da equipe do Windows faça uma pausa). Bem, suponho que todos devemos parar de se preocupar e aprender a amar a bomba, quero viver com ela. +1 por apontar o artigo e mostrar que esta pergunta existe há tanto tempo.
21412 Synetech
11
@Synetech thanks! Sim, a ideia por trás da colocação do link do artigo é a mesma que você obteve. Esta é uma pergunta muito antiga, mas IDK por que as pessoas ainda não a conseguiram. No entanto, o MS deveria escrever um KB ou Documentação para este problema :)
avirk
Sim, eles deveriam, especialmente porque não são apenas os desenvolvedores que perguntam, mesmo os usuários normais se perguntam sobre isso. Infelizmente, a documentação da Microsoft nem sempre é boa.
22412 Synetech
@Synetech yup! A documentação do MS é uma droga na maioria das vezes. Mas sim, eles têm escreveu alguns artigos bons também e eu tenho certeza que eles são contáveis;)
avirk
6

O motivo é facilitar a atualização de um programa para 64 bits para os desenvolvedores. Eles não precisam escrever nenhum código personalizado para verificar o programa em um diretório ao compilar no modo de 32 bits e em outro diretório ao compilar no modo de 64 bits; eles apenas verificam C:\Program Filese, quando executado no modo de 32 bits, isso é alterado automaticamente para o C:\Program Files (x86)Windows de 64 bits. Da mesma forma, as entradas do registro são isoladas entre programas de 32 e 64 bits.

Isso evita conflitos de desenvolvedores desconhecidos que mudam seu modo de compilação para 64 bits sem pensar muito nele e evita uma enorme quantidade de trabalho para desenvolvedores que desejam que os usuários possam instalar as versões de 32 e 64 bits de seus software simultaneamente.


Mas por que algum programa desejaria permitir que ambas as versões fossem instaladas simultaneamente? Um exemplo: o Photoshop e o IE têm extensões nativas .dll. Você não pode ter o código de 32 e 64 bits misturado no mesmo processo, portanto, um complemento para a versão de 32 bits não pode ser usado com a versão de 64 bits e vice-versa. Assim, o Photoshop / IE precisa permitir a instalação de ambas as versões ou correr o risco de quebrar sua enorme base de complementos existentes.

BlueRaja - Danny Pflughoeft
fonte
2
+1 Pelo menos você abordou a questão subjacente de por que os usuários médios teriam ambas as versões.
Synetech
5

Os programas executados em "Arquivos de Programas (x86)" usam o subsistema WOW64 (Windows de 32 bits no Windows de 64 bits é um conjunto de drivers e APIs destinados a executar aplicativos x32 em um sistema de arquitetura x64):

O subsistema WoW64 compreende uma camada de compatibilidade leve que possui interfaces semelhantes em todas as versões de 64 bits do Windows. O objetivo é criar um ambiente de 32 bits que forneça as interfaces necessárias para executar aplicativos Windows de 32 bits não modificados em um sistema de 64 bits. Tecnicamente, o WoW64 é implementado usando três bibliotecas de vínculo dinâmico (DLLs):

  • Wow64.dll, a interface principal do kernel do Windows NT que converte entre chamadas de 32 e 64 bits, incluindo manipulações de ponteiro e pilha de chamadas
  • Wow64win.dll, que fornece os pontos de entrada apropriados para aplicativos de 32 bits
  • Wow64cpu.dll, que cuida de alternar o processador do modo de 32 bits para o modo de 64 bits

O sistema de 64 bits precisa "emular" aplicativos de 32 bits, e é por isso que o Windows precisa "segregar" duas pastas de Arquivos de Programas.

Diogo
fonte
7
Mas por que tem que colocá-lo em pastas diferentes? O Windows já é totalmente capaz de determinar a arquitetura de um executável observando o cabeçalho do PE. Por que ele não pode carregar o ambiente apropriado ao carregar o executável?
Synetech
11
Eu acho que é apenas uma opção da Microsoft para mostrar facilmente aos usuários qual arquitetura eles querem da versão de dois programas ao abrir um programa. Quero dizer, se não houvesse essas duas pastas e se fosse transparente para os usuários (se alternasse automaticamente), eles não saberiam se executavam um aplicativo de 32 ou 64 bits, mesmo assim, não saberiam qual programa abrir se em execução em 64 bits ..
Diogo
11
A versão de 64 bits do IE tem uma reputação de ser terrível.
Samuel Edwin Ward
11
A Microsoft recomenda o uso do office32, a menos que você esteja trabalhando com conjuntos de dados grandes o suficiente para exceder as restrições de memória. Eu acredito na necessidade de recompilar addons binários para trabalhar com o office64; combinado com a ausência de benefícios em casos de uso normais, está por trás da decisão.
Dan Neely
11
Acho que você descobrirá que um programa de 64 bits instalado explicitamente na pasta Arquivos de Programas (x86) funcionará perfeitamente normalmente (e, na maioria dos casos, vice-versa). O Windows não usa o local da pasta para determinar como tratar o executável.
Harry Johnston
5

É interessante que as respostas aqui e na Internet variem bastante. Encontrar uma resposta precisa para esta importante questão tem sido um desafio. Parece haver muita informação falsa apresentada na internet, causando confusão.

Realizei uma quantidade significativa de pesquisas e tirei a seguinte conclusão, que acredito ser precisa:

  • Não faz diferença onde um aplicativo está armazenado. No tempo de execução, o Windows determinará se o aplicativo é de 32 ou 64 bits e usará automaticamente a seção apropriada de DLL e registro.

Isso acontece automaticamente e é independente de onde o aplicativo está armazenado. Não há velocidade, confiabilidade ou outro benefício funcional em ter pastas separadas de 32 e 64 bits.

O único motivo da separação padrão em duas pastas ('Arquivos de Programas' e 'Arquivos de Programas (x86)') é que, se você tiver duas versões do mesmo programa (uma versão de 32 e 64 bits), ele fornecerá um maneira simples de manter os arquivos sobrepostos separados. Mesmo nesse caso, desde que todos os nomes de arquivos sejam exclusivos, eles poderiam realmente existir na mesma pasta, sem conseqüências.

Há uma ressalva à conclusão acima, e essa é uma das aplicações mal codificadas. Se um aplicativo tiver algum caminho codificado nele, ele somente o usará. Como regra, os caminhos nunca devem ser codificados em um aplicativo, mas ocasionalmente um programador cometerá esse erro. Nesse caso, o programa usará o caminho codificado; o diretório em que o aplicativo está instalado não afetará onde ele realmente procura arquivos.

RockPaperLizard
fonte
3

A necessidade de separar as pastas permite manter os aplicativos nativos de 64 bits e os que exigem o WoW64 separados.

Isso pode ser útil - como o @OliverSalzburg já apontou - se você deseja instalar os navegadores de 64 e 32 bits (por exemplo), pois alguns plug-ins e complementos podem estar disponíveis apenas para um dos os dois.

Ter que separar pastas torna essa separação automática , usando técnicas como o redirecionamento do registro .

Suponha que um instalador tente determinar a pasta dos arquivos de programa lendo o registro usando, por exemplo, RegQueryValueEx .

De qualquer forma, ele tenta ler a chave do registro

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

que normalmente aponta para C:\Program Files.

No entanto, se o instalador for um aplicativo de 32 bits, o redirecionamento do registro causará a chave de registro

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

para ser lido, o que normalmente aponta para C:\Program Files (x86).

O motivo pelo qual esses nomes de pastas específicos foram usados ​​somente pode ser respondido pelas pessoas que fizeram essa escolha. Você sempre pode alterar os nomes das pastas padrão, se desejar.

O Windows, de alguma forma, se apresenta de maneira diferente para um programa que está ficando sem "Arquivos de Programas (x86)"?

Eu duvido. A maioria dos instaladores permite que você escolha uma pasta de instalação personalizada, portanto, não importa onde o programa é instalado.

Dennis
fonte
Desculpe eu misturei "autorização" com a "proibir"
Wernfried Domscheit
3

Não acredito na confusão aqui ... primeiro, sou desenvolvedor em tempo integral.

A Microsoft fez isso para resolver o caso em que uma DLL é usada pelos aplicativos mais antigos de 32 bits e pelos aplicativos mais recentes de 64 bits. O método mais antigo não pôde ser alterado (System32, Arquivos de Programas, etc.) porque isso quebraria os programas mais antigos que não podem ser recompilados.

Assim, a MS criou uma pasta para armazenar programas, assemblies e bibliotecas específicos de 64 bits, para que novos programas pudessem se conectar às bibliotecas apropriadas, e programas mais antigos continuariam funcionando normalmente.

Tal como está, as DLLs .Net podem coexistir com outras versões na mesma máquina. Por exemplo, você pode ter Library.1.0.1, Library.1.0.2, Library 1.1.0, etc. E isso é apenas para um tamanho de bit específico (32 ou 64). Se pastas separadas não forem usadas, todo assembly precisará ter uma versão de 32 e 64 bits. Isso iria desorganizar seriamente um diretório que já contém várias versões do mesmo assembly.

Isso é tudo para desenvolvedores. Como usuário, só tenho que lidar com isso quando estou trabalhando com um programa de 32 bits no Windows 7 64. E prefiro ter a capacidade de executar uma versão de 32 bits e o mesmo aplicativo também em 64 bits. Quando estou trabalhando em um aplicativo de 32 bits que preciso compilar em 64 bits, tudo o que faço é pedir ao compilador para fazer isso. Nomes de DLL e tudo o resto permanece o mesmo.

A razão pela qual isso não existia no Windows 95/98 é que esses sistemas simularam um tempo de execução de 32 bits; não era um sistema operacional genuíno de 32 bits. Falsificou a execução de 32 bits com algo chamado "thunking".

Aqui está uma boa definição: http://searchwinit.techtarget.com/definition/thunk

Jason Locke
fonte
11
Como é que ProgramFiles(x86)` avoid clutter? There are still both 32- and 64-bit versions of files, so avoiding clutter doesn't make sense. There is no difference between putting them in \ 32 \ blah` ou \blah\32; de qualquer maneira, eles são separados. De qualquer forma, a maneira atual separa os componentes do aplicativo (e também os duplica desnecessariamente, já que poucos aplicativos usam CommonFilesrecursos e coisas assim. Além disso, você faz parecer que os aplicativos estão despejando suas DLLs em um intervalo comum. É fácil o suficiente manter os aplicativos de um aplicativo. DLLs de 32 bits com os seus 32 bits exes e é DLLs de 64 bits com ele é de 64 bits exes.
Synetech
Ah, e quanto ao 95/98, quem disse algo sobre isso? Até o XP tinha um subsistema de 16 bits (o NTVDM).
Synetech
Eu pensei que você queria uma explicação. Poucos aplicativos usam CommonFiles? Eu tenho 35 aplicativos diferentes que têm entradas lá. É um local mais seguro para armazenar componentes compartilhados que o diretório System32. Sua declaração de que poucos aplicativos usam isso é discutível. Citando você: "Eles não precisaram pular essas etapas para permitir programas de 32 e 16 bits no mesmo sistema. Não me lembro de ter visto um ProgramFiles (16) ou algo parecido [...] A parte sobre isso ser feita como uma conveniência para os programadores é razoável ". Bem, sim .. programadores fazem. Afinal, escrevemos os aplicativos.
Jason Locke
Hein?
Synetech
Basta reler isso. Ele disse isso melhor em suas respostas - superuser.com/a/442253/142951 . Se você não é um desenvolvedor, pode não ver o objetivo.
Jason Locke
0

Não é necessário. Por exemplo, no meu computador de trabalho, instalo cada aplicativo na pasta C:\MyPrograms\para separá-los dos aplicativos instalados pelo nosso departamento de TI.

Obviamente, isso me impede de instalar as duas versões (32 e 64 bits) de um aplicativo, mas isso não é problema no meu caso.

Sempre que você inicia um programa, sempre a primeira DLL C:\Windows\System32\ntdll.dllé executada. Essa DLL determina se o seu programa é um aplicativo de 32 ou 64 bits. Dependendo disso, você será redirecionado para o WoW64qual já é mencionado em várias respostas.

Wernfried Domscheit
fonte