Чому для 64-розрядної Windows потрібна окрема папка "Program Files (x86)"?


178

Я знаю, що в 64-бітній версії Windows папка "Program Files" призначена для 64-бітних програм, а папка "Program Files (x86)" - для 32-бітних програм, але навіщо це взагалі потрібно?

Під "необхідним" я не маю на увазі "чому Microsoft не міг приймати будь-яких інших дизайнерських рішень?" бо вони, звичайно, могли. Я маю на увазі, "чому, зважаючи на сучасний дизайн 64-бітної Windows, 32-бітні програми повинні мати окрему папку верхнього рівня від 64-бітних програм?" По-іншому, "що піде не так, якби я якось уникнув механізму перенаправлення і змусив все встановити до реального C:\Program Files\?"

Про Super User та інших місцях виникає багато питань, які стверджують, що "один призначений для 32-бітних програм, один - для 64-бітних програм", але жодне, що я можу знайти, не дає причини. Виходячи з мого досвіду, це не схоже , має значення, чи встановлена 32-розрядна програма в правильному місці чи ні.

Чи якимось чином Windows по-різному представляє себе програмою, у якої закінчується програма «Файли програм (x86)»? Чи є опис, який показує, що саме відрізняється для програми, встановленої в "Program Files (x86)" замість "Program Program Files"? Я думаю, що навряд чи Microsoft введе нову папку без законних технічних причин.


13
Замість того, щоб відповісти на ваше запитання, я би запитав - як би ви обробляли \ програмні файли \ загальні файли?
sgmoore

8
Відповідь з одним лайнером (а отже, і коментар): оскільки ви можете легко запускати будь-яку програму з будь-якої папки, не знаючи її архітектури, то явно немає обов'язкової причини цього роз'єднання. Справа в зручності підтримувати подвійні установки додатків з обома архітектурами . У деяких випадках це має значення, оскільки це не обов'язково прості перекомпіляції. Основна проблема полягає в тому, що 32-бітні програми не можуть завантажувати 64 бітові dll, тому зазвичай не можна встановлювати обидві версії в одному місці. Інша альтернатива - це наявність двох папок «бін» для кожного додатка.
Склівз

1
@Synetech У мене навіть були програми, встановлені під (x86) просто для того, щоб мати двійкові файли x64 .. Іноді це жахливо.
sinni800

10
Мені завжди було цікаво, чому Microsoft не помістила 64-розрядні програми в "Файли програм (x64)" замість * переміщення "каталогу" застарілих програмних файлів у файли програм (x86)
LawrenceC

30
Бардак про диференціацію 64/32 - бітовим, що / Windows / System32 містить зміст 64 - бітної, в той час як / Windows / SysWOW64 містить 32 - бітний матеріал ...
пхати

Відповіді:


92

Коротка відповідь: Для забезпечення застарілих 32-бітних програм продовжують працювати так само, як раніше, без нав'язування некрасивих правил для 64-розрядних додатків, які створювали б постійний безлад.

Це не обов'язково. Це просто зручніше, ніж інші можливі рішення, такі як вимагати від кожної програми створити свій власний спосіб відокремити 32-бітні DLL-файли та виконувані файли від 64-бітних DLL-файлів та виконуваних файлів.

Основна причина полягає в тому, щоб 32-розрядні програми, які навіть не знають, що існують 64-бітні системи, "просто працювали", навіть якщо 64-бітні DLL встановлені там, де вони можуть виглядати. 32-розрядний додаток не зможе завантажити 64-бітну DLL, тому потрібен метод, щоб переконатися, що 32-розрядний додаток (який може мати попередню 64-бітну систему і, таким чином, не мати 64-бітових файлів уявлення) навіть існувати) не знайде 64-бітну DLL, спробуйте завантажити її, вийти з ладу та генерувати повідомлення про помилку.

Найпростішим рішенням цього є послідовно окремі каталоги. Дійсно, єдиною альтернативою є вимагати від кожного 64-розрядного додатка "приховувати" свої виконувані файли де-небудь, де 32-бітний додаток не виглядатиме, як-от bin64каталог у цій програмі. Але це накладе постійну неподобство на 64-бітні системи просто для підтримки застарілих додатків.


52
Їм не довелося стрибати через ці обручі, щоб дозволити 32-бітні та 16-бітні програми в одній системі. Я не пригадую, щоб ніколи бачив когось такого ProgramFiles (16)чи іншого. Крім того, як саме 32-розрядна програма "знайде 64-бітну DLL і спробує завантажити"? Які програми охоплюють полювання на випадкових DLL %programfiles%? Якщо це спільна DLL, то вона переходить у WinSxS; якщо це не спільне використання, тоді керувати власними DLL-програмами залежить від програміста. Розумна частина про це робиться як зручність для програмістів, хоча розумна.
Synetech

30
IIRC Win3.1 не мав каталогу програмних файлів (або більшість програм ігнорували його); як наслідок, не було б жодних застарілих додатків win16, які шукають речі в програмних файлах для початку. Натомість бібліотеки загального користування IIRC часто були розміщені десь у самій папці Windows. Артефактом цього є Win32, що має windows \ system та windows \ system32.
Ден Нілі

15
Windows 3.1 не підтримувала довгих імен файлів, тому не могла мати папку «програмні файли».
Дарт Егрегійний

14
@JarrodRoberson: Якраз навпаки, це тому, що Microsoft дуже сумісно підтримує сумісність.
Девід Шварц

24
@Jarrod: Насправді, як знає кожен розробник, Microsoft занадто високо цінує зворотну сумісність . Буквально кожен API, який вони мають, має застарілі методи, які вони відмовляються видаляти, і часто серйозні помилки вони відмовляються виправляти, оскільки бояться зламати старіші програми, написані для цього API. Те саме стосується більшості API, але не в будь-якому місці поблизу існуючих Microsoft.
BlueRaja - Danny Pflughoeft

65

Це дозволяє встановити як 32-бітну, так і 64-бітну версію програми, не переробляючи її.


Переглянувши цю відповідь та нитку коментарів наступного дня, я усвідомлюю можливий серйозний контроль у своїй відповіді. Я помилково припустив програмування, і коли я говорив про вас у своїх коментарях, я мав на увазі не користувача, а програміста.

Я не працюю в Microsoft, і я не маю поняття, в чому полягає справжня аргументація цих папок, але я думаю, що причина цих папок така очевидна, що я не маю жодних проблем аргументувати це.

Тож давайте розбимо його!

  1. Папки дивовижні!

    Давайте домовимось про щось. Папки чудові! Нам вони не потрібні, у нас достатньо можливих імен файлів, щоб помістити кожен окремий файл у корінь вашого жорсткого диска, так навіщо взагалі папки?

    Ну, вони допомагають нам замовити наші речі. І замовити речі - це чудово. Це допомагає нам легше обробляти речі. Це особливо корисно при роботі з машиною, яка потребує структури.

  2. Відокремлення даних та логіки - це чудово!

    Парадигма, яка часто зустрічається в програмуванні, полягає в відокремленні даних від логіки. Ви хочете , щоб одна частина , яка знає , як зробити що - то і ви хочете іншу частину , яку ви можете зробити що - то з .

    Це також є у файловій системі.

    У нас є папки для додатків (логіка) та папки для наших цінностей (даних):

    Логіка

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

    Дані

    • %PROGRAMDATA%
    • %HOMEDRIVE%%HOMEPATH%

    Отже, схоже, що папки є приголомшливими, і є сенс помістити програми у свою маленьку папку. Але навіщо 2? Чому б не дозволити інсталятору це впоратися і помістити все в одну Programsпапку?

  3. Інсталятори - це не магія

    Сьогодні ми часто використовуємо невеликі програми для встановлення наших більших програм. Ми називаємо цих невеликих установців програм .

    Інсталятори - це не магія. Вони повинні бути написані програмістами і є програмами (з можливими помилками), як і будь-яка інша програма там. Тож давайте подивимось на ситуацію, з якою уявний програміст мав би стикатися з діючою системою і без неї:

    1 Папка програмних файлів

    Розробник підтримує 2 монтажника. Один для 32-бітової та 64-бітової версії його програми. 32- C:\Program Files\App\бітний інсталятор запише в, а 64-бітний інсталятор запише в C:\Program Files\App\sixtyfour\.

    2 Папки програмних файлів

    Розробник підтримує 1 інсталятора. Програма установки завжди буде писати %PROGRAMFILES%і залежить від операційної системи , щоб розширити дорогу відповідним чином (ви на самому ділі не використовувати змінні середовища для цих випадків ви будете використовувати SHGetKnownFolderPath з , FOLDERID_ProgramFilesщоб отримати правильний шлях).
    Все знаходить своє місце автоматично, і шаблон є ідентичним для кожного встановленого додатку .

  4. Послідовність має сенс

    Коли ви щось дізнаєтесь , це зазвичай означає, що спостережувана поведінка була послідовною. Інакше насправді нема чого спостерігати та вчитися.

    Те саме стосується нашої малої файлової системи. Має сенс завжди ставити одні і ті ж речі в одні і ті ж папки. Таким чином, ми будемо знати, куди шукати, коли щось шукаємо.

    Система розрізнення додатків 32/64 сприяє цій меті. Програми розділені на 2 місця, щоб уникнути конфліктів у іменах, поведінки бінарного завантаження та безпеки (певною мірою).

Я досі не розумію. Це здається марним

Ніколи не слід забувати одне. Люди неймовірно дурні. Сюди входять користувачі, суперкористувачі та особливо програмісти.

Ось чому нам потрібні такі речі, як перенаправлення файлової системи, щоб навіть зробити наші системи зручними.

Програмісти просто зайдуть туди і спробують завантажити C:\Windows\system32\awesome.dllі не хвилюватися, чи працюють вони в 32 або 64 бітній системі. Вони спробують завантажити 64-бітну DLL і просто розбиться. Деякі програмісти хочуть використовувати деякі Office DLL, без проблем, вони знають, де його знайти! C:\Program Files\Microsoft\Office\14.0\wizards.dll... і черговий крах!

Усі ці запити 32-бітової програми переспрямовуються на 32-бітові аналоги, щоб уникнути збоїв програми.

Нам потрібні кілька фіксованих імен папок для створення такої системи. Якщо немає структури папок, яка б підтримувала це перенаправлення, то як ви збираєтеся змусити його працювати?

Гаразд, тепер я зрозумів. Але чому б C:\Program Files\x86\тоді не використовувати ?

Тепер ми отримуємо філософські ...

Що піде не так, якби я якось уникнув механізму перенаправлення і змусив все встановити до реального C:\Program Files\?

Швидше за все, нічого (доки інші програми не залежать від певного місця для цієї програми).

У WOW64 механізм гачки в CreateProcessі буде виконувати більш складні (складніші , ніж перевірка ім'я папки виконуваного файлу) перевіряє на виконуваний образ , щоб визначити , якщо вона становить 32 або 64 біта.

Так, але я маю на увазі, як, ВСІ додатки!

  • Що буде, якби я вставив і дизель, і газ у свій автомобіль?
  • Що станеться, якщо я спробую використовувати як змінний, так і постійний струм на одній лінії?
  • Що буде, якщо я тримаю і свою кішку, і свою рибку в одному акваріумі?

На деякі запитання не потрібні відповіді. Це не планується робити, не робіть цього. Тут нічого не можна отримати. Кількість проблем, які така зміна може спричинити, завжди перевищує будь-які можливі вигоди, які хтось у цьому може побачити.


3
Це ж первісна причина? Не можу я просто встановити додаток C:\Program Files\App32і C:\Program Files\App64?
Стівен Дженнінгс

4
@StephenJennings: Але для цього потрібно буде прийняти рішення вручну. Тепер він працює автоматично, оскільки Windows знає, яку папку потрібно надати, коли програма зателефонує, SHGetSpecialFolderPathщоб визначити місце встановлення.
Der Hochstapler

6
@Synetech: Навіщо встановлювати %PROGRAMFILES%в першу чергу? Чому б не помістити 32-бітну версію на робочий стіл користувачів, а 64-бітну в кошик? Тільки тому, що це можна зробити, не означає, що це гарна ідея. Вибачте, я не дотримуюся ваших міркувань.
Der Hochstapler

4
@Synetech: Так, ви справді дали хороший приклад того, як це можна зробити. Ще один ідеально хороший приклад того, як це можна зробити, - це те, як це відбувається насправді. Просто записати файл у% PROGRAMFILES% та бути впевненим, що він потрапить у потрібну папку - одне. Перевірка для себе, яка папка є правильною, - це інша. Якщо ви насправді не бачите переваги колишнього підходу, то я не зможу вас переконати. Питання полягало в тому, чому є 2 папки. Я вважаю, що моя відповідь є цілком розумною в цьому плані.
Der Hochstapler

3
@OliverSalzburg, Не зовсім. Питання полягає в тому, чому дві папки потрібно , а НЕ чому це . Насправді він навіть відважив це: чому це взагалі потрібно? Ви не пояснили, чому це потрібно, і приклад, який я наводив (і навіть ваш власний саркастичний приклад) просто показує, що це не потрібно робити так, як є.
Synetech

14

TL; DR:

Підсумовуючи, ні, це не обов’язково ; вони могли б використовувати одну папку, і ні, Windows не представляє себе інакше програмою, що запускається з того чи іншого місця.


Ну, начебто, всі кидають свою думку з цього приводу, тож я підкину свої 2 ¢. Інші вже здогадалися про причини, чому Microsoft вирішила створити окремі папки верхнього рівня для 32-бітної та 64-бітної версій програм, тому я залишу цю частину (найкращою причиною було пояснення Девіда, що це як зручність для програмістів). Звичайно, навіть тоді це не зовсім вирішує прямий питання, чому це взагалі потрібно? , на що імовірно відповідає: це не так .

Натомість я торкнуся основного питання

Чи якимось чином Windows по-різному представляє себе програмою, у якої закінчується програма «Файли програм (x86)»?

Не дуже, але розташування програми може вплинути на поведінку, але не так, як ви думаєте.

Під час запуску програми Windows встановлює середовище, в якому її запускати (я маю на увазі пам'ять, адресу тощо, а не лише змінні середовища). Це середовище залежить від вмісту виконуваного файлу (32-розрядні та 64-бітні програми внутрішньо відрізняються). Коли ви запускаєте 32-бітну програму в 64-бітній системі, вона працює в 32-бітній підсистемі, яка імітує 32-бітове середовище. Він називається WoW64 (WoW64 розшифровується як Windows у Windows 64-розрядному ) і схожий на те, як 16-бітні додатки запускалися в XP за допомогою NTVDM .

Якщо ви запускаєте програму з правами адміністратора або без них, це впливає на її запуск, але розташування не повинно впливати на це (хоча є деякі приклади залежності розташування, як, наприклад, деякі драйвери).

(Я використовую інший комп'ютер, тому я не можу покладатися на мою історію браузера , щоб повернутися назад мої кроки, але на інший день, відповідаючи на цей СУ питання я закінчив в цьому SO питання , який змусив мене Google PROCESSOR_ARCHITEW6432 , які призводять до цим SO питання і це повідомлення в блозі Microsoft .)

Десь по дорозі я прочитав пост StackOverflow про те, як змінна envirnoment %processor_architecutre% дає різні результати залежно від того, звідки ви запускаєте командний рядок (спробую знайти точну цитату).

Відповідь виявилася обумовленою тим, чи запускалася 32-бітна або 64-бітна версія командного рядка (тобто, з System32\або SysWoW64\). Іншими словами, хоча розташування, схоже, впливає на поведінку програми, це лише тому, що існують різні версії програми, а не тому, що Windows трактує папку особливим чином.

Це має сенс, оскільки вміст файлу, що виконується, диктує, чи є він 32-бітним, або 64-розрядним, тому ви можете помістити як 32-бітну, так і 64-бітну копію тієї самої програми (наприклад, foobar32.exeі foobar64.exe) у ту саму папку та коли виконайте їх, вони будуть завантажені правильно (64-розрядна версія буде запускатися спочатку, а 32-розрядна - запускається в емуляційному шарі WoW64).

FreePascal дозволяє встановити як DOS і Windows , версії , і вони йдуть в тій же папці: %programfiles%\FreePascal. Він керує різними архітектурами, зберігаючи виконувані файли ( .exe, .sys, .dll, .ovrі т.д.) в окремих папках і обмін файлів ресурси як зображення, вихідний-файли і т.д.) Там немає технічних причин , що це не може бути зроблено також для 32- і 64-розрядні версії програми. Як сказав Девід, програмісту просто легше, якщо вони тримаються окремо (тобто, використовуючи змінні, щоб зробити вигляд, що існує лише один набір файлів тощо).


Помста голосуванню! Муахахаха! зітхання
Synetech

Дивне голосування дивно: \. До речі, добре поясніть +1.
avirk

11

Ще одна причина полягає в тому, що більшість програм, що використовують змінні середовища, такі як% PROGRAMFILES%, щоб вказати, де їх програма була встановлена. Для 64-бітних програм він переходить у звичайне місце. Для 32-бітових програм це буде перенаправлено на нову Program Files (x86)папку.

Хоча, принаймні, з новими матеріалами .Net у Visual Studio, тепер у них є змінна App.Local, яка виключає всю потребу в цьому.


4
Це не пояснює це. Хто саме використовує змінну середовища, і чому б це було байдуже, чи є програма 32-бітною або 64-бітовою?
Synetech

4
@Synetech - автор програм використовує змінну середовища. Щодо причини, яка б це хвилювала, - це посилання на dll. Ви не можете завантажити 32-розрядний dll під час 64-бітного процесу і навпаки.
Рамхаунд

1
І як це зробити %programfiles%, %programfiles(x86)%чи %programw6432%змінити це? Будь-які спільні DLL-файли переходять у єдиний каталог WinSxS, а будь-які DLL-файли, що не поділяються спільно, знаходяться саме там із виконуваним файлом. Це має значення лише в тому випадку, якщо ви з якоїсь причини встановили 32-бітну і 64-бітну версії однієї і тієї ж програми, і навіть тоді ви б зберегли 32-бітні DLL-файли з 32-бітним виконуваним файлом і 64-бітною DLL з 64-бітний виконуваний файл. Це можна зробити так: %programfiles%\CoolApp\bin\32і% programfiles% \ CoolApp \ bin \ 64`, чому окремі папки верхнього рівня?
Synetech

@Synetech Впевнений, що це робить; % programfiles% вже деякий час. Якщо ви встановите 32-бітну програму на 64-розрядний комп'ютер, наявність одного місця може спричинити проблеми для 32-розрядного додатка. WoW, хоча може перенаправити% programfile% на (x86) версію для 32-бітних додатків, а не-x86 версію для 64.
Енді,

Я думаю, що люди не були б такими розгубленими, якби не було неявного перенаправлення
kommradHomer

8

Рішенням Microsoft для цього переходу з 32-розрядної на 64-бітну було додати застарілу підтримку більшості 32-бітних програм. Іншими словами, більшість 32-бітних додатків працюватимуть у 64-бітному операційному середовищі. Майте на увазі, що інші операційні системи, що працюють на 64-бітній архітектурі, взагалі не можуть завантажувати або запускати 32-бітні програми.

Щоб полегшити перехід, Microsoft призначила, що всі 32-розрядні програми за замовчуванням повинні завантажуватися в папку Program Files (x86), а не змішуватися з справжніми 64-бітовими програмами у звичайній папці Program Files.

Джерело

"що піде не так, якби я якось уникнув механізму перенаправлення і змусив усе встановити на справжні файли програм C: \ Program Files \?"

Нічого. Два програмні каталоги призначені лише для організації або для того, щоб тримати програми, які мають дві версії, 32-бітну та 64-бітну версію, окремо, як Internet Explorer. Але ви можете встановити 32-бітну програму в "Файли програм" та 64-бітну програму в "Файли програм x86", і нічого не відбудеться, програма запустить те саме.

Вікі каже:

Деякі інсталятори додатків відкидають пробіли в місці розташування шляху. Для 32-бітних систем коротка назва папки Program Files - Progra ~ 1 . Для 64-бітних систем коротка назва 64-бітної папки програмних файлів - Progra ~ 1 (те саме, що і для 32-бітних систем); в той час як коротка назва 32-розрядної папки програмних файлів (x86) тепер Progra ~ 2 .


1
Хе-хе. Приємна стаття. Коментарі до цієї статті звучать точно так само, як і тут. Гірше, що ця стаття була більш ніж два роки тому, що лише показує, що це питання не нове, і якщо на нього все ще не можна відповісти авторитетно, то, мабуть, воно ніколи не буде (якщо хтось із команди Windows не зазіхає). Ну добре, я гадаю, що ми повинні просто перестати хвилюватися і навчитися любити бомбу, я маю на увазі жити з нею. +1 Зазначивши статтю та показавши, що це питання існувало так довго.
Synetech

1
@Synetech дякую! Так, ідея розміщення посилання на статтю така ж, як і у вас. Це дуже давнє питання, але IDK, чому люди ще не могли його отримати. Однак МС має написати КБ або Документацію для цієї проблеми :)
avirk

Так, вони повинні, тим більше, що це не просто розробники, а запитують про це навіть звичайні користувачі. На жаль, документація Microsoft не часто є надто хорошою.
Synetech

@Synetech yup! Документація на MS висмоктує більшість часу. Але так, вони теж написали кілька хороших статей, і я майже впевнений, що вони піддаються підрахунку;)
avirk

6

Причина полягає в тому, щоб оновити програму до 64-розрядних програм простіше для розробників. Їм не потрібно писати спеціальний код, щоб перевірити програму в одному каталозі при компіляції в 32-бітному режимі та в іншому каталозі при компіляції в 64-бітному режимі; вони просто перевіряють C:\Program Files, а при запуску в 32-бітному режимі це автоматично змінюється на C:\Program Files (x86)64-бітну Windows. Так само записи реєстру виділяються між 32-бітними та 64-бітовими програмами.

Це запобігає виникненню конфліктів від невідомих розробників, які просто змінюють свій режим компіляції на 64-розрядний, не задумуючись над цим, і запобігає величезній роботі для розробників, які хочуть, щоб користувачі могли встановити як 32-, так і 64-бітні версії своїх програмне забезпечення одночасно.


Але чому будь-яка програма хоче дозволити встановити обидві версії одночасно? Один приклад: Photoshop та IE мають розширення, які є рідними .dll. У вас не може бути 32-і 64-бітний код, змішаний в одному і тому ж процесі, тому доповнення до 32-бітної версії не можна використовувати з 64-бітною версією, і навпаки. Таким чином, Photoshop / IE повинні дозволити встановлення обох версій або ризикувати порушенням їх величезної бази існуючих доповнень.


2
+1 Принаймні ви вирішили основне питання, чому середні користувачі мають обидві версії.
Synetech

5

Програми, що працюють у програмі «Файли програм (x86)», використовують підсистему WOW64 (32-розрядна версія Windows у 64-бітному Windows - це набір драйверів та API, призначених для запуску програм x32 через архітектурну систему x64):

Підсистема WoW64 містить легкий рівень сумісності, який має подібні інтерфейси для всіх 64-бітних версій Windows. Він спрямований на створення 32-бітного середовища, яке забезпечує інтерфейси, необхідні для запуску немодифікованих 32-бітних програм Windows у 64-бітній системі. Технічно WoW64 реалізований за допомогою трьох бібліотек динамічного зв'язку (DLL):

  • Wow64.dll, основний інтерфейс до ядра Windows NT, який перекладає між 32-бітними та 64-бітовими дзвінками, включаючи маніпуляції зі вказівниками та стеком викликів
  • Wow64win.dll, який забезпечує відповідні точки входу для 32-бітних програм
  • Wow64cpu.dll, який піклується про переключення процесора з 32-бітного в 64-бітний режим

64-бітній системі потрібно «емулювати» 32-бітні програми, тому Windows потребує «розділення» двох папок програмних файлів.


7
Але чому це потрібно розміщувати в різних папках? Windows вже цілком здатна визначити архітектуру виконуваного файлу, переглянувши заголовок PE. Чому він не може завантажити відповідне середовище, коли він завантажує виконуваний файл?
Synetech

1
Я думаю, що це лише вибір від Microsoft, щоб легко показати користувачам, яку архітектуру вони хочуть, з двох версій програми під час відкриття програми. Я маю на увазі, якби не було цих двох папок і якби воно було прозорим для користувачів (якщо воно перемикається автоматично), вони б не знали, чи запускає додаток 32 або 64 біт, навіть вони не знали б, яку програму відкрити якщо працює на 64 біта ..
Diogo

1
64-бітна версія IE має репутацію жахливої.
Семюел Едвін Уорд

1
MS рекомендує використовувати office32, якщо ви не працюєте з наборами даних досить великими, щоб перевищувати обмеження в пам'яті. Я вважаю за необхідність перекомпілювати бінарні аддони для роботи з office64; у поєднанні з тим, що не надавати жодних переваг у звичайних випадках використання, стоїть за рішенням.
Ден Нілі

1
Я думаю, ви побачите, що 64-розрядна програма, явно встановлена ​​в папку Program Files (x86), буде працювати нормально (і, в більшості випадків, навпаки). Windows не використовує розташування папок для визначення способу поводження з виконуваним файлом.
Гаррі Джонстон

5

Цікаво, що відповіді тут і в Інтернеті досить різняться. Знайти точну відповідь на це важливе питання стало проблемою. Здається, що в Інтернеті представлено досить багато неправдивої інформації, що призводить до плутанини.

Я провів значну кількість досліджень і зробив такий висновок, який, на мою думку, є точним:

  • Це не має значення, де зберігається додаток. Під час виконання Windows визначає, чи є програма 32-бітною або 64-розрядною, і автоматично використовувати відповідний розділ DLL та реєстр.

Це відбувається автоматично і не залежить від місця зберігання програми. Немає швидкості, надійності та інших функціональних переваг, якщо мати окремі 32-бітні та 64-бітні папки.

Єдиною причиною поділу за замовчуванням на дві папки ("Файли програми" та "Файли програми (x86)") є те, що якщо у вас є дві версії однієї програми (32-бітна та 64-бітна версія), вона забезпечує простий спосіб тримати окремі файли, що перекриваються. Навіть у цьому випадку, поки всі імена файлів є унікальними, вони фактично можуть існувати в одній папці без жодних наслідків.

Існує застереження до вищенаведеного висновку, і це одне із погано кодованих застосувань. Якщо у додатку є будь-які контури, вкладені в нього, він буде використовувати лише цей шлях. Як правило, шляхи ніколи не повинні бути жорстко закодовані в додаток, але іноді програміст буде робити цю помилку. У цьому випадку програма використовуватиме твердо кодований шлях; каталог, в якому встановлено додаток, не вплине на те, де він насправді шукає файли.


3

Наявність відокремлення папок дозволяє зберігати вбудовані 64-бітні програми та ті, для яких потрібен WoW64 .

Це може бути корисно - як уже зазначав @OliverSalzburg , - якщо ви хочете встановити 64-розрядний та 32-розрядний веб-браузер (наприклад), оскільки деякі додатки та додатки можуть бути доступні лише для одного з два.

Наявність роздільної папки робить це розділення автоматичним , використовуючи такі методи, як перенаправлення реєстру .

Припустимо, інсталятор намагається визначити папку програмних програм, читаючи реєстр, використовуючи, наприклад, RegQueryValueEx .

У будь-якому випадку він намагається прочитати ключ реєстру

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

що зазвичай вказує на C:\Program Files.

Однак якщо інсталятор є 32-розрядним додатком, перенаправлення реєстру призведе до ключа реєстрації

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

читати замість цього, що зазвичай вказує на C:\Program Files (x86).

Чому ці конкретні імена папок були використані можна відповісти тільки ті люди , які зробили цей вибір. Ви завжди можете змінити імена папок за замовчуванням, якщо хочете.

Чи якимось чином Windows по-різному представляє себе програмою, у якої закінчується програма «Файли програм (x86)»?

Я сумніваюся в цьому. Більшість інсталяторів дозволяють вибирати власну папку інсталяції, тож насправді не має значення, де встановлюється програма.


Вибачте, що я змішав "дозвіл" з "заборонити"
Вернфрід Домшайт

3

Я не можу повірити в замішання тут. По-перше, я штатний розробник.

MS зробив це для вирішення випадку, коли DLL використовується як старими 32-бітовими програмами, так і новішими 64-бітовими програмами. Не вдалося змінити старіший метод (System32, Program Files тощо), оскільки це порушило б старіші програми, які неможливо перекомпілювати.

Таким чином, MS створила папку для зберігання 64-бітних специфічних програм, збірок та бібліотек, щоб нові програми могли пов'язуватись із належними бібліотеками, а старіші програми продовжували працювати як завжди.

Наразі DLL-файли .Net можуть співіснувати з іншими версіями на тій же машині. Наприклад, ви можете мати Library.1.0.1, Library.1.0.2, Library 1.1.0 і т. Д. І це лише для певного розміру бітів (32 або 64). Якщо окремі папки не використовуються, то кожна збірка повинна мати 32 та 64-бітну версію. Це може сильно захарастити каталог, який вже містить кілька версій однієї збірки.

Це все речі для розробників. Як користувач, я маю справу з цим лише тоді, коли я працюю з 32-розрядною програмою на Windows 7 64. І я вважаю за краще мати можливість запускати 32-бітну версію та те саме додаток і в 64-бітних. Коли я працюю над 32-розрядним додатком, який мені потрібно зібрати в 64-розрядному, я лише скажу компілятору це зробити. Назви Dll та все інше залишаються однаковими.

Причиною цього не було в Windows 95/98 є ті системи, що імітували 32-бітну програму; це була не справжня 32-бітна операційна система. Це підроблене 32-розрядне виконання з чимось назвою "громозахисним".

Ось хороше визначення: http://searchwinit.techtarget.com/definition/thunk


1
Як 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` або \blah\32; так чи інакше, вони розділені. Якщо що-небудь, то поточний спосіб розділяє компоненти програми (а також копіює їх без необхідності, оскільки мало додатків використовує CommonFilesресурси та ін. Крім того, ви створюєте звук так, ніби додатки скидають свої DLL-файли у загальне відро. Достатньо просто зберігати додаток 32-бітні DLL-файли з 32-бітними програмами, а це 64-розрядні DLL-
файли

О, а щодо 95/98, хто про це щось сказав? Навіть XP мав 16-бітну підсистему (NTVDM).
Synetech

Я думав, ти хочеш пояснення. Мало хто використовує CommonFiles? У мене є 35 різних додатків, які мають записи. Це безпечніше місце для зберігання спільних компонентів, ніж каталог System32. Ваша заява про те, що мало програм використовує це, є дискусійною. Цитую вас: "Їм не довелося стрибати через ці обручі, щоб дозволити 32-бітні та 16-бітні програми в одній системі. Я не пригадую, щоб коли-небудь бачив ProgramFiles (16) або деякі подібні [...] Розум про це робиться як зручність для програмістів. Ну так ... програмісти роблять. Ми пишемо додатки.
Джейсон Локк

А?
Synetech

Просто перечитайте це .. він сказав це краще у своїх відповідях - superuser.com/a/442253/142951 . Якщо ви не розробник, ви можете не бачити мети.
Джейсон Локк

0

Це зовсім не обов’язково. Наприклад, на своєму робочому комп’ютері я встановлюю кожну програму в папку C:\MyPrograms\для того, щоб вони були відокремлені від програм, встановлених нашим відділом ІТ.

Звичайно, це заважає мені встановлювати обидві версії (32 та 64 біт) однієї програми, але це не проблема в моєму випадку.

Щоразу, коли ви запускаєте програму, завжди спочатку C:\Windows\System32\ntdll.dllвиконується DLL . Ця DLL визначає, чи є ваша програма 32 або 64 бітною програмою. Залежно від того, на який ви перенаправлені, про WoW64які вже згадується в кількох відповідях.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.