Perché Windows a 64 bit richiede una cartella "Programmi (x86)" separata?


178

So che su una versione a 64 bit di Windows la cartella "Programmi" è per programmi a 64 bit e la cartella "Programmi (x86)" è per programmi a 32 bit, ma perché è necessario?

Per "necessario", non intendo "perché Microsoft non avrebbe potuto prendere altre decisioni di progettazione?" perché ovviamente avrebbero potuto. Piuttosto, intendo "perché, dato l'attuale progetto di Windows a 64 bit, i programmi a 32 bit devono avere una cartella di livello superiore separata dai programmi a 64 bit?" Detto in altro modo, "cosa potrebbe andare storto se in qualche modo evitassi il meccanismo di reindirizzamento e costringessi a installare tutto sul reale C:\Program Files\?"

Ci sono molte domande su Super User e altrove che affermano che "uno è per programmi a 32 bit, uno è per programmi a 64 bit", ma nessuno che riesco a trovare spiega il motivo. Dalla mia esperienza, non sembra importare se un programma a 32 bit è installato nel posto giusto o meno.

Windows si presenta in qualche modo in modo diverso a un programma che si esaurisce "Programmi (x86)"? Esiste una descrizione che mostra esattamente ciò che è diverso per un programma installato in "Programmi (x86)" invece di "Programmi"? Penso che sia improbabile che Microsoft introduca una nuova cartella senza un motivo tecnico legittimo.


13
Invece di rispondere alla tua domanda, vorrei chiedere: come gestiresti \ programmi \ file comuni?
sgmoore,

8
Risposta con una sola riga (e quindi un commento): poiché puoi facilmente eseguire qualsiasi applicazione da qualsiasi cartella senza conoscerne l'architettura, quindi non c'è chiaramente alcun motivo obbligatorio per questa separazione. È una questione di convenienza supportare doppie installazioni di applicazioni con entrambe le architetture . In alcuni casi fa la differenza in quanto non sono necessariamente semplici ricompilazioni. Il problema principale è che le app a 32 bit non possono caricare dll a 64 bit, quindi in genere non è possibile installare entrambe le versioni nello stesso posto. L'altra alternativa è avere due cartelle "bin" per ogni applicazione.
Sklivvz,

1
@Synetech Ho anche avuto programmi di installazione in (x86) solo per avere binari x64 .. A volte è orribile.
sinni800,

10
Mi sono sempre chiesto perché Microsoft non ha inserito i programmi a 64 bit in un "Program Files (x64)" invece di * spostare "la directory" legacy "di Program Files in Program Files (x86)
LawrenceC,

30
Il vero caos sulla differenziazione a 64/32 bit è che / Windows / System32 contiene contenuto a 64 bit, mentre / Windows / SysWOW64 contiene roba a 32 bit ...
colpire il

Risposte:


92

Risposta breve: per garantire che le applicazioni legacy a 32 bit continuino a funzionare come prima senza imporre regole brutte alle applicazioni a 64 bit che avrebbero creato un pasticcio permanente.

Non è necessario. È solo più conveniente di altre possibili soluzioni come richiedere ad ogni applicazione di creare il proprio modo di separare DLL ed eseguibili a 32 bit da DLL ed eseguibili a 64 bit.

Il motivo principale è che le applicazioni a 32 bit che non sanno nemmeno che esistono sistemi a 64 bit "funzionano", anche se le DLL a 64 bit sono installate in punti in cui potrebbero apparire le applicazioni. Un'applicazione a 32 bit non sarà in grado di caricare una DLL a 64 bit, quindi era necessario un metodo per garantire che un'applicazione a 32 bit (che potesse precedere i sistemi a 64 bit e quindi non avesse idea di file a 64 bit esiste anche) non trova una DLL a 64 bit, prova a caricarla, non riesce e quindi genera un messaggio di errore.

La soluzione più semplice a questa è directory costantemente separate. In realtà l'unica alternativa è richiedere che ogni applicazione a 64 bit "nasconda" i suoi file eseguibili da qualche parte che un'applicazione a 32 bit non apparirebbe, come una bin64directory all'interno di quell'applicazione. Ma ciò imporrebbe bruttezza permanente sui sistemi a 64 bit solo per supportare applicazioni legacy.


52
Non hanno dovuto saltare attraverso questi cerchi per consentire programmi a 32 e 16 bit sullo stesso sistema. Non ricordo di aver mai visto uno ProgramFiles (16)o alcuni di questi. Inoltre, come esattamente un programma a 32 bit "trova una DLL a 64 bit e prova a caricarla"? In quali programmi vanno in giro alla ricerca di DLL casuali %programfiles%? Se è una DLL condivisa, va in WinSxS; se non è condiviso, spetta al programmatore gestire le proprie DLL. La parte su ciò è stata fatta per comodità dei programmatori, tuttavia.
Synetech,

30
IIRC Win3.1 non aveva una directory dei file di programma (o la maggior parte delle app la ignorava); di conseguenza non ci sarebbero app legacy per win16 che cercassero roba nei file di programma. Invece le librerie condivise IIRC venivano spesso inserite da qualche parte nella cartella Windows stessa. Win32 con windows \ system e windows \ system32 ne è un artefatto.
Dan Neely,

15
Windows 3.1 non supportava nomi di file lunghi, quindi non sarebbe stato in grado di avere una cartella "file di programma".
Darth Egregious,

14
@JarrodRoberson: al contrario, è perché Microsoft apprezza estremamente la compatibilità con le versioni precedenti.
David Schwartz,

24
@Jarrod: In realtà, come tutti gli sviluppatori sanno, Microsoft apprezza troppo la compatibilità con le versioni precedenti . Letteralmente ogni API che hanno ha metodi legacy che rifiutano di rimuovere e spesso gravi bug che rifiutano di correggere, perché hanno paura di rompere i programmi più vecchi che sono stati scritti per quell'API. Lo stesso vale per la maggior parte delle API, ma non per nulla vicino all'esistente di Microsoft.
BlueRaja - Danny Pflughoeft,

65

Ti permette di installare sia la versione a 32 bit che la versione a 64 bit di un'applicazione senza che si sovrascriva.


Dopo aver esaminato questa risposta e commentare il thread il giorno successivo, mi rendo conto di una possibile svista nella mia risposta. Ho assunto erroneamente un background di programmazione e quando parlavo di te nei miei commenti, non intendevo l'utente, ma il programmatore.

Non lavoro per Microsoft e non ho idea di quale sia il vero ragionamento alla base di queste cartelle, ma penso che il motivo per avere queste cartelle sia così ovvio che non ho problemi a discuterne.

Quindi suddividiamolo!

  1. Le cartelle sono fantastiche!

    Concordiamo qualcosa. Le cartelle sono fantastiche! Non ne abbiamo bisogno, abbiamo abbastanza nomi di file possibili per mettere ogni singolo file nella radice del tuo disco rigido, quindi perché avere delle cartelle?

    Bene, ci aiutano a ordinare le nostre cose. E ordinare cose è fantastico. Ci aiuta a elaborare le cose più facilmente. Ciò è particolarmente utile quando si lavora con una macchina che richiede struttura.

  2. Separare dati e logica è fantastico!

    Un paradigma spesso trovato nella programmazione è quello di separare i dati dalla logica. Si desidera una parte che sa come fare qualcosa e si desidera un'altra parte che si può fare qualcosa con .

    Questo si trova anche nel file system.

    Abbiamo cartelle per l'applicazione (logica) e cartelle per i nostri oggetti di valore (dati):

    Logica

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

    Dati

    • %PROGRAMDATA%
    • %HOMEDRIVE%%HOMEPATH%

    Quindi, sembra che le cartelle siano fantastiche e ha senso mettere i programmi nella loro piccola cartella. Ma perché averne 2? Perché non lasciare che l'installer lo gestisca e metta tutto in una Programscartella?

  3. Gli installatori non sono magici

    Oggi usiamo spesso piccoli programmi per installare i nostri programmi più grandi. Chiamiamo questi piccoli programmi di installazione .

    Gli installatori non sono magici. Devono essere scritti da programmatori e sono applicazioni (con possibili bug) come qualsiasi altra applicazione là fuori. Vediamo quindi la situazione che un programmatore immaginario dovrebbe affrontare con e senza il sistema attuale:

    1 cartella Programmi

    Lo sviluppatore mantiene 2 programmi di installazione. Uno per 32 bit e uno per la versione 64 bit della sua applicazione. Il programma di installazione a 32 bit scriverà su C:\Program Files\App\e il programma di installazione a 64 bit scriverà su C:\Program Files\App\sixtyfour\.

    2 cartelle di file di programma

    Lo sviluppatore mantiene 1 programma di installazione. Il programma di installazione scriverà sempre %PROGRAMFILES%e dipenderà dal sistema operativo per espandere il percorso di conseguenza (in realtà non si utilizzano variabili di ambiente per questi casi, si utilizzerà SHGetKnownFolderPath con FOLDERID_ProgramFilesper recuperare il percorso corretto).
    Tutto trova il suo posto automaticamente e il modello è identico a ogni applicazione che installi .

  4. La coerenza ha senso

    Quando impari qualcosa, ciò di solito implica che un comportamento osservato era coerente. Altrimenti non c'è davvero nulla da osservare e da imparare.

    Lo stesso vale per il nostro piccolo file system. Ha senso mettere sempre le stesse cose nelle stesse cartelle. In questo modo, sapremo dove cercare quando stiamo cercando qualcosa.

    Il sistema per la distinzione dell'applicazione 32/64 favorisce questo obiettivo. Le applicazioni sono separate in 2 posizioni per evitare conflitti di nomi, comportamento di caricamento binario e sicurezza (in una certa misura).

Ancora non capisco. Questo sembra inutile

Non dovresti mai dimenticare una cosa. Le persone sono incredibilmente stupide. Ciò include utenti, super utenti e soprattutto programmatori.

Questo è il motivo per cui abbiamo bisogno di cose come il reindirizzamento del file system per rendere anche utilizzabili i nostri sistemi.

I programmatori entreranno e proveranno a caricare C:\Windows\system32\awesome.dlle non si preoccuperanno se stanno funzionando su un sistema a 32 o 64 bit. Tenterebbero di caricare la DLL a 64 bit e semplicemente di bloccarsi. Alcuni programmatori vogliono usare alcune DLL di Office, nessun problema, sanno dove trovarlo! C:\Program Files\Microsoft\Office\14.0\wizards.dll... e un altro incidente!

Tutte queste richieste dall'applicazione a 32 bit vengono reindirizzate nelle controparti a 32 bit per evitare arresti anomali dell'applicazione.

Abbiamo bisogno di alcuni nomi di cartelle fissi per costruire un tale sistema. Se non esiste una struttura di cartelle per supportare questo reindirizzamento, come farai a farlo funzionare?

Bene, ora capisco. Ma allora perché non usarlo C:\Program Files\x86\?

Ora stiamo diventando filosofici ...

Cosa potrebbe andare storto se in qualche modo evitassi il meccanismo di reindirizzamento e costringessi tutto a installarlo sul reale C:\Program Files\?

Molto probabilmente nulla (purché altre applicazioni non dipendano da una posizione fissa per quell'applicazione).

Il meccanismo WOW64 si collegaCreateProcess e eseguirà controlli più sofisticati (più sofisticati del controllo del nome della cartella dell'eseguibile) sull'immagine eseguibile per determinare se è a 32 o 64 bit.

Sì, ma intendo tipo TUTTE le applicazioni!

  • Cosa accadrebbe se inserissi sia diesel che gas nella mia auto?
  • Cosa accadrebbe se provassi a utilizzare sia la corrente alternata che la corrente continua sulla stessa linea?
  • Cosa accadrebbe se tengo sia il mio gatto che i miei pesci nello stesso acquario?

Alcune domande non richiedono risposte. Non è destinato a essere fatto, non farlo. Non c'è niente da guadagnare qui. La quantità di problemi che un tale cambiamento potrebbe causare supererà sempre tutti i possibili benefici che qualcuno potrebbe vedere in questo.


3
È questa la ragione originale, però? Non potrei semplicemente installare l'app su C:\Program Files\App32e C:\Program Files\App64?
Stephen Jennings,

4
@StephenJennings: Ma ciò richiederebbe di prendere manualmente la decisione. Il modo in cui funziona ora è che il processo è automatico, perché Windows sa quale cartella fornire quando un'applicazione chiama SHGetSpecialFolderPathper determinare il percorso di installazione.
Der Hochstapler,

6
@Synetech: perché installare in %PROGRAMFILES%primo luogo? Perché non mettere la versione a 32 bit sul desktop degli utenti e quella a 64 bit nel Cestino? Solo perché può essere fatto, non significa che sia una buona idea. Scusa, non seguo il tuo ragionamento.
Der Hochstapler,

4
@Synetech: Sì, hai dato un ottimo esempio di come si potrebbe fare. Un altro esempio perfettamente valido di come potrebbe essere fatto è il modo in cui viene effettivamente fatto in questo momento. Scrivere semplicemente un file in% PROGRAMFILES% ed essere certi che finirà nella cartella giusta è una cosa. Controllare da soli quale cartella è quella corretta è un'altra. Se in realtà non vedi i vantaggi del precedente approccio, allora non sarò in grado di convincerti. La domanda era: perché ci sono 2 cartelle. Penso che la mia risposta sia perfettamente ragionevole al riguardo.
Der Hochstapler,

3
@OliverSalzburg, No piuttosto. La domanda è perché sono necessarie due cartelle , non perché ci sono . Anzi, l'ha persino osato: perché è persino necessario? Non hai spiegato perché è necessario e l'esempio che ho dato (e persino il tuo esempio sarcastico) mostra semplicemente che non deve essere fatto così com'è.
Synetech,

14

TL; DR:

Riassumendo, no, non è necessario ; avrebbero potuto usare una singola cartella e no, Windows non si presenta in modo diverso a un programma in esecuzione da una posizione o un'altra.


Bene, tutti sembrano esprimere le loro opinioni su questo, quindi lancerò il mio 2 ¢. Altri hanno già ipotizzato i motivi per cui Microsoft ha scelto di creare cartelle di livello superiore separate per le versioni di programmi a 32 e 64 bit, quindi lascerò quella parte (la ragione migliore è stata la spiegazione di David che è come un convenienza per i programmatori). Ovviamente anche in questo caso, non affronta del tutto la domanda diretta perché questo è persino necessario? , a cui la risposta è presumibilmente: non lo è .

Invece, affronterò il corpo principale della domanda

Windows si presenta in qualche modo in modo diverso a un programma che si esaurisce "Programmi (x86)"?

Non proprio, ma la posizione del programma può influire sul comportamento, ma non nel modo in cui si potrebbe pensare.

Quando esegui un programma, Windows imposta un ambiente in cui eseguirlo (intendo in termini di memoria, indirizzamento, ecc., Non solo variabili di ambiente). Questo ambiente dipende dal contenuto dell'eseguibile (i programmi a 32 e 64 bit differiscono internamente). Quando si esegue un programma a 32 bit su un sistema a 64 bit, viene eseguito nel sottosistema a 32 bit che emula un ambiente a 32 bit. Si chiama WoW64 (WoW64 sta per Windows su Windows a 64 bit ) ed è simile a come le app a 16 bit verrebbero eseguite in XP usando NTVDM .

Quando si esegue un programma con o senza privilegi di amministratore, influisce sul modo in cui viene eseguito, ma la posizione non dovrebbe influire su di esso (anche se ci sono alcuni esempi di dipendenza dalla posizione come ad esempio alcuni driver).

(Sto usando un computer diverso, quindi non posso fare affidamento sulla cronologia del mio browser per tornare indietro sui miei passi, ma l'altro giorno mentre rispondevo a questa domanda SU sono finito a questa domanda SO che mi ha causato a Google PROCESSOR_ARCHITEW6432 che mi ha portato a questa domanda SO e questo post sul blog di Microsoft .)

Da qualche parte lungo la strada, ho letto un post StackOverflow su come la variabile di ambiente %processor_architecutre% dia risultati diversi a seconda di dove si esegue il prompt dei comandi (cercherò di trovare la citazione esatta).

La risposta è risultata dovuta se è stata eseguita la versione a 32 o 64 bit del prompt dei comandi (ovvero, da System32\o SysWoW64\). In altre parole, mentre la posizione sembra influenzare il comportamento del programma, è solo perché esistono diverse versioni del programma, non perché Windows tratta la cartella in un modo speciale.

Ciò ha senso perché il contenuto del file eseguibile determina se è a 32 o 64 bit, quindi è possibile inserire una copia a 32 e 64 bit dello stesso programma (ad esempio, foobar32.exee foobar64.exe) nella stessa cartella e quando si eseguirli, verranno caricati correttamente (la versione a 64 bit verrà eseguita in modo nativo e quella a 32 bit verrà eseguita nel livello di emulazione WoW64).

FreePascal consente di installare entrambe le versioni DOS e Windows e vanno nella stessa cartella: %programfiles%\FreePascal. Gestisce le diverse architetture mantenendo i file eseguibili ( .exe, .sys, .dll, .ovr, etc.) in cartelle separate e la condivisione di file di risorse come immagini, source-files, etc.) Non c'è alcuna ragione tecnica che questo non poteva essere fatto anche per il 32 e Versioni a 64 bit di un programma. Come ha detto David, è più semplice per il programmatore se vengono tenuti separati (ovvero, usando le variabili per far sembrare che ci sia solo un set di file, ecc.)


Revenge down-voting! Muahahaha! sospiro
Synetech,

Votazione strana: \. A proposito, spiega bene +1.
avirk,

11

Un altro motivo è che la maggior parte dei programmi utilizzava variabili ambientali come% PROGRAMFILES% per indicare dove era installato il loro programma. Per i programmi a 64 bit, va nella posizione normale. Per i programmi a 32 bit, lo reindirizzerà alla nuova Program Files (x86)cartella.

Anche se, almeno con le nuove cose .Net in Visual Studio, ora hanno la variabile App.Local che elimina l'intera necessità.


4
Questo non lo spiega. Chi sta esattamente usando la variabile d'ambiente e perché dovrebbe interessarsi se un programma è a 32 o 64 bit?
Synetech,

4
@Synetech - L'autore dei programmi usa la variabile d'ambiente. Per quanto riguarda il motivo che potrebbe interessare è a causa di riferimenti a DLL. Non è possibile caricare una DLL a 32 bit all'interno di un processo a 64 bit e viceversa.
Ramhound,

1
E come fare %programfiles%, %programfiles(x86)%o %programw6432%fare la differenza lì? Tutte le DLL condivise vanno nella singola directory WinSxS e tutte le DLL non condivise sono proprio lì con l'eseguibile. Ciò importerebbe solo se per qualche motivo fossero installate entrambe le versioni a 32 e 64 bit dello stesso programma e anche in questo caso, manterresti le DLL a 32 bit con l'eseguibile a 32 bit e la DLL a 64 bit con l'eseguibile a 64 bit. Puoi farlo in questo modo: %programfiles%\CoolApp\bin\32e% programfiles% \ CoolApp \ bin \ 64`, perché le cartelle separate di livello superiore?
Synetech,

@Synetech Certo che lo fa; % programfiles% è in circolazione da un po '. Se installi un programma a 32 bit su un computer a 64 bit, avere una posizione potrebbe causare problemi a quell'app a 32 bit. WoW può reindirizzare% programfile% alla versione (x86) per le app a 32 bit e alla versione non x86 per 64.
Andy,

penso che le persone non sarebbero così confuse, se non ci fosse un reindirizzamento implicito
kommradHomer,

8

La soluzione di Microsoft a questa transizione da 32 a 64 bit è stata quella di aggiungere il supporto legacy per la maggior parte delle applicazioni a 32 bit. In altre parole, la maggior parte delle applicazioni a 32 bit funzionerà nell'ambiente operativo a 64 bit. Tenere presente che altri sistemi operativi che funzionano su un'architettura a 64 bit non possono caricare o eseguire applicazioni a 32 bit.

Per facilitare la transizione, Microsoft ha designato che tutte le applicazioni a 32 bit dovrebbero, per impostazione predefinita, essere caricate nella cartella Programmi (x86) anziché mescolarsi con vere applicazioni a 64 bit nella normale cartella Programmi.

fonte

"cosa potrebbe andare storto se in qualche modo evitassi il meccanismo di reindirizzamento e costringessi tutto a installarlo sul vero C: \ Programmi \?"

Niente. Le due directory dei programmi sono solo per l'organizzazione o per mantenere separati i programmi che hanno due versioni una versione a 32 e 64 bit, come Internet Explorer. Ma è possibile installare un programma a 32 bit in "Programmi" e un programma a 64 bit in "Programmi x86" e non accadrà nulla, il programma funzionerà allo stesso modo.

Wiki dice:

Alcuni programmi di installazione dell'applicazione rifiutano gli spazi nel percorso del percorso di installazione. Per i sistemi a 32 bit, il nome breve per la cartella Programmi è Progra ~ 1 . Per i sistemi a 64 bit, il nome breve per la cartella Programmi a 64 bit è Progra ~ 1 (uguale ai sistemi a 32 bit); mentre il nome breve per la cartella Program Files (x86) a 32 bit è ora Progra ~ 2 .


1
Hehe. Bell'articolo I commenti a quell'articolo suonano esattamente come quelli qui. Peggio ancora, quell'articolo era di più di due anni fa, il che dimostra che questa domanda non è nuova e se non è ancora possibile rispondere in modo autorevole, allora suppongo che non lo farà mai (a meno che qualcuno del team di Windows non intervenga). Oh bene, suppongo che dovremmo semplicemente smettere di preoccuparci e imparare ad amare la bomba, intendo conviverci. +1 Per aver sottolineato l'articolo e aver dimostrato che questa domanda era in circolazione da così tanto tempo.
Synetech,

1
@Synetech grazie! Sì, l'idea che sta dietro l'inserimento del link all'articolo è la stessa che hai avuto. Questa è una domanda molto antica, ma IDK perché le persone non sono ancora riusciti. Tuttavia, la MS dovrebbe scrivere un KB o la documentazione per questo problema :)
avirk,

Sì, dovrebbero, soprattutto perché non sono solo gli sviluppatori a chiederlo, anche gli utenti normali se ne chiedono. Purtroppo la documentazione di Microsoft non è spesso troppo buona.
Synetech,

@Synetech yup! La documentazione MS fa schifo per la maggior parte del tempo. Ma sì, hanno scritto anche alcuni buoni articoli e sono abbastanza sicuro che siano numerabili;)
avirk,

6

Il motivo è rendere più semplice l'aggiornamento per gli sviluppatori di un programma a 64 bit. Non devono scrivere alcun codice personalizzato per verificare il programma in una directory durante la compilazione in modalità 32 bit e in un'altra directory durante la compilazione in modalità 64 bit; controllano C:\Program Filese, quando vengono eseguiti in modalità a 32 bit, questo viene automaticamente modificato in C:\Program Files (x86)Windows a 64 bit. Allo stesso modo, le voci di registro sono isolate tra i programmi a 32 e 64 bit.

Ciò impedisce ai conflitti di sviluppatori inconsapevoli che cambiano la loro modalità di compilazione a 64 bit senza pensarci troppo e impedisce un'enorme quantità di lavoro per gli sviluppatori che vogliono che gli utenti siano in grado di installare entrambe le versioni a 32 e 64 bit dei loro software contemporaneamente.


Ma perché un programma dovrebbe consentire l'installazione simultanea di entrambe le versioni? Un esempio: Photoshop e IE hanno estensioni che sono native .dll. Non è possibile avere codice a 32 e 64 bit miscelato nello stesso processo, quindi un componente aggiuntivo per la versione a 32 bit non può essere utilizzato con la versione a 64 bit e viceversa. Pertanto, Photoshop / IE deve consentire l'installazione di entrambe le versioni o rischiare di rompere la loro enorme base di componenti aggiuntivi esistenti.


2
+1 Almeno hai affrontato la domanda di fondo sul perché gli utenti medi dovrebbero avere entrambe le versioni.
Synetech,

5

I programmi che funzionano su "Programmi (x86)" utilizzano il sottosistema WOW64 (Windows a 32 bit su Windows a 64 bit è un insieme di driver e API intesi per eseguire applicazioni x32 su un sistema di architettura x64):

Il sottosistema WoW64 comprende un livello di compatibilità leggero con interfacce simili su tutte le versioni a 64 bit di Windows. Mira a creare un ambiente a 32 bit che fornisca le interfacce necessarie per eseguire applicazioni Windows a 32 bit non modificate su un sistema a 64 bit. Tecnicamente, WoW64 è implementato usando tre librerie a collegamento dinamico (DLL):

  • Wow64.dll, l'interfaccia principale per il kernel di Windows NT che traduce tra le chiamate a 32 e 64 bit, comprese le manipolazioni di stack di puntatori e chiamate
  • Wow64win.dll, che fornisce i punti di ingresso appropriati per le applicazioni a 32 bit
  • Wow64cpu.dll, che si occupa di cambiare il processore dalla modalità a 32 bit a 64 bit

Il sistema a 64 bit deve "emulare" le applicazioni a 32 bit, motivo per cui Windows deve "separare" due cartelle di file di programma.


7
Ma perché deve inserirlo in cartelle diverse? Windows è già pienamente in grado di determinare l'architettura di un eseguibile guardando l'intestazione PE. Perché non può caricare l'ambiente appropriato quando carica l'eseguibile?
Synetech,

1
Penso che sia solo una scelta di Microsoft mostrare facilmente agli utenti quale architettura desiderano da due versioni del programma quando si apre un programma. Voglio dire, se non ci fossero queste due cartelle e se fosse trasparente per gli utenti (se cambia automaticamente), non saprebbero se eseguire un'app a 32 o 64 bit, anche, non saprebbero quale programma aprire se in esecuzione su 64 bit ..
Diogo,

1
La versione a 64 bit di IE ha la reputazione di essere terribile.
Samuel Edwin Ward,

1
MS consiglia di utilizzare Office32 a meno che non si stia lavorando con set di dati sufficientemente grandi da superare i vincoli di memoria. Credo che sia necessario ricompilare gli addon binari per lavorare con office64; combinato con il non dare alcun beneficio nei normali casi d'uso è alla base della decisione.
Dan Neely,

1
Penso che scoprirai che un programma a 64 bit installato esplicitamente nella cartella Programmi (x86) funzionerà perfettamente normalmente (e, nella maggior parte dei casi, viceversa). Windows non utilizza il percorso della cartella per determinare come trattare l'eseguibile.
Harry Johnston,

5

È interessante notare che le risposte qui e su Internet variano abbastanza. Trovare una risposta accurata a questa importante domanda è stata una sfida. Sembra che ci siano parecchie informazioni false presentate su Internet, creando confusione.

Ho svolto una notevole quantità di ricerche e ho tratto le seguenti conclusioni, che ritengo accurate:

  • Non fa differenza dove è archiviata un'applicazione. In fase di esecuzione, Windows determinerà se l'applicazione è a 32 o 64 bit e utilizza automaticamente la sezione DLL e registro appropriata.

Ciò accade automaticamente ed è indipendente da dove è memorizzata l'applicazione. Non vi sono velocità, affidabilità o altri vantaggi funzionali nell'avere cartelle separate a 32 e 64 bit.

L'unico motivo della separazione predefinita in due cartelle ("Programmi" e "Programmi (x86)") è che se si hanno due versioni dello stesso programma (una versione a 32 e 64 bit), si fornisce un modo semplice per mantenere separati i file sovrapposti. Anche in questo caso, purché tutti i nomi dei file siano univoci, potrebbero effettivamente esistere nella stessa cartella senza alcuna conseguenza.

C'è un avvertimento per la conclusione di cui sopra, ed è quella delle applicazioni scarsamente codificate. Se un'applicazione contiene percorsi codificati, utilizzerà solo quel percorso. Di norma, i percorsi non dovrebbero mai essere codificati in un'applicazione, ma a volte un programmatore commetterà questo errore. In questo caso, il programma utilizzerà il percorso hardcoded; la directory in cui è installata l'applicazione non influirà su dove effettivamente cerca i file.


3

La necessità di separare le cartelle consente di mantenere separate le applicazioni native a 64 bit e quelle che richiedono WoW64 .

Questo può essere utile - come già sottolineato da @OliverSalzburg - se si desidera installare sia un browser Web a 64 bit sia a 32 bit (ad esempio), poiché alcuni plug-in e componenti aggiuntivi potrebbero essere disponibili solo per uno dei il due.

Dover separare le cartelle rende automatica questa separazione , usando tecniche come il reindirizzamento del registro .

Supponiamo che un programma di installazione tenti di determinare la cartella dei file di programma leggendo il registro utilizzando, ad esempio, RegQueryValueEx .

In ogni caso, prova a leggere la chiave di registro

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

che normalmente indica C:\Program Files.

Tuttavia, se il programma di installazione è un'applicazione a 32 bit, il reindirizzamento del registro causerà la chiave di registrazione

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

da leggere invece, che normalmente indica C:\Program Files (x86).

Perché questi nomi di cartelle particolari sono stati utilizzati possono rispondere solo alle persone che hanno fatto questa scelta. Se lo desideri, puoi sempre modificare i nomi delle cartelle predefinite.

Windows si presenta in qualche modo in modo diverso a un programma che si esaurisce "Programmi (x86)"?

Ne dubito. La maggior parte dei programmi di installazione consente di scegliere una cartella di installazione personalizzata, quindi non importa dove viene installato un programma.


Mi dispiace di aver mescolato "permesso" con "vietato"
Wernfried Domscheit

3

Non posso credere alla confusione qui ... in primo luogo sono uno sviluppatore a tempo pieno.

MS ha fatto questo per risolvere il caso in cui una DLL viene utilizzata sia da vecchie applicazioni a 32 bit sia da nuove applicazioni a 64 bit. Non è stato possibile modificare il metodo precedente (System32, Programmi, ecc.) Perché ciò spezzerebbe i programmi più vecchi che non possono essere ricompilati.

Quindi MS ha creato una cartella per archiviare programmi, assembly e librerie specifici a 64 bit in modo che i nuovi programmi possano collegarsi alle librerie appropriate e i programmi più vecchi continuino a funzionare normalmente.

Allo stato attuale, le DLL .Net possono coesistere con altre versioni sullo stesso computer. Ad esempio, puoi avere Library.1.0.1, Library.1.0.2, Library 1.1.0, ecc. E questo è solo per una dimensione di bit specifica (32 o 64). Se non vengono utilizzate cartelle separate, ogni assembly deve avere una versione a 32 e 64 bit. Ciò ingombrerebbe gravemente una directory che contiene già più versioni dello stesso assembly.

Questa è tutta roba per sviluppatori. Come utente, devo occuparmene solo quando lavoro con un programma a 32 bit su Windows 7 64. E preferisco avere la possibilità di eseguire una versione a 32 bit e la stessa applicazione anche a 64 bit. Quando lavoro su un'applicazione a 32 bit che devo compilare a 64 bit, tutto ciò che faccio è dire al compilatore di farlo. I nomi DLL e tutto il resto rimangono gli stessi.

Il motivo per cui questo non esisteva con Windows 95/98 è che quei sistemi simulavano un runtime a 32 bit; non era un vero sistema operativo a 32 bit. Ha simulato l'esecuzione a 32 bit con qualcosa chiamato "thunking".

Ecco una buona definizione: http://searchwinit.techtarget.com/definition/thunk


1
Come funziona 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` o \blah\32; in entrambi i casi, sono separati. Semmai, il modo attuale separa i componenti dell'app (e li duplica inutilmente poiché poche app usano CommonFilesper risorse e simili. Inoltre, fai sembrare che le app scarichino le loro DLL in un bucket comune. È abbastanza facile mantenere le app DLL a 32 bit con i suoi ex a 32 bit ed è DLL a 64 bit con i suoi ex a 64 bit
Synetech,

Oh, e per quanto riguarda il 95/98, chi ha detto qualcosa a riguardo? Persino XP aveva un sottosistema a 16 bit (NTVDM).
Synetech,

Pensavo volessi una spiegazione. Poche app usano CommonFiles? Ho 35 diverse applicazioni che hanno voci lì. È un posto più sicuro in cui archiviare i componenti condivisi rispetto alla directory System32. La tua affermazione che poche app usano questo è discutibile. Citando te: "Non hanno dovuto saltare attraverso questi cerchi per consentire programmi a 32 e 16 bit sullo stesso sistema. Non ricordo di aver mai visto un ProgramFiles (16) o alcuni di questi [...] Tuttavia, la parte relativa al fatto che è stata fatta per comodità dei programmatori ". Bene, sì ... i programmatori lo fanno. Dopotutto scriviamo le applicazioni.
Jason Locke,

Eh?
Synetech

Rileggi questo .. lo ha detto meglio nelle sue risposte - superuser.com/a/442253/142951 . Se non sei uno sviluppatore potresti non vedere lo scopo.
Jason Locke,

0

Non è affatto necessario. Ad esempio, sul mio computer funzionante, installo ogni applicazione nella cartella C:\MyPrograms\per separarli dalle applicazioni installate dal nostro dipartimento IT.

Naturalmente, questo mi impedisce di installare entrambe le versioni (32 e 64 bit) di un'applicazione, ma questo non è un problema nel mio caso.

Ogni volta che si avvia un programma, viene sempre C:\Windows\System32\ntdll.dlleseguita la prima DLL . Questa DLL determina se il programma è un'applicazione a 32 o 64 bit. A seconda di ciò si viene reindirizzati al WoW64quale è già menzionato in diverse risposte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.