Warum benötigt 64-Bit-Windows einen separaten Ordner "Programme (x86)"?

178

Ich weiß, dass in einer 64-Bit-Version von Windows der Ordner "Programme" für 64-Bit-Programme und der Ordner "Programme (x86)" für 32-Bit-Programme vorgesehen ist. Warum ist dies überhaupt erforderlich?

Mit "notwendig" meine ich nicht "warum hätte Microsoft keine anderen Entwurfsentscheidungen treffen können?" denn natürlich könnten sie haben. Ich meine vielmehr: "Warum müssen 32-Bit-Programme angesichts des aktuellen Designs von 64-Bit-Windows einen von 64-Bit-Programmen getrennten Ordner der obersten Ebene haben?" Anders ausgedrückt: "Was würde schief gehen, wenn ich den Umleitungsmechanismus irgendwie umgehen und alles zwingen würde, auf den Real zu installieren C:\Program Files\?"

Es gibt viele Fragen zu Super User und anderswo, die besagen: "Eine ist für 32-Bit-Programme, eine für 64-Bit-Programme", aber keine, die ich finden kann, gibt den Grund an. Aus meiner Erfahrung scheint es egal zu sein, ob ein 32-Bit-Programm am richtigen Ort installiert ist oder nicht.

Präsentiert sich Windows irgendwie anders als ein Programm, dem "Programme (x86)" ausgehen? Gibt es eine Beschreibung, die genau zeigt, was sich für ein in "Program Files (x86)" anstelle von "Program Files" installiertes Programm unterscheidet? Ich halte es für unwahrscheinlich, dass Microsoft ohne berechtigten technischen Grund einen neuen Ordner einführt.

Stephen Jennings
quelle
13
Anstatt Ihre Frage zu beantworten, würde ich fragen: Wie würden Sie mit \ program files \ common files umgehen?
Sgmoore
8
Einzeilige Antwort (und daher ein Kommentar): Da Sie problemlos eine Anwendung aus einem beliebigen Ordner ausführen können, ohne die Architektur zu kennen, gibt es offensichtlich keinen zwingenden Grund für diese Trennung. Es ist eine Frage der Bequemlichkeit , doppelte Installationen von Anwendungen mit beiden Architekturen zu unterstützen . In einigen Fällen macht es einen Unterschied, da es sich nicht unbedingt um einfache Neukompilierungen handelt. Das Hauptproblem ist, dass 32-Bit-Apps keine 64-Bit-DLLs laden können, sodass Sie normalerweise nicht beide Versionen am selben Ort installieren können. Die andere Alternative besteht darin, für jede Anwendung zwei "bin" -Ordner zu haben.
Sklivvz,
1
@Synetech Ich hatte sogar Programme unter (x86) installiert, nur um x64-Binärdateien zu haben. Es ist manchmal schrecklich.
sinni800
10
Ich habe mich immer gefragt, warum Microsoft keine 64-Bit-Programme in ein "Program Files (x64)" -Verzeichnis gestellt hat, anstatt das "Legacy" -Programmdateiverzeichnis in ein "Program Files (x86)" -Verzeichnis zu verschieben
LawrenceC,
30
Die reale Verwirrung über die 64/32 - Bit - Differenzierung ist , dass / Windows / System32 64 - Bit - Inhalt enthält, während / Windows / SysWOW64 die 32bit Sachen enthält ...
stochern

Antworten:

92

Kurze Antwort: Um sicherzustellen, dass ältere 32-Bit-Anwendungen weiterhin so funktionieren wie bisher, ohne dass 64-Bit-Anwendungen hässliche Regeln auferlegt werden, die ein permanentes Durcheinander verursachen würden.

Es ist nicht notwendig. Es ist einfach praktischer als andere mögliche Lösungen, zum Beispiel, dass jede Anwendung ihre eigene Methode erstellt, um 32-Bit-DLLs und ausführbare Dateien von 64-Bit-DLLs und ausführbaren Dateien zu trennen.

Der Hauptgrund ist, dass 32-Bit-Anwendungen, die nicht einmal wissen, dass 64-Bit-Systeme existieren, "einfach funktionieren", auch wenn 64-Bit-DLLs an Stellen installiert sind, an denen die Anwendungen möglicherweise aussehen. Eine 32-Bit-Anwendung kann keine 64-Bit-DLL laden. Daher war eine Methode erforderlich, um sicherzustellen, dass es sich um eine 32-Bit-Anwendung handelt (die möglicherweise 64-Bit-Systeme vorbestellt und daher keine Ahnung von 64-Bit-Dateien hat Es gibt keine 64-Bit-DLL. Versuchen Sie, die DLL zu laden, schlagen Sie fehl und generieren Sie eine Fehlermeldung.

Die einfachste Lösung hierfür sind konsequent getrennte Verzeichnisse. Wirklich ist die einzige Alternative, zu verlangen, dass jede 64-Bit-Anwendung ihre ausführbaren Dateien an einer Stelle "versteckt", an der eine 32-Bit-Anwendung nicht hinschaut, wie zum Beispiel in einem bin64Verzeichnis innerhalb dieser Anwendung. Dies würde jedoch 64-Bit-Systemen dauerhafte Hässlichkeit auferlegen, nur um ältere Anwendungen zu unterstützen.

David Schwartz
quelle
52
Sie mussten nicht durch diese Rahmen springen, um 32-Bit- und 16-Bit-Programme auf demselben System zuzulassen. Ich kann mich nicht erinnern, jemals so etwas gesehen zu haben ProgramFiles (16). Wie genau würde ein 32-Bit-Programm "eine 64-Bit-DLL finden und versuchen, sie zu laden"? In welchen Programmen wird nach zufälligen DLLs gesucht %programfiles%? Wenn es sich um eine gemeinsam genutzte DLL handelt, wird sie in WinSxS ausgeführt. Wenn es nicht freigegeben wird, ist es dem Programmierer überlassen, seine eigenen DLLs zu verwalten. Der Teil darüber wird jedoch als Annehmlichkeit für Programmierer vernünftig gemacht.
Synetech
30
IIRC Win3.1 hatte kein Programmdateiverzeichnis (oder die meisten Apps ignorierten es); Infolgedessen würde es keine älteren Win16-Apps geben, die zunächst nach Inhalten in Programmdateien suchen. Stattdessen wurden gemeinsam genutzte IIRC-Bibliotheken häufig irgendwo im Windows-Ordner selbst abgelegt. Win32 mit Windows \ System und Windows \ System32 ist ein Artefakt davon.
Dan Neely
15
Windows 3.1 unterstützte keine langen Dateinamen, so dass es keinen Ordner "Programmdateien" geben konnte.
Darth Egregious
14
@JarrodRoberson: Ganz im Gegenteil, Microsoft legt großen Wert auf Abwärtskompatibilität.
David Schwartz
24
@Jarrod: Tatsächlich schätzt Microsoft die Abwärtskompatibilität, wie jeder Entwickler weiß, zu hoch. Buchstäblich hat jede API Legacy-Methoden, die sie nicht entfernen können, und oft schwerwiegende Fehler, die sie nicht beheben können, weil sie Angst haben, ältere Programme zu beschädigen, die für diese API geschrieben wurden. Dasselbe gilt für die meisten APIs, jedoch nicht für die von Microsoft.
BlueRaja - Danny Pflughoeft
65

Sie können damit sowohl die 32-Bit- als auch die 64-Bit-Version einer Anwendung installieren, ohne dass sie sich selbst überschreibt.


Nachdem ich mir diese Antwort und den Kommentarthread am nächsten Tag angesehen habe, erkenne ich in meiner Antwort ein mögliches größeres Versehen. Ich habe fälschlicherweise einen Programmierhintergrund angenommen und als ich in meinen Kommentaren über Sie sprach, meinte ich nicht den Benutzer, sondern den Programmierer.

Ich arbeite nicht für Microsoft und habe keine Ahnung, was der wahre Grund für diese Ordner ist, aber ich denke, der Grund für diese Ordner ist so offensichtlich, dass ich kein Problem damit habe, darüber zu streiten.

Also lasst es uns brechen!

  1. Ordner sind super!

    Lassen Sie uns etwas vereinbaren. Ordner sind großartig! Wir brauchen sie nicht, wir haben genügend mögliche Dateinamen, um jede einzelne Datei im Stammverzeichnis Ihrer Festplatte abzulegen. Warum also überhaupt Ordner?

    Sie helfen uns, unsere Sachen zu bestellen. Und Sachen zu bestellen ist großartig. Es hilft uns, Dinge einfacher zu verarbeiten. Dies ist besonders nützlich, wenn Sie mit einer Maschine arbeiten, die eine Struktur benötigt.

  2. Die Trennung von Daten und Logik ist großartig!

    Ein in der Programmierung häufig anzutreffendes Paradigma ist die Trennung von Daten und Logik. Sie wollen ein Teil, der weiß , wie etwas zu tun , und Sie wollen einen anderen Teil , den Sie etwas tun können , mit .

    Dies ist auch im Dateisystem zu finden.

    Wir haben Ordner für die Anwendung (Logik) und Ordner für unsere Wertsachen (Daten):

    Logik

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

    Daten

    • %PROGRAMDATA%
    • %HOMEDRIVE%%HOMEPATH%

    Es sieht also so aus, als wären Ordner fantastisch und es ist sinnvoll, Programme in einen eigenen kleinen Ordner zu legen. Aber warum haben 2? Lassen Sie das Installationsprogramm das erledigen und speichern Sie alles in einem ProgramsOrdner.

  3. Installateure sind keine Zauberei

    Heutzutage verwenden wir oft kleine Programme, um unsere größeren Programme zu installieren. Wir nennen diese kleinen Programme Installer .

    Installateure sind keine Zauberei. Sie müssen von Programmierern geschrieben werden und sind Anwendungen (mit möglichen Fehlern) wie jede andere Anwendung da draußen. Schauen wir uns also die Situation an, der sich ein imaginärer Programmierer mit und ohne das aktuelle System stellen müsste :

    1 Programmordner

    Der Entwickler unterhält 2 Installer. Eine für die 32-Bit- und eine für die 64-Bit-Version seiner Anwendung. Das 32-Bit-Installationsprogramm schreibt in C:\Program Files\App\und das 64-Bit-Installationsprogramm schreibt in C:\Program Files\App\sixtyfour\.

    2 Programmordner

    Der Entwickler unterhält 1 Installationsprogramm. Das Installationsprogramm schreibt immer auf %PROGRAMFILES%und ist abhängig vom Betriebssystem des Pfad zu erweitern entsprechend (Sie verwenden eigentlich nicht Umgebungsvariablen für diese Fälle, die Sie verwenden würden SHGetKnownFolderPath mit FOLDERID_ProgramFilesdem richtigen Pfad zu holen).
    Alles findet seinen Platz automatisch und das Muster ist mit jeder installierten Anwendung identisch .

  4. Konsistenz macht Sinn

    Wenn Sie etwas lernen , bedeutet dies normalerweise, dass ein beobachtetes Verhalten konsistent war. Ansonsten gibt es wirklich nichts zu beobachten und zu lernen.

    Gleiches gilt für unser kleines Dateisystem. Es ist sinnvoll, immer dasselbe Material in denselben Ordnern abzulegen. Auf diese Weise wissen wir, wo wir suchen müssen, wenn wir etwas suchen.

    Das System zur Unterscheidung von 32/64-Anwendungen unterstützt dieses Ziel. Die Anwendungen sind in zwei Bereiche unterteilt, um Konflikte in Bezug auf Namen, Binärladeverhalten und Sicherheit (in gewissem Maße) zu vermeiden.

Ich verstehe es immer noch nicht. Das scheint nutzlos

Sie sollten niemals eine Sache vergessen. Die Leute sind unglaublich dumm. Dies schließt Benutzer, Superuser und insbesondere Programmierer ein.

Deshalb brauchen wir Dinge wie die Umleitung von Dateisystemen, um unsere Systeme überhaupt nutzbar zu machen.

Programmierer werden einfach dort reingehen und versuchen zu laden C:\Windows\system32\awesome.dllund sich nicht darum zu kümmern, ob sie auf einem 32- oder 64-Bit-System laufen. Sie würden versuchen, die 64-Bit-DLL zu laden und einfach abstürzen. Einige Programmierer möchten eine Office-DLL verwenden, kein Problem, sie wissen, wo sie zu finden sind! C:\Program Files\Microsoft\Office\14.0\wizards.dll... und noch ein Absturz!

Alle diese Anforderungen von 32-Bit-Anwendungen werden an die 32-Bit-Gegenstücke umgeleitet , um Anwendungsabstürze zu vermeiden.

Wir benötigen einige feste Ordnernamen, um ein solches System aufzubauen. Wenn es keine Ordnerstruktur gibt, die diese Umleitung unterstützt, wie soll sie dann funktionieren?

Okay, jetzt verstehe ich. Aber warum dann nicht nutzen C:\Program Files\x86\?

Jetzt werden wir philosophisch ...

Was würde schief gehen, wenn ich irgendwie den Umleitungsmechanismus umgehen und alles auf den Real installieren müsste C:\Program Files\?

Höchstwahrscheinlich nichts (solange andere Anwendungen nicht von einem festen Speicherort für diese Anwendung abhängen).

Der WOW64- Mechanismus greift in das CreateProcess32- oder 64-Bit-Image ein und führt komplexere Prüfungen durch (komplexer als das Überprüfen des Ordnernamens der ausführbaren Datei).

Ja, aber ich meine, wie ALLE Anwendungen!

  • Was würde passieren, wenn ich sowohl Diesel als auch Benzin in mein Auto stecken würde ?
  • Was würde passieren, wenn ich versuche, sowohl Wechselstrom als auch Gleichstrom auf derselben Leitung zu verwenden?
  • Was würde passieren , wenn wir halten beide meine Katze und meine Fische im selben Aquarium?

Einige Fragen erfordern keine Antworten. Es ist nicht beabsichtigt, es nicht zu tun. Hier gibt es nichts zu gewinnen. Die Menge der Probleme eine solche Änderung dazu führen könnten , wird immer schwerer wiegen als jede mögliche Vorteile jemand in dieser sehen konnte.

Der Hochstapler
quelle
3
Ist das der ursprüngliche Grund? Könnte ich die App nicht einfach auf C:\Program Files\App32und installieren C:\Program Files\App64?
Stephen Jennings
4
@StephenJennings: Dafür müssten Sie jedoch die Entscheidung manuell treffen. Die Art und Weise, wie dies jetzt funktioniert, ist, dass der Prozess automatisch abläuft, da Windows weiß, welcher Ordner bereitgestellt werden muss, wenn eine Anwendung SHGetSpecialFolderPathden Installationsspeicherort ermittelt.
Der Hochstapler
6
@Synetech: Warum überhaupt installieren %PROGRAMFILES%? Warum nicht die 32-Bit-Version auf dem Desktop des Benutzers und die 64-Bit-Version in den Papierkorb legen? Nur weil es machbar ist, heißt das noch lange nicht, dass es eine gute Idee ist. Entschuldigung, ich folge Ihrer Argumentation nicht.
Der Hochstapler
4
@Synetech: Ja, Sie haben ein perfektes Beispiel dafür gegeben, wie das gemacht werden kann. Ein weiteres vollkommen gutes Beispiel dafür , wie es getan werden könnte , ist so , wie es ist tatsächlich gerade jetzt getan. Es ist eine Sache, einfach eine Datei in% PROGRAMFILES% zu schreiben und sicher zu sein, dass sie im richtigen Ordner landet. Prüfen Sie selbst, welcher Ordner der richtige ist. Wenn Sie den Nutzen des früheren Ansatzes tatsächlich nicht sehen, kann ich Sie nicht überzeugen. Die Frage war, warum es 2 Ordner gibt. Ich denke, meine Antwort ist in dieser Hinsicht völlig vernünftig.
Der Hochstapler
3
@OliverSalzburg, nein ganz. Die Frage ist , warum zwei Ordner sind erforderlich , nicht , warum es ist . Tatsächlich hat er es sogar gewagt: Warum ist das überhaupt notwendig? Sie nicht erklärten , warum es notwendig , und das Beispiel gab ich (und sogar Ihr eigenes sarkastisches Beispiel) zeigt, dass es nicht hat die Art und Weise getan werden , es ist.
Synetech
14

TL; DR:

Zusammenfassend ist es nicht notwendig ; sie könnte haben einen einzelnen Ordner, und nein, Windows nicht präsentiert sich anders als ein Programm , das laufen von einem Ort oder einem anderen verwendet.


Nun, jeder scheint seine Meinung dazu zu äußern, also werfe ich meine 2 ¢ ein. Andere haben bereits vermutet, warum Microsoft separate Ordner der obersten Ebene für 32-Bit- und 64-Bit-Versionen von Programmen erstellt hat. Daher werde ich diesen Teil verlassen (der beste Grund war Davids Erklärung, dass es sich um einen handelt) Bequemlichkeit für Programmierer). Natürlich ist auch dann die direkte Frage, warum das überhaupt notwendig ist , nicht ganz beantwortet . , worauf die Antwort vermutlich lautet: Nein .

Stattdessen werde ich auf den Hauptteil der Frage eingehen

Präsentiert sich Windows irgendwie anders als ein Programm, dem "Programme (x86)" ausgehen?

Nicht wirklich, aber der Speicherort des Programms kann das Verhalten beeinflussen, aber nicht so, wie Sie denken würden.

Wenn Sie ein Programm ausführen, richtet Windows eine Umgebung ein, in der es ausgeführt werden soll (ich meine in Bezug auf Speicher, Adressierung usw., nicht nur Umgebungsvariablen). Diese Umgebung hängt vom Inhalt der ausführbaren Datei ab (32-Bit- und 64-Bit-Programme unterscheiden sich intern). Wenn Sie ein 32-Bit-Programm auf einem 64-Bit-System ausführen, wird es im 32-Bit-Subsystem ausgeführt, das eine 32-Bit-Umgebung emuliert. Es heißt WoW64 (WoW64 steht für Windows unter Windows 64-Bit ) und ähnelt der Ausführung von 16-Bit-Apps unter XP mit NTVDM .

Wenn Sie ein Programm mit oder ohne Administratorrechte ausführen, wirkt sich dies auf die Ausführung aus, der Speicherort sollte sich jedoch nicht auf die Ausführung auswirken (obwohl es einige Beispiele für Standortabhängigkeiten gibt, z. B. einige Treiber).

(Ich bin mit einem anderen Computer, so kann ich nicht verlassen Geschichte in meinem Browser meine Schritte zurückzuverfolgen, aber der andere Tag während der Beantwortung diese SU Frage ich am Ende dieser Frage SO , die zu veranlassten mich Google PROCESSOR_ARCHITEW6432 , das zu führen diese Frage SO und diesen Microsoft-Blogbeitrag .)

Irgendwo auf dem Weg las ich einen StackOverflow-Beitrag darüber, wie die Umgebungsvariable %processor_architecutre% unterschiedliche Ergebnisse liefert, je nachdem, wo Sie die Eingabeaufforderung ausführen (ich werde versuchen, das genaue Zitat zu finden).

Die Antwort war darauf zurückzuführen, ob die 32-Bit- oder die 64-Bit-Version der Eingabeaufforderung ausgeführt wurde (dh von System32\oder SysWoW64\). Mit anderen Worten: Während der Speicherort das Verhalten des Programms zu beeinflussen scheint , liegt dies nur daran, dass es unterschiedliche Versionen des Programms gibt, nicht daran, dass Windows den Ordner auf besondere Weise behandelt.

Dies ist sinnvoll, da der Inhalt der ausführbaren Datei vorschreibt, ob es sich um eine 32-Bit- oder eine 64-Bit-Datei handelt. Sie können also sowohl eine 32-Bit- als auch eine 64-Bit-Kopie desselben Programms (z. B. foobar32.exeund foobar64.exe) im selben Ordner und zu jedem Zeitpunkt ablegen Wenn Sie sie ausführen, werden sie korrekt geladen (die 64-Bit-Version wird nativ ausgeführt und die 32-Bit-Version wird in der WoW64-Emulationsebene ausgeführt).

Freepascal ermöglicht es Ihnen , DOS und Windows - Versionen zu installieren und sie gehen in den gleichen Ordner: %programfiles%\FreePascal. Er verwaltet die verschiedenen Architekturen von ausführbaren Dateien zu halten ( .exe, .sys, .dll, .ovrusw.) in separaten Ordnern und Ressourcendateien wie Bilder teilen, Source-Dateien, etc.) Es gibt keinen technischen Grund , dass dies nicht auch für 32- erfolgen und 64-Bit-Versionen eines Programms. Wie David sagte, ist es für den Programmierer nur einfacher, sie getrennt zu halten (dh Variablen zu verwenden, damit es so aussieht, als gäbe es nur einen Satz von Dateien usw.).

Synetech
quelle
Rache runter stimmen! Muahahaha! Seufzer
Synetech
Abwärtsstimmen seltsam: \. Übrigens gut, erkläre +1.
Avirk
11

Ein weiterer Grund ist, dass die meisten Programme Umgebungsvariablen wie% PROGRAMFILES% verwenden, um darauf hinzuweisen, wo ihr Programm installiert wurde. Bei 64-Bit-Programmen wird der normale Speicherort verwendet. Bei 32-Bit-Programmen wird dies in den neuen Program Files (x86)Ordner umgeleitet .

Zumindest mit den neuen .Net-Inhalten in Visual Studio verfügen sie jetzt über die Variable App.Local, die den gesamten Bedarf dafür überflüssig macht.

Kanadischer Luke
quelle
4
Das erklärt es nicht. Wer genau verwendet die Umgebungsvariable und warum ist es wichtig, ob ein Programm 32-Bit oder 64-Bit ist?
Synetech
4
@Synetech - Der Autor von Programmen verwendet die Umgebungsvariable. Was den Grund angeht, ist es wichtig, dass auf DLLs verwiesen wird. Sie können eine 32-Bit-DLL nicht innerhalb eines 64-Bit-Prozesses laden und umgekehrt.
Ramhound
1
Und wie machen %programfiles%, %programfiles(x86)%oder %programw6432%dort einen Unterschied machen? Alle gemeinsam genutzten DLLs werden in das einzelne WinSxS-Verzeichnis verschoben, und alle nicht gemeinsam genutzten DLLs befinden sich genau dort, wo sich die ausführbare Datei befindet. Dies ist nur dann von Bedeutung, wenn Sie aus irgendeinem Grund eine 32-Bit- und eine 64-Bit-Version desselben Programms installiert haben und selbst dann die 32-Bit-DLLs mit der 32-Bit-ausführbaren Datei und die 64-Bit-DLL mit beibehalten die ausführbare 64-Bit-Datei. Sie können dies folgendermaßen tun: %programfiles%\CoolApp\bin\32und% programfiles% \ CoolApp \ bin \ 64`, warum die separaten Ordner der obersten Ebene?
Synetech
@Synetech Sicher ist es das; % programfiles% ist schon eine Weile her. Wenn Sie ein 32-Bit-Programm auf einem 64-Bit-Computer installieren, würde es Probleme für diese 32-Bit-App verursachen, einen einzigen Ort zu haben. WoW kann% programfile% für 32-Bit-Apps auf die (x86) -Version und für 64 auf die Nicht-x86-Version umleiten.
Andy,
ich denke die
leute
8

Die Lösung von Microsoft für diesen Übergang von 32-Bit zu 64-Bit bestand darin, die meisten 32-Bit-Anwendungen mit Legacy-Unterstützung auszustatten. Mit anderen Worten, die meisten 32-Bit-Anwendungen funktionieren in der 64-Bit-Betriebsumgebung. Beachten Sie, dass andere Betriebssysteme, die auf einer 64-Bit-Architektur ausgeführt werden, überhaupt keine 32-Bit-Anwendungen laden oder ausführen können.

Um den Übergang zu vereinfachen, hat Microsoft festgelegt, dass alle 32-Bit-Anwendungen standardmäßig in den Ordner "Programme" (x86) geladen werden sollen, anstatt sich mit echten 64-Bit-Anwendungen im regulären Ordner "Programme" zu vermischen.

Quelle

"Was würde schief gehen, wenn ich den Umleitungsmechanismus irgendwie umgehen und alles zwingen würde, auf das echte C: \ Programme \ zu installieren?"

Nichts. Die beiden Programmverzeichnisse dienen nur zur Organisation oder zum Trennen von Programmen mit zwei Versionen, einer 32-Bit- und einer 64-Bit-Version, wie z. B. Internet Explorer. Sie können jedoch ein 32-Bit-Programm in "Program Files" und ein 64-Bit-Programm in "Program Files x86" installieren, und es passiert nichts. Das Programm wird genauso ausgeführt.

Wiki sagt:

Einige Anwendungsinstallationsprogramme weisen Leerzeichen innerhalb des Installationspfads zurück. Bei 32-Bit-Systemen lautet der Kurzname für den Ordner "Programme" Progra ~ 1 . Bei 64-Bit-Systemen lautet der Kurzname für den Ordner "64-Bit-Programme" Progra ~ 1 (wie bei 32-Bit-Systemen). Der Kurzname für den 32-Bit-Ordner "Programme (x86)" lautet jetzt " Progra ~ 2" .

avirk
quelle
1
Hehe Schöner Artikel. Die Kommentare zu diesem Artikel klingen genauso wie hier. Schlimmer noch, dieser Artikel stammt aus einer Zeit vor mehr als zwei Jahren, die nur zeigt, dass diese Frage nicht neu ist und wenn sie immer noch nicht verbindlich beantwortet werden kann, wird sie es vermutlich nie tun (es sei denn, jemand vom Windows-Team mischt sich ein). Na ja, ich denke, wir sollten alle aufhören, uns Sorgen zu machen und lernen, die Bombe zu lieben, ähm, ich will damit leben. +1 Um auf den Artikel hinzuweisen und zu zeigen, dass es diese Frage schon so lange gibt.
Synetech
1
@Synetech danke! Ja, die Idee, die dahinter steckt, ist die gleiche, die Sie haben. Dies ist eine sehr alte Frage, aber IDK, warum die Leute es noch nicht verstanden haben. Allerdings sollte die MS eine KB oder Dokumentation für dieses Problem schreiben :)
Avirk
Ja, das sollten sie, vor allem, weil nicht nur Entwickler fragen, sondern auch normale Benutzer sich darüber wundern. Leider ist die Dokumentation von Microsoft nicht oft zu gut.
Synetech
@Synetech yup! MS-Dokumentation nervt die meiste Zeit. Aber ja, sie haben auch einige gute Artikel geschrieben und ich bin mir ziemlich sicher, dass sie abzählbar sind;)
Avirk
6

Der Grund dafür ist, den Entwicklern das Upgrade eines Programms auf 64-Bit zu erleichtern. Sie müssen keinen benutzerdefinierten Code schreiben, um beim Kompilieren im 32-Bit-Modus in einem Verzeichnis nach dem Programm zu suchen, und beim Kompilieren im 64-Bit-Modus in einem anderen Verzeichnis. Sie prüfen nur C:\Program Files, und wenn sie im 32-Bit-Modus ausgeführt werden, wird dies automatisch C:\Program Files (x86)von 64-Bit-Windows geändert . In ähnlicher Weise sind die Registrierungseinträge zwischen 32-Bit- und 64-Bit-Programmen isoliert.

Dies verhindert, dass Konflikte Entwickler nicht kennen, die ihren Kompilierungsmodus nur auf 64-Bit ändern, ohne viel darüber nachzudenken, und verhindert einen enormen Arbeitsaufwand für Entwickler, die möchten, dass Benutzer sowohl 32- als auch 64-Bit-Versionen ihrer Software installieren können Software gleichzeitig.


Aber warum sollte ein Programm zulassen, dass beide Versionen gleichzeitig installiert werden? Ein Beispiel: Photoshop und IE verfügen über native DLL-Erweiterungen. Es ist nicht möglich, 32- und 64-Bit-Code im selben Prozess zu mischen. Daher kann ein Addon für die 32-Bit-Version nicht mit der 64-Bit-Version verwendet werden und umgekehrt. Daher muss Photoshop / IE die Installation beider Versionen zulassen, da sonst die Gefahr besteht, dass die riesige Basis der vorhandenen Addons zerstört wird.

BlueRaja - Danny Pflughoeft
quelle
2
+1 Zumindest haben Sie die zugrunde liegende Frage angesprochen, warum durchschnittliche Benutzer beide Versionen haben würden.
Synetech
5

Programme, die auf "Program Files (x86)" ausgeführt werden, verwenden das WOW64- Subsystem (Windows 32-Bit unter Windows 64-Bit ist eine Reihe von Treibern und APIs, mit denen x32-Anwendungen über ein x64-Architektursystem ausgeführt werden sollen):

Das WoW64-Subsystem umfasst eine kompakte Kompatibilitätsschicht mit ähnlichen Schnittstellen für alle 64-Bit-Versionen von Windows. Ziel ist es, eine 32-Bit-Umgebung zu erstellen, die die erforderlichen Schnittstellen bietet, um unveränderte 32-Bit-Windows-Anwendungen auf einem 64-Bit-System auszuführen. Technisch gesehen wird WoW64 mit drei Dynamic Link Libraries (DLLs) implementiert:

  • Wow64.dll, die Hauptschnittstelle zum Windows NT-Kernel, die 32-Bit- und 64-Bit-Aufrufe übersetzt, einschließlich Zeiger- und Aufrufstapelmanipulationen
  • Wow64win.dll, die die entsprechenden Einstiegspunkte für 32-Bit-Anwendungen bereitstellt
  • Wow64cpu.dll, die dafür sorgt, dass der Prozessor vom 32-Bit- in den 64-Bit-Modus wechselt

Das 64-Bit-System muss 32-Bit-Anwendungen "emulieren". Aus diesem Grund muss Windows zwei Ordner mit Programmdateien "trennen".

Diogo
quelle
7
Aber warum muss es in verschiedenen Ordnern abgelegt werden? Windows ist bereits in der Lage, die Architektur einer ausführbaren Datei anhand des PE-Headers zu bestimmen. Warum kann die entsprechende Umgebung nicht geladen werden, wenn die ausführbare Datei geladen wird?
Synetech
1
Ich denke, es ist nur eine Wahl von Microsoft, Benutzern beim Öffnen eines Programms auf einfache Weise zu zeigen, welche Architektur sie von zwei Programmversionen erwarten. Ich meine, wenn es diese beiden Ordner nicht gäbe und sie für Benutzer transparent wären (wenn sie automatisch wechseln würden), würden sie nicht wissen, ob sie eine 32- oder 64-Bit-App ausführen, selbst wenn sie nicht wissen würden, welches Programm sie öffnen sollen Wenn auf 64 Bit ausgeführt wird ..
Diogo
1
Die 64-Bit-Version von IE gilt als schrecklich.
Samuel Edwin Ward
1
MS empfiehlt die Verwendung von Office32, es sei denn, Sie arbeiten mit Datenmengen, die groß genug sind, um die Speicherbeschränkungen zu überschreiten. Ich glaube, die Notwendigkeit, binäre Addons neu zu kompilieren, um mit office64 zu arbeiten; in Verbindung mit der Nichtverwendung von Vorteilen in normalen Anwendungsfällen steht hinter der Entscheidung.
Dan Neely
1
Ich denke, Sie werden feststellen, dass ein 64-Bit-Programm, das explizit im Ordner "Programme" (x86) installiert ist, normal funktioniert (und in den meisten Fällen auch umgekehrt). Windows verwendet den Ordnerpfad nicht, um zu bestimmen, wie die ausführbare Datei behandelt werden soll.
Harry Johnston
5

Es ist interessant, dass die Antworten hier und im Internet sehr unterschiedlich sind. Eine genaue Antwort auf diese wichtige Frage zu finden, war eine Herausforderung. Im Internet scheint es eine Menge falscher Informationen zu geben, die zu Verwirrung führen.

Ich habe viel recherchiert und die folgenden Schlussfolgerungen gezogen, die ich für richtig halte:

  • Es macht keinen Unterschied, wo eine Anwendung gespeichert ist. Zur Laufzeit ermittelt Windows, ob es sich bei der Anwendung um eine 32-Bit- oder eine 64-Bit-Anwendung handelt, und verwendet automatisch die entsprechenden DLLs und den Registrierungsabschnitt.

Dies geschieht automatisch und ist unabhängig davon, wo die Anwendung gespeichert ist. Separate 32-Bit- und 64-Bit-Ordner bieten keine Geschwindigkeit, Zuverlässigkeit oder andere funktionale Vorteile.

Der einzige Grund für die Standardtrennung in zwei Ordner ("Programme" und "Programme (x86)") ist, dass bei zwei Versionen desselben Programms (eine 32-Bit- und eine 64-Bit-Version) ein bereitgestellt wird einfache Möglichkeit, überlappende Dateien voneinander zu trennen. Auch in diesem Fall können alle Dateinamen, solange sie eindeutig sind, ohne Konsequenzen im selben Ordner vorhanden sein.

Es gibt eine Einschränkung zu der obigen Schlussfolgerung, und das ist die von schlecht codierten Anwendungen. Wenn in einer Anwendung Pfade fest programmiert sind, wird nur dieser Pfad verwendet. In der Regel sollten Pfade niemals fest in eine Anwendung codiert werden, aber gelegentlich macht ein Programmierer diesen Fehler. In diesem Fall verwendet das Programm den fest codierten Pfad. Das Verzeichnis, in dem die Anwendung installiert ist, hat keinen Einfluss darauf, wo tatsächlich nach Dateien gesucht wird.

RockPaperLizard
quelle
3

Wenn Sie Ordner trennen müssen, können Sie die nativen 64-Bit-Anwendungen und diejenigen, für die WoW64 erforderlich ist, voneinander trennen .

Dies kann nützlich sein - wie @OliverSalzburg bereits betont hat -, wenn Sie zum Beispiel sowohl 64-Bit- als auch 32-Bit- Versionen eines Webbrowsers installieren möchten, da einige Plug-Ins und Add-Ons möglicherweise nur für eines von ihnen verfügbar sind die Zwei.

Durch das Trennen von Ordnern wird diese Trennung mithilfe von Techniken wie der Registrierungsumleitung automatisch durchgeführt .

Angenommen, ein Installationsprogramm versucht, den Ordner mit den Programmdateien durch Lesen der Registrierung zu ermitteln, indem beispielsweise RegQueryValueEx verwendet wird .

In jedem Fall wird versucht, den Registrierungsschlüssel zu lesen

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

das zeigt normalerweise auf C:\Program Files.

Wenn das Installationsprogramm jedoch eine 32-Bit-Anwendung ist, führt die Registrierungsumleitung zum Registrierungsschlüssel

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

stattdessen zu lesen, was normalerweise auf C:\Program Files (x86).

Warum diese speziellen Ordnernamen verwendet wurden, können nur die Personen beantworten, die diese Wahl getroffen haben. Sie können jederzeit die Namen der Standardordner ändern, wenn Sie möchten.

Präsentiert sich Windows irgendwie anders als ein Programm, dem "Programme (x86)" ausgehen?

Das bezweifle ich. Bei den meisten Installationsprogrammen können Sie einen benutzerdefinierten Installationsordner auswählen, sodass es nicht wirklich darauf ankommt, wo ein Programm installiert wird.

Dennis
quelle
Sorry ich habe "erlauben" mit "verbieten" gemischt
Wernfried Domscheit
3

Ich kann die Verwirrung hier nicht glauben. Erstens bin ich ein Vollzeitentwickler.

MS hat dies getan, um den Fall zu lösen, in dem eine DLL sowohl von älteren 32-Bit-Anwendungen als auch von neueren 64-Bit-Anwendungen verwendet wird. Die ältere Methode konnte nicht geändert werden (System32, Programme usw.), da dadurch ältere Programme beschädigt werden, die nicht erneut kompiliert werden können.

Daher hat MS einen Ordner zum Speichern von 64-Bit-spezifischen Programmen, Assemblys und Bibliotheken erstellt, sodass neue Programme mit den richtigen Bibliotheken verknüpft werden können und ältere Programme normal weiterarbeiten.

Derzeit können .Net-DLLs mit anderen Versionen auf demselben Computer koexistieren. Beispielsweise können Sie Library.1.0.1, Library.1.0.2, Library 1.1.0 usw. verwenden. Dies gilt nur für eine bestimmte Bitgröße (32 oder 64). Wenn keine separaten Ordner verwendet werden, muss jede Assembly über eine 32- und eine 64-Bit-Version verfügen. Dies würde ein Verzeichnis, das bereits mehrere Versionen derselben Assembly enthält, stark überladen.

Das ist alles Entwicklerzeug. Als Benutzer muss ich mich nur damit befassen, wenn ich mit einem 32-Bit-Programm unter Windows 7 64 arbeite. Außerdem bevorzuge ich die Möglichkeit, eine 32-Bit-Version und dieselbe Anwendung auch in 64-Bit auszuführen. Wenn ich an einer 32-Bit-Anwendung arbeite, die ich in 64-Bit kompilieren muss, muss ich den Compiler nur dazu auffordern. DLL-Namen und alles andere bleibt gleich.

Der Grund, warum dies unter Windows 95/98 nicht existierte, ist, dass diese Systeme eine 32-Bit-Laufzeit simuliert haben. Es war kein echtes 32-Bit-Betriebssystem. Es hat eine 32-Bit-Ausführung mit dem Namen "Thunking" vorgetäuscht.

Hier ist eine gute Definition: http://searchwinit.techtarget.com/definition/thunk

Jason Locke
quelle
1
Wie funktioniert 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` oder \blah\32; In jedem Fall sind sie getrennt. Wenn überhaupt, trennt der aktuelle Weg die App-Komponenten (und dupliziert sie auch unnötig, da nur wenige Apps CommonFilesRessourcen und Ähnliches verwenden. Außerdem klingt es so, als würden Apps ihre DLLs in einem gemeinsamen Eimer ablegen. Es ist einfach genug, die einer App zu behalten 32-Bit-DLLs mit ihren 32-Bit-Exes und 64-Bit-DLLs mit ihren 64-Bit-Exes
Synetech
Oh, und was 95/98 betrifft, wer hat etwas darüber gesagt? Sogar XP hatte ein 16-Bit-Subsystem (das NTVDM).
Synetech
Ich dachte du wolltest eine Erklärung. Nur wenige Apps verwenden CommonFiles? Ich habe 35 verschiedene Anwendungen, die Einträge dort haben. Das Speichern freigegebener Komponenten ist sicherer als das System32-Verzeichnis. Ihre Aussage, dass nur wenige Apps dies verwenden, ist umstritten. Zitat von Ihnen: "Sie mussten nicht durch diese Rahmen springen, um 32-Bit- und 16-Bit-Programme auf demselben System zu ermöglichen. Ich kann mich nicht erinnern, jemals Programmdateien (16) oder [...] Der Teil darüber wird jedoch als Annehmlichkeit für Programmierer zumutbar gemacht. " Nun ja .. Programmierer tun es. Wir schreiben schließlich die Bewerbungen.
Jason Locke
Huh?
Synetech
Lesen Sie dies einfach noch einmal durch. Er sagte es in seinen Antworten besser - superuser.com/a/442253/142951 . Wenn Sie kein Entwickler sind, sehen Sie möglicherweise nicht den Zweck.
Jason Locke
0

Es ist überhaupt nicht notwendig. Zum Beispiel installiere ich auf meinem Arbeitscomputer jede Anwendung in einem Ordner C:\MyPrograms\, um sie von den Anwendungen zu trennen, die von unserer IT-Abteilung installiert wurden.

Das hindert mich natürlich daran, beide Versionen (32 und 64 Bit) einer Anwendung zu installieren, aber das ist in meinem Fall kein Problem.

Wenn Sie ein Programm starten, wird immer die erste DLL C:\Windows\System32\ntdll.dllausgeführt. Diese DLL bestimmt, ob es sich bei Ihrem Programm um eine 32- oder 64-Bit-Anwendung handelt. Abhängig davon werden Sie weitergeleitet, WoW64worauf bereits in mehreren Antworten hingewiesen wird.

Wernfried Domscheit
quelle