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.
Respostas:
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
bin64
diretório dentro desse aplicativo. Mas isso imporia feiura permanente nos sistemas de 64 bits apenas para suportar aplicativos herdados.fonte
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.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!
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.
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
Programs
pasta?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 comFOLDERID_ProgramFiles
para recuperar o caminho correto).Tudo encontra seu lugar automaticamente e o padrão é idêntico a todos os aplicativos que você instala .
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.dll
e 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
CreateProcess
e 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!
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.
fonte
C:\Program Files\App32
eC:\Program Files\App64
?SHGetSpecialFolderPath
para determinar o local da instalação.%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.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
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\
ouSysWoW64\
). 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.exe
efoobar64.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.)fonte
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.
fonte
%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\32
e% programfiles% \ CoolApp \ bin \ 64`, por que as pastas de nível superior separadas?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:
fonte
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 Files
e, quando executado no modo de 32 bits, isso é alterado automaticamente para oC:\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.
fonte
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 sistema de 64 bits precisa "emular" aplicativos de 32 bits, e é por isso que o Windows precisa "segregar" duas pastas de Arquivos de Programas.
fonte
É 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:
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.
fonte
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
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
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.
Eu duvido. A maioria dos instaladores permite que você escolha uma pasta de instalação personalizada, portanto, não importa onde o programa é instalado.
fonte
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
fonte
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 usamCommonFiles
recursos 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.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 oWoW64
qual já é mencionado em várias respostas.fonte