Dlaczego 64-bitowy system Windows potrzebuje osobnego folderu „Program Files (x86)”?

178

Wiem, że w 64-bitowej wersji systemu Windows folder „Program Files” jest przeznaczony dla programów 64-bitowych, a folder „Program Files (x86)” dla programów 32-bitowych, ale dlaczego jest to nawet konieczne?

Przez „konieczne” nie mam na myśli „dlaczego Microsoft nie mógł podjąć żadnych innych decyzji projektowych?” bo oczywiście mogliby. Mam na myśli raczej „dlaczego, biorąc pod uwagę obecny projekt 64-bitowego systemu Windows, programy 32-bitowe muszą mieć oddzielny folder najwyższego poziomu od programów 64-bitowych?” Innymi słowy: „co poszedłoby źle, gdybym w jakiś sposób uniknął mechanizmu przekierowania i zmusiłbym wszystko do zainstalowania się w rzeczywistości C:\Program Files\?”

Super użytkownik ma wiele pytań, które mówią, że „jedno dotyczy programów 32-bitowych, jedno dotyczy programów 64-bitowych”, ale żadne z nich nie znalazło powodu. Z mojego doświadczenia wynika, że nie wydają się znaczenia, czy program 32-bitowy jest zainstalowany w odpowiednim miejscu, czy nie.

Czy system Windows w jakiś sposób prezentuje się inaczej niż program, na którym kończy się „Program Files (x86)”? Czy istnieje opis, który dokładnie pokazuje, czym różni się program zainstalowany w „Program Files (x86)” zamiast „Program Files”? Myślę, że jest mało prawdopodobne, aby Microsoft wprowadził nowy folder bez uzasadnionego powodu technicznego.

Stephen Jennings
źródło
13
Zamiast odpowiedzieć na twoje pytanie, zapytałbym - jak poradziłbyś sobie z \ program files \ common files?
sgmoore
8
Odpowiedź w jednym wierszu (i stąd komentarz): skoro możesz łatwo uruchomić dowolną aplikację z dowolnego folderu bez znajomości jego architektury, to wyraźnie nie ma obowiązkowego powodu takiego rozdzielenia. Obsługa podwójnej instalacji aplikacji w obu architekturach jest wygodna . W niektórych przypadkach robi to różnicę, ponieważ niekoniecznie są to proste rekompilacje. Głównym problemem jest to, że 32-bitowe aplikacje nie mogą załadować 64-bitowych bibliotek DLL, więc zwykle nie można zainstalować obu wersji w tym samym miejscu. Inną alternatywą jest posiadanie dwóch folderów „bin” dla każdej aplikacji.
Sklivvz
1
@ Synetech Miałem nawet programy instalujące się pod (x86) tylko po to, by mieć binaria x64 .. Czasami jest to okropne.
sinni800
10
Zawsze zastanawiałem się, dlaczego Microsoft nie umieścił programów 64-bitowych w „Program Files (x64)” zamiast * przenosić „starsze” katalog Program Files do Program Files (x86)
LawrenceC
30
Prawdziwy bałagan związany z różnicowaniem 64/32-bitów polega na tym, że / Windows / System32 zawiera zawartość 64-bitową, podczas gdy / Windows / SysWOW64 zawiera elementy 32-bitowe…
poke

Odpowiedzi:

92

Krótka odpowiedź: aby zapewnić, że starsze 32-bitowe aplikacje będą działać tak samo, jak kiedyś, bez narzucania brzydkich reguł 64-bitowym aplikacjom, które spowodowałyby trwały bałagan.

To nie jest konieczne. Jest to po prostu wygodniejsze niż inne możliwe rozwiązania, takie jak wymaganie od każdej aplikacji stworzenia własnego sposobu oddzielania 32-bitowych bibliotek DLL i plików wykonywalnych od 64-bitowych bibliotek DLL i plików wykonywalnych.

Głównym powodem jest sprawienie, by 32-bitowe aplikacje, które nawet nie wiedzą, że 64-bitowe systemy istnieją, „działają”, nawet jeśli 64-bitowe biblioteki DLL są zainstalowane w miejscach, w których aplikacje mogą wyglądać. Aplikacja 32-bitowa nie będzie mogła załadować 64-bitowej biblioteki DLL, dlatego potrzebna była metoda, aby upewnić się, że aplikacja 32-bitowa (która może być wcześniejsza niż 64-bitowa, a zatem nie ma pomysłu na pliki 64-bitowe) nawet istnieje) nie znalazłby 64-bitowej biblioteki DLL, próbowałby ją załadować, zawieść, a następnie wygenerować komunikat o błędzie.

Najprostszym rozwiązaniem tego są konsekwentnie oddzielne katalogi. Naprawdę jedyną alternatywą jest wymaganie, aby każda 64-bitowa aplikacja „ukrywała” swoje pliki wykonywalne w miejscu, w którym aplikacja 32-bitowa nie wyglądałaby, na przykład bin64katalog wewnątrz tej aplikacji. Ale to narzuciłoby stałą brzydotę 64-bitowym systemom tylko do obsługi starszych aplikacji.

David Schwartz
źródło
52
Nie musieli przeskakiwać przez te obręcze, aby umożliwić programy 32-bitowe i 16-bitowe w tym samym systemie. Nie przypominam sobie, żeby kiedykolwiek widziałem ProgramFiles (16)coś takiego. Poza tym, w jaki sposób 32-bitowy program „znajdzie 64-bitową bibliotekę DLL i próbuje ją załadować”? W jakich programach chodzi poszukiwanie losowych bibliotek DLL %programfiles%? Jeśli jest to współużytkowana biblioteka DLL, to jest dostępna w WinSxS; jeśli nie jest udostępniony, to do programisty należy zarządzanie własnymi bibliotekami DLL. Część tego, że jest to robione jako wygoda dla programistów, jest jednak rozsądna.
Synetech
30
IIRC Win3.1 nie miał katalogu plików programu (lub większość aplikacji go zignorowała); w rezultacie nie byłoby żadnych starszych aplikacji win16 szukających czegoś w plikach programu na początek. Zamiast tego biblioteki współdzielone IIRC były często umieszczane gdzieś w samym folderze Windows. Artefakt tego ma Win32 mający system Windows \ system i system Windows \ system32.
Dan Neely
15
Windows 3.1 nie obsługiwał długich nazw plików, więc nie byłby w stanie mieć folderu „plików programów”.
Darth Egregious
14
@JarrodRoberson: Wręcz przeciwnie, ponieważ Microsoft bardzo wysoko ceni kompatybilność wsteczną.
David Schwartz
24
@Jarrod: W rzeczywistości, jak wie każdy programista, Microsoft zbyt wysoko ceni kompatybilność wsteczną . Dosłownie każdy interfejs API, który mają, ma starsze metody, których nie chce usunąć, i często poważne błędy, których nie naprawia, ponieważ boją się zepsuć starsze programy, które zostały napisane dla tego API. To samo dotyczy większości interfejsów API, ale nie w pobliżu istniejących Microsoft.
BlueRaja - Danny Pflughoeft
65

Pozwala zainstalować zarówno 32-bitową, jak i 64-bitową wersję aplikacji bez zastępowania się.


Po zapoznaniu się z odpowiedzią i komentarzem następnego dnia, zdaję sobie sprawę z możliwego poważnego przeoczenia mojej odpowiedzi. Fałszywie założyłem zaplecze programistyczne i kiedy mówiłem o tobie w moich komentarzach, nie miałem na myśli użytkownika, ale programistę.

Nie pracuję dla Microsoft i nie mam pojęcia, jakie jest prawdziwe uzasadnienie tych folderów, ale myślę, że powód posiadania tych folderów jest tak oczywisty, że nie mam problemu z ich argumentowaniem.

Rozbijmy to!

  1. Foldery są niesamowite!

    Uzgodnijmy coś. Foldery są świetne! Nie potrzebujemy ich, mamy wystarczającą liczbę możliwych nazw plików, aby umieścić każdy plik w katalogu głównym dysku twardego, więc po co w ogóle mieć foldery?

    Pomagają nam zamawiać nasze rzeczy. A zamawianie rzeczy jest świetne. Pomaga nam łatwiej przetwarzać rzeczy. Jest to szczególnie przydatne podczas pracy z maszyną wymagającą struktury.

  2. Rozdzielanie danych i logiki jest świetne!

    Często występującym w programowaniu paradygmatem jest oddzielanie danych od logiki. Chcesz jedną część, która wie jak coś zrobić i chcesz kolejną część, którą można zrobić coś z .

    Można to również znaleźć w systemie plików.

    Mamy foldery do aplikacji (logika) i foldery na nasze kosztowności (dane):

    Logika

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

    Dane

    • %PROGRAMDATA%
    • %HOMEDRIVE%%HOMEPATH%

    Wygląda więc na to, że foldery są niesamowite i sensowne jest umieszczanie programów w ich własnym małym folderze. Ale dlaczego mają 2? Dlaczego nie pozwolić, aby instalator sobie z tym poradził i umieścił wszystko w jednym Programsfolderze?

  3. Instalatorzy nie są magią

    Dzisiaj często używamy małych programów do instalowania naszych większych programów. Nazywamy te instalatory małych programów .

    Instalatorzy nie są magią. Muszą być napisane przez programistów i są aplikacjami (z możliwymi błędami), jak każda inna aplikacja. Spójrzmy więc na sytuację, z którą wyimaginowany programista musiałby się zmierzyć z obecnym systemem i bez niego:

    1 folder Program Files

    Deweloper utrzymuje 2 instalatorów. Jeden dla wersji 32-bitowej i jeden dla wersji 64-bitowej jego aplikacji. Instalator 32-bitowy napisze do, C:\Program Files\App\a instalator 64 -bitowy napisze do C:\Program Files\App\sixtyfour\.

    2 foldery Program Files

    Deweloper utrzymuje 1 instalator. Instalator zawsze będzie pisać %PROGRAMFILES%i zależeć od systemu operacyjnego, aby odpowiednio rozwinąć ścieżkę (w tych przypadkach nie używasz zmiennych środowiskowych, możesz użyć SHGetKnownFolderPath z, FOLDERID_ProgramFilesaby pobrać poprawną ścieżkę).
    Wszystko znajduje swoje miejsce automatycznie, a wzór jest identyczny z każdą instalowaną aplikacją .

  4. Spójność ma sens

    Kiedy się czegoś uczysz , zwykle oznacza to, że zaobserwowane zachowanie było spójne. W przeciwnym razie naprawdę nie ma nic do obserwowania i nauki.

    To samo dotyczy naszego małego systemu plików. Sensowne jest zawsze umieszczanie tych samych rzeczy w tych samych folderach. W ten sposób będziemy wiedzieć, gdzie szukać, gdy czegoś szukamy.

    System rozróżniania aplikacji 32/64 wspiera ten cel. Aplikacje są podzielone na 2 lokalizacje, aby uniknąć konfliktów nazw, zachowania ładowania binarnego i bezpieczeństwa (do pewnego stopnia).

Nadal nie rozumiem. To wydaje się bezużyteczne

Nigdy nie powinieneś zapominać o jednej rzeczy. Ludzie są niesamowicie głupi. Dotyczy to użytkowników, superużytkowników, a zwłaszcza programistów.

Dlatego potrzebujemy takich rzeczy, jak przekierowanie systemu plików, aby nawet nasze systemy były użyteczne.

Programiści po prostu tam wejdą i spróbują się załadować, C:\Windows\system32\awesome.dllnie dbając o to, czy działają w systemie 32- lub 64-bitowym. Próbowaliby załadować 64-bitową bibliotekę DLL i po prostu zawiesić się. Niektórzy programiści chcą używać biblioteki DLL Office, nie ma problemu, wiedzą, gdzie ją znaleźć! C:\Program Files\Microsoft\Office\14.0\wizards.dll... i kolejna katastrofa!

Wszystkie te żądania 32-bitowej aplikacji są przekierowywane do 32-bitowych odpowiedników, aby uniknąć awarii aplikacji.

Potrzebujemy ustalonych nazw folderów, aby zbudować taki system. Jeśli nie ma struktury folderów, która obsługiwałaby to przekierowanie, to jak sprawisz, aby działało?

Okej, teraz rozumiem. Ale dlaczego więc nie użyć C:\Program Files\x86\?

Teraz zaczynamy filozofować ...

Co pójdzie nie tak, gdybym w jakiś sposób uniknął mechanizmu przekierowania i zmusiłbym wszystko do zainstalowania się w rzeczywistości C:\Program Files\?

Najprawdopodobniej nic (o ile inne aplikacje nie zależą od stałej lokalizacji dla tej aplikacji).

W WOW64 mechanizm haki do CreateProcessi będzie funkcjonował bardziej wyrafinowane (bardziej wyrafinowane niż sprawdzanie nazwy folderu wykonywalnego) kontrole obrazu wykonywalnego, aby ustalić, czy jest to 32 lub 64 bit.

Tak, ale mam na myśli WSZYSTKIE aplikacje!

  • Co by się stało, gdybym umieścić zarówno olej napędowy i gaz do mojego samochodu?
  • Co by się stało, jeśli próbuję użyć zarówno prądu przemiennego i stałego na tej samej linii?
  • Co by się stało, gdybym zachować zarówno mojego kota i moją rybę w tym samym akwarium?

Niektóre pytania nie wymagają odpowiedzi. To nie jest przeznaczone do zrobienia, nie rób tego. Nic tu nie można zyskać. Ilość problemów, jakie taka zmiana może spowodować, zawsze przeważa nad wszelkimi możliwymi korzyściami, jakie ktoś może w tym zobaczyć.

Der Hochstapler
źródło
3
Czy to jednak pierwotny powód? Czy nie mogę po prostu zainstalować aplikacji w C:\Program Files\App32i C:\Program Files\App64?
Stephen Jennings
4
@StephenJennings: Ale to wymagałoby ręcznego podjęcia decyzji. Teraz działa to tak, że proces jest automatyczny, ponieważ system Windows wie, jaki folder należy podać, gdy aplikacja wywołuje się w SHGetSpecialFolderPathcelu ustalenia lokalizacji instalacji.
Der Hochstapler
6
@ Synetech: Po co instalować %PROGRAMFILES%? Dlaczego nie umieścić wersji 32-bitowej na pulpicie użytkowników, a wersji 64-bitowej w Koszu? To, że można to zrobić, nie oznacza, że ​​to dobry pomysł. Przepraszam, nie podążam za twoim rozumowaniem.
Der Hochstapler
4
@ Synetech: Tak, podałeś doskonały przykład tego, jak można to zrobić. Innym doskonałym przykładem tego, jak można to zrobić jest droga to jest rzeczywiście robi teraz. Wystarczy napisać plik do% PROGRAMFILES% i mieć pewność, że trafi on do odpowiedniego folderu to jedno. Sprawdzanie, który folder jest poprawny, jest inny. Jeśli tak naprawdę nie widzisz korzyści z poprzedniego podejścia, nie będę w stanie cię przekonać. Pytanie brzmiało, dlaczego są 2 foldery. Myślę, że moja odpowiedź jest w tym względzie całkowicie rozsądna.
Der Hochstapler
3
@OliverSalzburg, Nie całkiem. Powstaje pytanie, dlaczego są dwa foldery wymagane , nie dlatego tam . W rzeczywistości nawet odważnie: dlaczego to w ogóle konieczne? Nie wyjaśniłeś, dlaczego jest to konieczne, a przykład, który podałem (a nawet twój własny sarkastyczny przykład), po prostu pokazuje, że nie trzeba tego robić tak, jak jest.
Synetech
14

TL; DR:

Podsumowując, nie, nie jest to konieczne ; one mogły być stosowane jeden folder, a nie, system Windows nie przedstawiać się odmiennie do programu są uruchamiane z jednego lub drugiego.


Cóż, wszyscy wydają się wypowiadać na ten temat, więc wrzucę 2 ¢. Inni już domyślili się, dlaczego Microsoft postanowił utworzyć osobne foldery najwyższego poziomu dla 32-bitowych i 64-bitowych wersji programów, więc zostawię tę część (najlepszym powodem było wyjaśnienie Davida, że ​​jest to wygoda dla programistów). Oczywiście nawet wtedy nie odpowiada na bezpośrednie pytanie, dlaczego jest to w ogóle konieczne? , na które odpowiedź brzmi: nie .

Zamiast tego odniosę się do głównej części pytania

Czy system Windows w jakiś sposób prezentuje się inaczej niż program, na którym kończy się „Program Files (x86)”?

Nie do końca, ale lokalizacja programu może wpływać na zachowanie, ale nie w sposób, w jaki myślisz.

Kiedy uruchamiasz program, Windows konfiguruje środowisko, w którym chcesz go uruchomić (mam na myśli pamięć, adresowanie itp., Nie tylko zmienne środowiskowe). To środowisko zależy od zawartości pliku wykonywalnego (programy 32-bitowe i 64-bitowe różnią się wewnętrznie). Po uruchomieniu programu 32-bitowego w systemie 64-bitowym działa on w 32-bitowym podsystemie, który emuluje środowisko 32-bitowe. Nazywa się WoW64 (WoW64 oznacza Windows w 64-bitowym systemie Windows ) i jest podobny do tego, jak 16-bitowe aplikacje będą uruchamiane w XP za pomocą NTVDM .

Uruchamianie programu z uprawnieniami administratora lub bez niego wpływa na to, jak działa, ale lokalizacja nie powinna na niego wpływać (chociaż istnieją pewne przykłady zależności lokalizacji, na przykład niektóre sterowniki).

(Korzystam z innego komputera, więc nie mogę polegać na historii przeglądarki, aby cofnąć swoje kroki, ale pewnego dnia, odpowiadając na to pytanie SU , skończyłem na tym SO pytaniu, które spowodowało, że trafiłem do Google PROCESSOR_ARCHITEW6432, które doprowadziły do tego SO pytania i ten post na blogu Microsoft ).

Gdzieś po drodze przeczytałem post StackOverflow o tym, jak zmienna środowiskowa %processor_architecutre% daje różne wyniki w zależności od tego, z którego miejsca uruchomiono wiersz polecenia (postaram się znaleźć dokładny cytat).

Odpowiedź okazała się należna, niezależnie od tego, czy uruchomiono 32-bitową czy 64-bitową wersję wiersza polecenia (tj. Z System32\lub SysWoW64\). Innymi słowy, chociaż lokalizacja wydaje się wpływać na zachowanie programu, dzieje się tak tylko dlatego, że istnieją różne wersje programu, a nie dlatego, że Windows traktuje folder w specjalny sposób.

Ma to sens, ponieważ zawartość pliku wykonywalnego decyduje o tym, czy jest to wersja 32-bitowa, czy 64-bitowa, więc możesz umieścić zarówno 32-bitową, jak i 64-bitową kopię tego samego programu (np. foobar32.exeI foobar64.exe) w tym samym folderze i kiedy wykonaj je, zostaną poprawnie załadowane (wersja 64-bitowa zostanie uruchomiona natywnie, a wersja 32-bitowa będzie uruchomiona w warstwie emulacji WoW64).

FreePascal umożliwia zainstalowanie zarówno wersje DOS i Windows i idą w tym samym folderze: %programfiles%\FreePascal. Zarządza różnych architektur utrzymując pliki wykonywalne ( .exe, .sys, .dll, .ovr, itd.) W oddzielnych folderach i udostępnianie plików zasobów jak zdjęcia, pliki źródłowego, itd), nie ma powodów technicznych, że to nie może być również wykonane dla 32- i 64-bitowe wersje programu. Jak powiedział David, programiście jest po prostu łatwiej, jeśli są trzymane osobno (tj. Używając zmiennych, aby wyglądać, jakby był tylko jeden zestaw plików itp.)

Synetech
źródło
Zemsta głosowania w dół! Muahahaha! westchnienie
Synetech
Głosowanie w dół dziwne: \. BTW dobrze wyjaśnić +1.
avirk
11

Innym powodem jest to, że większość programów używała zmiennych środowiskowych, takich jak% PROGRAMFILES%, aby wskazać, gdzie zainstalowano ich program. W przypadku programów 64-bitowych jest to normalne miejsce. W przypadku programów 32-bitowych przekieruje to do nowego Program Files (x86)folderu.

Chociaż, przynajmniej z nowymi rzeczami .Net w Visual Studio, mają teraz zmienną App.Local, która eliminuje całą potrzebę tego.

Kanadyjczyk Luke
źródło
4
To nie wyjaśnia tego. Kto dokładnie używa zmiennej środowiskowej i dlaczego miałoby to obchodzić, czy program jest 32-bitowy czy 64-bitowy?
Synetech
4
@Synetech - Autor programów używa zmiennej środowiskowej. Powodem, dla którego to obchodzi, są odwołania do bibliotek dll. Nie można załadować 32-bitowej biblioteki DLL w procesie 64-bitowym i odwrotnie.
Ramhound
1
A jak to zrobić %programfiles%, %programfiles(x86)%czy %programw6432%coś zmienić? Wszelkie współużytkowane biblioteki DLL przechodzą do pojedynczego katalogu WinSxS, a wszelkie niepodzielone biblioteki DLL znajdują się w pliku wykonywalnym. Ma to znaczenie tylko wtedy, gdy z jakiegoś powodu masz zarówno 32-bitową, jak i 64-bitową wersję tego samego programu, a nawet wtedy zachowałbyś 32-bitowe biblioteki DLL z 32-bitowym plikiem wykonywalnym i 64-bitową bibliotekę DLL z 64-bitowy plik wykonywalny. Możesz to zrobić tak: %programfiles%\CoolApp\bin\32i% programfiles% \ CoolApp \ bin \ 64`, dlaczego oddzielne foldery najwyższego poziomu?
Synetech
@ Synetech Pewnie, że tak; % programfiles% już jakiś czas. Jeśli zainstalujesz 32-bitowy program na 64-bitowym komputerze, posiadanie jednego miejsca spowodowałoby problemy dla tej 32-bitowej aplikacji. WoW może jednak przekierować% programfile% do wersji (x86) dla aplikacji 32-bitowych i wersji innej niż x86 dla wersji 64.
Andy
myślę, że ludzie nie byliby tak zdezorientowani, gdyby nie było niejawnego przekierowania
kommradHomer
8

Rozwiązaniem firmy Microsoft do przejścia z wersji 32-bitowej na 64-bitową było dodanie obsługi starszych wersji większości aplikacji 32-bitowych. Innymi słowy, większość 32-bitowych aplikacji będzie działać w 64-bitowym środowisku operacyjnym. Należy pamiętać, że inne systemy operacyjne działające w architekturze 64-bitowej nie mogą w ogóle ładować ani uruchamiać aplikacji 32-bitowych.

Aby ułatwić przejście, Microsoft zdecydował, że wszystkie 32-bitowe aplikacje powinny być domyślnie ładowane do folderu Program Files (x86), a nie mieszane z prawdziwymi aplikacjami 64-bitowymi w zwykłym folderze Program Files.

Źródło

„co poszło nie tak, gdybym w jakiś sposób uniknął mechanizmu przekierowania i zmusiłbym wszystko do zainstalowania się w prawdziwym C: \ Program Files \?”

Nic. Dwa katalogi programów służą wyłącznie do organizacji lub dla zachowania odrębności programów, które mają dwie wersje, w wersji 32-bitowej i 64-bitowej, takich jak Internet Explorer. Ale możesz zainstalować 32-bitowy program w „Program Files” i 64-bitowy program w „Program Files x86” i nic się nie stanie, program będzie działał tak samo.

Wiki mówi:

Niektóre instalatory aplikacji odrzucają spacje w lokalizacji ścieżki instalacji. W systemach 32-bitowych krótka nazwa folderu Program Files to Progra ~ 1 . W systemach 64-bitowych krótka nazwa 64-bitowego folderu Program Files to Progra ~ 1 (taka sama jak w systemach 32-bitowych); podczas gdy krótka nazwa 32-bitowego folderu Program Files (x86) to teraz Progra ~ 2 .

avirk
źródło
1
Hehe Niezły artykuł. Komentarze do tego artykułu brzmią dokładnie tak, jak tutaj. Co gorsza, ten artykuł pochodzi z ponad dwóch lat temu, co pokazuje, że to pytanie nie jest nowe i jeśli nadal nie można na nie odpowiedzieć w sposób autorytatywny, to chyba tak się nie stanie (chyba że ktoś z zespołu Windows wpadnie). No cóż, przypuszczam, że wszyscy powinniśmy przestać się martwić i nauczyć się kochać bombę, mam zamiar z nią żyć. +1 Za wskazanie artykułu i wykazanie, że to pytanie istniało już tak długo.
Synetech
1
@Synetech dzięki! Tak, pomysł umieszczenia linku do artykułu jest taki sam, jak masz. To bardzo stare pytanie, ale IDK dlaczego ludzie jeszcze nie mogli go zdobyć. Jednak MS powinno napisać KB lub Dokumentację dotyczące tego problemu :)
avirk
Tak, powinni, zwłaszcza że pytają nie tylko programiści, nawet zwykli użytkownicy zastanawiają się nad tym. Niestety dokumentacja Microsoftu często nie jest zbyt dobra.
Synetech
@Synetech yup! Dokumentacja MS jest do kitu przez większość czasu. Ale tak, napisali też kilka dobrych artykułów i jestem pewien, że można je policzyć;)
avirk
6

Powodem jest ułatwienie programistom uaktualnienia programu do wersji 64-bitowej. Nie muszą pisać żadnego niestandardowego kodu, aby sprawdzić program w jednym katalogu podczas kompilacji w trybie 32-bitowym oraz w innym katalogu podczas kompilacji w trybie 64-bitowym; po prostu sprawdzają C:\Program Files, a gdy działa w trybie 32-bitowym, automatycznie zmienia się C:\Program Files (x86)na 64-bitowy system Windows. Podobnie wpisy rejestru są izolowane między programami 32-bitowymi i 64-bitowymi.

Zapobiega to nieświadomym programistom, którzy po prostu zmieniają tryb kompilacji na 64-bitowy, nie zastanawiając się nad tym, oraz zapobiega ogromnej ilości pracy dla programistów, którzy chcą, aby użytkownicy mogli instalować zarówno 32-, jak i 64-bitowe wersje swoich oprogramowanie jednocześnie.


Ale dlaczego jakikolwiek program chciałby zezwolić na instalację obu wersji jednocześnie? Jeden przykład: Photoshop i IE mają rozszerzenia, które są natywne .dll. Nie można mieszać kodu 32- i 64-bitowego w tym samym procesie, więc dodatek do wersji 32-bitowej nie może być używany z wersją 64-bitową i odwrotnie. W związku z tym Photoshop / IE musi zezwalać na instalację obu wersji, w przeciwnym razie istnieje ryzyko złamania ogromnej bazy istniejących dodatków.

BlueRaja - Danny Pflughoeft
źródło
2
+1 Przynajmniej odpowiedziałeś na podstawowe pytanie, dlaczego przeciętni użytkownicy mieliby obie wersje.
Synetech
5

Programy działające na „Program Files (x86)” korzystają z podsystemu WOW64 (Windows 32-bit na Windows 64-bit to zestaw sterowników i interfejsów API przeznaczonych do uruchamiania aplikacji x32 w systemie architektury x64):

Podsystem WoW64 zawiera lekką warstwę zgodności, która ma podobne interfejsy we wszystkich 64-bitowych wersjach systemu Windows. Ma na celu stworzenie 32-bitowego środowiska, które zapewnia interfejsy wymagane do uruchamiania niezmodyfikowanych 32-bitowych aplikacji Windows w systemie 64-bitowym. Technicznie WoW64 jest implementowany przy użyciu trzech bibliotek DLL (DLL):

  • Wow64.dll, podstawowy interfejs jądra systemu Windows NT, który tłumaczy wywołania 32-bitowe i 64-bitowe, w tym manipulowanie wskaźnikiem i stosem wywołań
  • Wow64win.dll, który zapewnia odpowiednie punkty wejścia dla aplikacji 32-bitowych
  • Wow64cpu.dll, który zajmuje się przełączaniem procesora z trybu 32-bitowego na tryb 64-bitowy

System 64-bitowy musi „emulować” aplikacje 32-bitowe, dlatego system Windows musi „segregować” dwa foldery Program Files.

Diogo
źródło
7
Ale dlaczego musi to umieszczać w różnych folderach? System Windows jest już w pełni w stanie określić architekturę pliku wykonywalnego, patrząc na nagłówek PE. Dlaczego nie może załadować odpowiedniego środowiska, gdy ładuje plik wykonywalny?
Synetech
1
Myślę, że to tylko wybór od Microsoft, aby łatwo pokazać użytkownikom, jakiej architektury chcą z dwóch wersji programu podczas otwierania programu. Mam na myśli, że gdyby nie było tych dwóch folderów i byłby przezroczysty dla użytkowników (gdyby przełączał się automatycznie), nie wiedzieliby, czy uruchomią aplikację 32- lub 64-bitową, nawet nie wiedzieliby, który program otworzyć jeśli działa na 64 bitach ..
Diogo
1
64-bitowa wersja IE ma reputację straszną.
Samuel Edwin Ward
1
MS zaleca korzystanie z pakietu office32, chyba że pracujesz z zestawami danych wystarczająco dużymi, aby przekroczyć ograniczenia pamięci. Uważam, że trzeba ponownie skompilować dodatki binarne do pracy z pakietem office64; w połączeniu z nieprzynoszeniem żadnych korzyści w normalnych przypadkach użytkowania leży za decyzją.
Dan Neely
1
Myślę, że przekonasz się, że 64-bitowy program jawnie zainstalowany w folderze Program Files (x86) będzie działał idealnie normalnie (i, w większości przypadków, na odwrót). System Windows nie używa lokalizacji folderu do określania sposobu traktowania pliku wykonywalnego.
Harry Johnston,
5

Interesujące jest to, że odpowiedzi tutaj i w Internecie są dość różne. Znalezienie dokładnej odpowiedzi na to ważne pytanie było wyzwaniem. Wydaje się, że w Internecie jest sporo fałszywych informacji, co prowadzi do zamieszania.

Przeprowadziłem znaczną liczbę badań i wyciągnąłem następujący wniosek, który moim zdaniem jest dokładny:

  • Nie ma znaczenia, gdzie aplikacja jest przechowywana. W czasie wykonywania system Windows ustali, czy aplikacja jest 32-bitowa czy 64-bitowa i automatycznie użyje odpowiedniej biblioteki DLL i sekcji rejestru.

Dzieje się to automatycznie i jest niezależne od miejsca przechowywania aplikacji. Posiadanie osobnych folderów 32-bitowych i 64-bitowych nie ma szybkości, niezawodności ani innych korzyści funkcjonalnych.

Jedynym powodem domyślnego podziału na dwa foldery („Pliki programów” i „Pliki programów (x86)”) jest to, że jeśli masz dwie wersje tego samego programu (wersja 32-bitowa i 64-bitowa), zapewnia on prosty sposób na oddzielenie nakładających się plików. Nawet w tym przypadku, o ile wszystkie nazwy plików są unikalne, mogą faktycznie istnieć w tym samym folderze bez żadnych konsekwencji.

Powyższy wniosek zawiera zastrzeżenie, które dotyczy źle zakodowanych aplikacji. Jeśli aplikacja ma zapisane na stałe ścieżki, użyje tylko tej ścieżki. Z reguły ścieżki nie powinny być nigdy zakodowane na stałe w aplikacji, ale czasami programista popełni ten błąd. W takim przypadku program użyje zakodowanej ścieżki; katalog, w którym aplikacja jest zainstalowana, nie wpłynie na to, gdzie faktycznie szuka plików.

RockPaperLizard
źródło
3

Konieczność oddzielenia folderów pozwala zachować natywne 64-bitowe aplikacje i te, które wymagają WoW64 oddzielnie.

Może to być przydatne - jak już wskazano @OliverSalzburg - jeśli chcesz zainstalować zarówno 64-bitową, jak i 32-bitową przeglądarkę internetową (na przykład), ponieważ niektóre wtyczki i dodatki mogą być dostępne tylko dla jednego z dwójka.

Konieczność oddzielenia folderów powoduje, że separacja ta odbywa się automatycznie , z wykorzystaniem technik takich jak przekierowanie rejestru .

Załóżmy, że instalator próbuje ustalić folder plików programu, odczytując rejestr przy użyciu np . RegQueryValueEx .

W każdym razie próbuje odczytać klucz rejestru

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

co zwykle wskazuje na C:\Program Files.

Jeśli jednak instalator jest aplikacją 32-bitową, przekierowanie rejestru spowoduje klucz regitry

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

zamiast tego należy czytać, co zwykle wskazuje C:\Program Files (x86).

Dlaczego te konkretne nazwy folderów zostały użyte, mogą odpowiedzieć tylko osoby, które dokonały tego wyboru. Zawsze możesz zmienić domyślne nazwy folderów, jeśli chcesz.

Czy system Windows w jakiś sposób prezentuje się inaczej niż program, na którym kończy się „Program Files (x86)”?

Wątpię. Większość instalatorów pozwala wybrać niestandardowy folder instalacyjny, więc tak naprawdę nie ma znaczenia, gdzie program zostanie zainstalowany.

Dennis
źródło
Przepraszam, że wymieszałem „pozwolenie” z „zabronić”
Wernfried Domscheit
3

Nie mogę uwierzyć w zamieszanie tutaj ... po pierwsze jestem programistą w pełnym wymiarze godzin.

MS zrobiło to, aby rozwiązać przypadek, w którym biblioteka DLL jest używana zarówno przez starsze aplikacje 32-bitowe, jak i nowsze aplikacje 64-bitowe. Nie można zmienić starszej metody (System32, Pliki programów itp.), Ponieważ spowodowałoby to uszkodzenie starszych programów, których nie można ponownie skompilować.

MS utworzyło folder do przechowywania 64-bitowych programów, zestawów i bibliotek, aby nowe programy mogły łączyć się z odpowiednimi bibliotekami, a starsze programy działałyby normalnie.

W obecnej formie biblioteki DLL .Net mogą współistnieć z innymi wersjami na tym samym komputerze. Na przykład możesz mieć Library.1.0.1, Library.1.0.2, Library 1.1.0 itp. A to tylko dla określonego rozmiaru bitu (32 lub 64). Jeśli nie są używane osobne foldery, każdy zestaw musi mieć wersję 32- i 64-bitową. Spowodowałoby to poważne zaśmiecenie katalogu, który zawiera już wiele wersji tego samego zestawu.

To wszystko rzeczy programistów. Jako użytkownik muszę sobie z tym poradzić tylko wtedy, gdy pracuję z 32-bitowym programem na Windows 7 64. I wolę mieć możliwość uruchamiania wersji 32-bitowej i tej samej aplikacji również w wersji 64-bitowej. Kiedy pracuję nad aplikacją 32-bitową, którą muszę skompilować w wersji 64-bitowej, wszystko, co robię, to poinstruowanie kompilatora, aby to zrobił. Nazwy dll i wszystko inne pozostaje takie samo.

Przyczyną tego nie było w Windows 95/98, ponieważ systemy te symulowały 32-bitowe środowisko uruchomieniowe; to nie był prawdziwy 32-bitowy system operacyjny. Udawało 32-bitowe wykonanie z czymś o nazwie „thunking”.

Oto dobra definicja: http://searchwinit.techtarget.com/definition/thunk

Jason Locke
źródło
1
Jak działa 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 \ bla`` lub \blah\32; w obu przypadkach są one rozdzielone. Jeśli już, to obecny sposób oddziela komponenty aplikacji (a także niepotrzebnie kopiuje je, ponieważ niewiele aplikacji używa CommonFileszasobów itp. Poza tym sprawiasz, że brzmi to tak, jakby aplikacje wyrzucały swoje biblioteki DLL we wspólnym segmencie. Łatwo jest zachować 32-bitowe biblioteki DLL z 32-bitowymi
wersjami exe
Aha, a jeśli chodzi o 95/98, kto powiedział coś na ten temat? Nawet XP miał 16-bitowy podsystem (NTVDM).
Synetech
Myślałem, że chcesz wyjaśnienia. Niewiele aplikacji korzysta z CommonFiles? Mam 35 różnych aplikacji, które mają tam wpisy. Jest to bezpieczniejsze miejsce do przechowywania współdzielonych komponentów niż katalog System32. Twoje stwierdzenie, że używa go niewiele aplikacji, jest dyskusyjne. Cytując: „Nie musieli przeskakiwać przez te obręcze, aby pozwolić na programy 32-bitowe i 16-bitowe w tym samym systemie. Nie przypominam sobie, aby kiedykolwiek widziałem ProgramFiles (16) lub niektórych takich [...] Część, że jest to robione jako wygoda dla programistów, jest rozsądna. ” Cóż, tak ... programiści tak. W końcu piszemy aplikacje.
Jason Locke
Hę?
Synetech
Po prostu przeczytaj to ponownie. Powiedział to lepiej w swoich odpowiedziach - superuser.com/a/442253/142951 . Jeśli nie jesteś programistą, cel może nie być widoczny.
Jason Locke
0

To wcale nie jest konieczne. Na przykład na działającym komputerze instaluję każdą aplikację w folderze C:\MyPrograms\, aby oddzielić ją od aplikacji zainstalowanych przez nasz dział IT.

Oczywiście nie pozwala mi to zainstalować obu wersji (32- i 64-bitowej) jednej aplikacji, ale w moim przypadku nie stanowi to problemu.

Za każdym razem, gdy uruchamiasz program, zawsze najpierw C:\Windows\System32\ntdll.dlluruchamiana jest biblioteka DLL . Ta biblioteka DLL określa, czy Twój program jest aplikacją 32- czy 64-bitową. W zależności od tego następuje przekierowanie na WoW64które jest już wspomniane w kilku odpowiedziach.

Wernfried Domscheit
źródło