Я знаю, что в 64-разрядной версии Windows папка «Program Files» предназначена для 64-разрядных программ, а папка «Program Files (x86)» - для 32-разрядных программ, но зачем это вообще нужно?
Под «необходимым» я не имею в виду «почему Microsoft не могла принять другие дизайнерские решения»? потому что, конечно, они могли бы иметь. Скорее, я имею в виду, «почему, учитывая текущий дизайн 64-битной Windows, 32-битные программы должны иметь отдельную папку верхнего уровня из 64-битных программ?» Другими словами, «что может пойти не так, если я каким-то образом избегу механизма перенаправления и заставлю все установить на реальный C:\Program Files\
?»
Есть много вопросов о Super User и других местах, которые утверждают, что «один для 32-битных программ, другой для 64-битных программ», но ни один, который я не могу найти, объясняет причину. Исходя из моего опыта, это не похоже , имеет значения, установлена ли 32-разрядная программа в правильном месте или нет.
Windows как-то отличается от программы, в которой не хватает «Program Files (x86)»? Есть ли описание, которое показывает, что именно отличается от программы, установленной в «Program Files (x86)» вместо «Program Files»? Я думаю, что вряд ли Microsoft представит новую папку без уважительной технической причины.
Ответы:
Краткий ответ: для обеспечения того, чтобы унаследованные 32-разрядные приложения продолжали работать так же, как раньше, без навязывания некрасивых правил для 64-разрядных приложений, которые создавали бы постоянный беспорядок.
Это не обязательно. Это просто удобнее, чем другие возможные решения, такие как требование, чтобы каждое приложение создавало свой собственный способ отделения 32-разрядных библиотек DLL и исполняемых файлов от 64-разрядных библиотек DLL и исполняемых файлов.
Основная причина заключается в том, что 32-разрядные приложения, которые даже не знают о существовании 64-разрядных систем, «просто работают», даже если 64-разрядные библиотеки DLL установлены в местах, где приложения могут выглядеть. 32-битное приложение не сможет загружать 64-битную DLL, поэтому был необходим метод, чтобы гарантировать, что 32-битное приложение (которое может предшествовать 64-битным системам и, следовательно, не имеет представления о 64-битных файлах) даже не существует) не найдет 64-битную DLL, попробуйте загрузить ее, не удалось, а затем сгенерировать сообщение об ошибке.
Самое простое решение для этого - последовательно отдельные каталоги. На самом деле единственная альтернатива - требовать от каждого 64-разрядного приложения «прятать» свои исполняемые файлы там, где 32-разрядное приложение не будет выглядеть, например, в
bin64
каталоге внутри этого приложения. Но это наложило бы постоянное уродство на 64-битные системы только для поддержки устаревших приложений.источник
ProgramFiles (16)
или некоторые такие. Кроме того, как именно 32-битная программа «найдет 64-битную DLL и попытается ее загрузить»? В каких программах охотятся за случайными DLL%programfiles%
? Если это общая DLL, то она идет в WinSxS; если он не является общим, то программист может самостоятельно управлять своими DLL. Часть о том, что это делается для удобства программистов, разумна.Это позволяет вам устанавливать как 32-битную, так и 64-битную версию приложения без перезаписи.
Посмотрев этот ответ и цепочку комментариев на следующий день, я осознал возможный серьезный недосмотр в своем ответе. Я ложно предположил опыт программирования, и когда я говорил о вас в своих комментариях, я имел в виду не пользователя, а программиста.
Я не работаю на Microsoft, и я понятия не имею, какова реальная причина этих папок, но я думаю, что причина наличия этих папок настолько очевидна, что у меня нет проблем с этим спорить.
Итак, давайте разберемся!
Папки потрясающие!
Давайте договоримся о чем-то. Папки отличные! Они нам не нужны, у нас достаточно возможных имен файлов, чтобы поместить каждый отдельный файл в корень жесткого диска, так зачем вообще иметь папки?
Ну, они помогают нам заказать наши вещи. И заказывать вещи отлично. Это помогает нам легче обрабатывать вещи. Это особенно полезно при работе с машиной, которая требует структуры.
Разделение данных и логики это здорово!
Парадигма, часто встречающаяся в программировании, заключается в отделении данных от логики. Вы хотите , чтобы одна часть , которая знает , как сделать что - то и вы хотите другую часть , которую вы можете сделать что - то с .
Это также находится в файловой системе.
У нас есть папки для приложения (логика) и папки для наших ценностей (данных):
логика
%WINDIR%
%PROGRAMFILES%
%PROGRAMFILES(x86)%
Данные
%PROGRAMDATA%
%HOMEDRIVE%%HOMEPATH%
Таким образом, кажется, что папки - это круто, и имеет смысл помещать программы в свою маленькую папку. Но почему 2? Почему бы не позволить установщику справиться с этим и поместить все в одну
Programs
папку?Установщики не волшебны
Сегодня мы часто используем небольшие программы для установки наших больших программ. Мы называем эти маленькие программы- установщики .
Установщики не волшебство. Они должны быть написаны программистами и являются приложениями (с возможными ошибками), как и любое другое приложение. Итак, давайте посмотрим на ситуацию, с которой воображаемому программисту придется столкнуться при наличии и отсутствии текущей системы:
1 папка Program Files
Разработчик поддерживает 2 установщика. Один для 32-битной и один для 64-битной версии его приложения. 32-битный установщик запишет,
C:\Program Files\App\
а 64-битный установщик запишетC:\Program Files\App\sixtyfour\
.2 папки с программными файлами
Разработчик поддерживает 1 установщик. Программа установки всегда будет писать
%PROGRAMFILES%
и зависит от операционной системы , чтобы расширить путь соответствующим образом (вы на самом деле не использовать переменные среды для этих случаев вы будете использовать SHGetKnownFolderPath с ,FOLDERID_ProgramFiles
чтобы получить правильный путь).Все находит свое место автоматически, и шаблон идентичен для каждого приложения, которое вы устанавливаете .
Последовательность имеет смысл
Когда вы чему-то учитесь , это обычно означает, что наблюдаемое поведение было последовательным. Иначе действительно нечего наблюдать и учиться.
То же самое верно для нашей маленькой файловой системы. Имеет смысл всегда помещать один и тот же материал в одни и те же папки. Таким образом, мы будем знать, где искать, когда мы что-то ищем.
Система различения приложений 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-разрядным.Да, но я имею в виду, как, ВСЕ приложения!
Некоторые вопросы не требуют ответов. Это не должно быть сделано, не делайте этого. Здесь нечего получить. Количество проблем, которое может вызвать такое изменение, всегда перевешивает любые возможные выгоды, которые кто-либо может увидеть в этом.
источник
C:\Program Files\App32
иC:\Program Files\App64
?SHGetSpecialFolderPath
для определения места установки.%PROGRAMFILES%
первую очередь? Почему бы не поместить 32-разрядную версию на рабочий стол пользователя, а 64-разрядную - в корзину? То, что это можно сделать, не означает, что это хорошая идея. Извините, я не понимаю ваших рассуждений.TL; DR:
Подводя итог, нет, это не обязательно ; они могли бы использовать одну папку, и нет, Windows не выглядит иначе, чем программа, запускаемая из того или иного места.
Ну, все, кажется, высказывают свое мнение по этому поводу, поэтому я брошу свои 2 ¢. Другие уже предположили причины, по которым Microsoft решила создать отдельные папки верхнего уровня для 32-битных и 64-битных версий программ, поэтому я оставлю эту часть (лучшей причиной было объяснение Дэвида, что это как удобство для программистов). Конечно, даже тогда, это не совсем решает прямой вопрос, почему это вообще необходимо? Ответ на который предположительно: это не так .
Вместо этого я рассмотрю основную часть вопроса
Не совсем, но расположение программы может повлиять на поведение, но не так, как вы думаете.
Когда вы запускаете программу, Windows устанавливает среду, в которой она запускается (я имею в виду память, адресацию и т. Д., А не только переменные среды). Эта среда зависит от содержимого исполняемого файла (32-битные и 64-битные программы внутренне различаются). Когда вы запускаете 32-разрядную программу в 64-разрядной системе, она запускается в 32-разрядной подсистеме, которая эмулирует 32-разрядную среду. Он называется WoW64 (WoW64 означает Windows на 64-битной Windows ) и похож на то, как 16-битные приложения будут запускаться в XP с использованием NTVDM .
Когда вы запускаете программу с правами администратора или без них, это влияет на то, как она работает, но местоположение не должно влиять на нее (хотя есть некоторые примеры зависимости от местоположения, например, некоторые драйверы).
(Я использую другой компьютер, поэтому я не могу полагаться на историю своего браузера, чтобы отследить свои шаги, но на днях, отвечая на этот вопрос SU, я оказался на этом вопросе 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-битные версии программы. Как сказал Дэвид, программисту будет проще, если они будут храниться отдельно (т. Е. Использовать переменные, чтобы они выглядели так, будто существует только один набор файлов и т. Д.)источник
Другая причина в том, что большинство программ использовали переменные среды, такие как% PROGRAMFILES%, чтобы указать, где была установлена их программа. Для 64-битных программ он идет в обычное место. Для 32-битных программ он перенаправит их в новую
Program Files (x86)
папку.Хотя, по крайней мере, с новыми вещами .Net в Visual Studio, у них теперь есть переменная App.Local, которая устраняет всю потребность в этом.
источник
%programfiles%
,%programfiles(x86)%
или%programw6432%
сделать разницу там? Любые разделяемые библиотеки DLL помещаются в один каталог WinSxS, а любые неиспользуемые библиотеки DLL находятся рядом с исполняемым файлом. Это имеет значение только в том случае, если по какой-то причине у вас установлены как 32-разрядные, так и 64-разрядные версии одной и той же программы, и даже тогда вы сохраните 32-разрядные библиотеки DLL с 32-разрядным исполняемым файлом и 64-разрядные библиотеки DLL с 64-битный исполняемый файл. Вы можете сделать это так:%programfiles%\CoolApp\bin\32
а% programfiles% \ CoolApp \ bin \ 64`, почему отдельные папки верхнего уровня?Источник
"что бы пошло не так, если бы я как-то избежал механизма перенаправления и заставил все установить на настоящий C: \ Program Files \?"
Ничего. Два каталога программ предназначены только для организации или для разделения программ с двумя версиями, 32-разрядной и 64-разрядной, например, Internet Explorer. Но вы можете установить 32-разрядную программу в «Program Files» и 64-разрядную программу в «Program Files x86», и ничего не произойдет, программа будет работать одинаково.
Вики говорит:
источник
Причина в том, чтобы сделать обновление программы до 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 должен разрешить установку обеих версий или рискнуть сломать их огромную базу существующих дополнений.
источник
Программы, работающие в «Program Files (x86)», используют подсистему WOW64 (32-битная Windows в 64-битной Windows - это набор драйверов и API, предназначенных для запуска приложений x32 в системе архитектуры x64):
64-битная система должна «эмулировать» 32-битные приложения, поэтому Windows должна «разделять» две папки Program Files.
источник
Интересно, что ответы здесь и в интернете довольно сильно различаются. Найти точный ответ на этот важный вопрос было непросто. Похоже, что в Интернете представлено немало ложной информации, что приводит к путанице.
Я провел значительное количество исследований и сделал следующий вывод, который я считаю точным:
Это происходит автоматически и не зависит от того, где хранится приложение. Отсутствие скорости, надежности или других функциональных преимуществ для отдельных 32-битных и 64-битных папок.
Единственная причина разделения по умолчанию на две папки («Program Files» и «Program Files (x86)») заключается в том, что если у вас есть две версии одной и той же программы (32-битная и 64-битная версия), она обеспечивает простой способ разделять перекрывающиеся файлы. Даже в этом случае, если все имена файлов уникальны, они могут фактически существовать в одной папке без каких-либо последствий.
Существует оговорка к приведенному выше выводу, а именно к плохо закодированным приложениям. Если в приложении есть какие-либо жестко запрограммированные пути, оно будет использовать только этот путь. Как правило, пути никогда не должны быть жестко закодированы в приложении, но иногда программист допускает эту ошибку. В этом случае программа будет использовать жестко заданный путь; каталог, в котором установлено приложение, не влияет на то, где оно фактически ищет файлы.
источник
Необходимость разделять папки позволяет сохранить родные 64-битные приложения и те, которые требуют WoW64, отдельно.
Это может быть полезно - как уже указывал @OliverSalzburg - если вы хотите установить как 64-битный, так и 32-битный веб-браузер (например), так как некоторые плагины и дополнения могут быть доступны только для одного из два.
Необходимость разделять папки делает это разделение автоматическим , используя такие методы, как перенаправление реестра .
Предположим, установщик пытается определить папку с программными файлами, читая реестр с помощью, например, RegQueryValueEx .
В любом случае он пытается прочитать раздел реестра
который обычно указывает на
C:\Program Files
.Однако, если установщик является 32-разрядным приложением, перенаправление реестра вызовет ключ regitry.
читать вместо этого, что обычно указывает на
C:\Program Files (x86)
.Почему эти конкретные имена папок были использованы можно ответить только те люди , которые сделали этот выбор. Вы всегда можете изменить имена папок по умолчанию, если хотите.
Я сомневаюсь. Большинство инсталляторов позволяют вам выбрать пользовательскую папку для установки, поэтому не имеет значения, где установлена программа.
источник
Я не могу поверить в замешательство здесь ... во-первых, я полный рабочий день разработчика.
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-битное исполнение с чем-то под названием "thunking".
Вот хорошее определение: http://searchwinit.techtarget.com/definition/thunk
источник
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 с 64-разрядными библиотекамиЭто совсем не обязательно. Например, на моем рабочем компьютере я устанавливаю каждое приложение в папку
C:\MyPrograms\
, чтобы отделить их от приложений, установленных нашим ИТ-отделом.Конечно, это мешает мне установить обе версии (32- и 64-битную) одного приложения, но в моем случае это не проблема.
Когда вы запускаете программу, всегда
C:\Windows\System32\ntdll.dll
выполняется первая DLL . Эта DLL определяет, является ли ваша программа 32- или 64-битным приложением. В зависимости от того, что вы перенаправлены наWoW64
который уже упоминается в нескольких ответах.источник