Program files x86 что такое: Чем отличаются папки «Program Files (x86)» и «Program Files»
Содержание
В чем разница между папками «Program Files (x86)» и «Program Files» в Windows | PROCompy.ru
Вы наверняка видели на своем компьютере папки «C:\Program Files» и «C:\Program Files (x86)». И наверняка замечали, что программы устанавливаются как в одну паку, так и в другую. Давайте разберемся, почему так.
32-битная и 64-разрядная Windows
Изначально Windows была доступна только в 32-разрядной версии. В данных версиях мы видим только папку «C:\Program Files», которая является рекомендуемым местом для устанавливаемых программ.
В 64-разрядных версиях Windows 64-разрядные приложения устанавливаются в папку Program Files. Однако 64-разрядные версии Windows также поддерживают 32-разрядные программы, и Microsoft не хочет, чтобы 32-битное и 64-битное программное обеспечение смешивались в одном месте. Таким образом, 32-разрядные программы по умолчанию устанавливаются в папку «C: \ Program Files (x86)».
Windows запускает 32-разрядные приложения в 64-разрядных версиях Windows с использованием WOW64. Когда вы запускаете 32-разрядную программу в 64-разрядной версии Windows, уровень эмуляции WOW64 плавно перенаправляет доступ к файлу с «C:\Program Files» на «C:\Program Files (x86)».
Что хранится в каждой папке
Таким образом, в 32-разрядной версии Windows у вас есть только папка «C:\Program Files», которая содержит все установленные 32-разрядные программы.
В 64-разрядной версии Windows 64-разрядные программы хранятся в папке «C:\Program Files», а 32-разрядные программы хранятся в папке «C:\Program Files (x86)».
Вот почему разные программы устанавливаются в разные папки.
Почему они разделяются?
Функция совместимости, предназначенная для старых 32-разрядных программ, которые могут не знать, что 64-разрядная версия Windows вообще существует, поэтому Windows исключает их общение с 64-битным кодом напрямую.
32-разрядные программы не могут загружать 64-разрядные библиотеки ( DLL-файлы ) и могут вылетать, если они попытались загрузить определенный DLL-файл и обнаружили 64-битную версию вместо 32-разрядной. То же самое касается 64-разрядных программ. Наличие независимых программных файлов для разных архитектур процессоров предотвращает подобные ошибки.
Например, предположим, что Windows просто использовала бы одну папку Program Files. 32-разрядное приложение будет искать файл DLL Microsoft Office, найденный в C:\Program Files\Microsoft Office, и попытаться загрузить его. Однако, если у вас установлена 64-разрядная версия Microsoft Office, приложение будет аварийно завершено и не будет работать должным образом, т.к. оно не сможет найти DLL вообще, потому что 64-разрядная версия Microsoft Office будет располагаться по адрему C:\Program Files\Microsoft Office, а 32-разрядное приложение будет искать в C:\Program Files (x86)\Microsoft Office.
Это также помогает, когда разработчик создает как 32-битную, так и 64-разрядную версии приложения, особенно если они должны быть установлены сразу в некоторых ситуациях. 32-разрядная версия автоматически устанавливается в C:\Program Files (x86), а 64-разрядная версия автоматически устанавливается в C:\Program Files. Если Windows использовала одну папку, разработчику приложения пришлось бы установить 64-разрядную папку в другую папку, чтобы разделить их. И, вероятно, не было бы реального стандарта, где разработчики устанавливали разные версии.
Почему 32-битная папка называется (x86)?
Вы не всегда будете видеть «32-разрядные» и «64-битные». Вместо этого вы иногда видите «x86» и «x64» для обозначения этих двух разных архитектур. Это потому, что на ранних компьютерах использовался чип Intel 8086. Исходные чипы были 16-битными, но более новые версии стали 32-битными. «X86» теперь относится ко всем «версиям» до 64-битной архитектуре — будь то 16-разрядная или 32-разрядная. Новую 64-битную архитектуру так же этого называют «x64».
Папка «Program Files (x86)», это папка для программ с использованием старой архитектуры процессора x86. Заметим, однако, что 64-разрядные версии Windows не могут запускать 16-разрядный код .
Это обычно не имеет значения
Обычно не имеет значения, хранятся ли файлы программы в Program Files или Program Files (x86). Windows автоматически устанавливает программы в правильную папку, поэтому вам не нужно об этом думать. Программы отображаются в меню «Пуск» и функционируют нормально, независимо от того, где они установлены. Обе 32-разрядные и 64-разрядные программы должны хранить ваши данные в папках, таких как AppData и ProgramData, а не в любой папке Program Files. Просто позвольте вашим программам автоматически решать, какую папку Program Files использовать.
Иногда вам нужно знать, где хранится программа. Допустим, вы хотите войти в свой каталог Steam для резервного копирования некоторых файлов. Вы найдете его в C:\Program Files (x86), так как Steam — это 32-разрядная программа.
Если вы не знаете какая версия программы у вас установленна 32 или 64-битная, то вы можете посмотреть в диспетчере задач Windows.
В 64-разрядных версиях Windows 32-разрядные программы помечены дополнительным «(32-bit)» текстом, давая вам подсказку, что вы найдете их в C:\Program Files (x86).
определение папки Program Files (x86) или Program Files
zbz
Новичок
#1
Версия AutoIt: 3.
Описание:
помогите пожалуйста максимально упростит скрипт:
If FileExists(@HomeDrive &"\Program Files (x86)\file.exe") Then If FileExists(@HomeDrive &"\Program Files\file.exe") Then Else FileCopy (@ScriptDir &"\file.exe",@HomeDrive & "\Program Files\file.exe") EndIf Else FileCopy (@ScriptDir &"\file.exe",@HomeDrive & "\Program Files (x86)\file.exe") EndIf
hedji
Продвинутый
#2
If Not FileExists(@HomeDrive &"\Program Files (x86)\file.exe") Then FileCopy (@ScriptDir &"\file.exe",@HomeDrive & "\Program Files (x86)\file.exe") ElseIf Not FileExists(@HomeDrive &"\Program Files\file.exe") Then FileCopy (@ScriptDir &"\file.exe",@HomeDrive & "\Program Files\file.exe") EndIf
zbz
Новичок
#3
hedji.
беру на заметку, такое ощущения что есть метод попроще или это окончательное решения?
hedji
Продвинутый
#4
Смотря что именно вы пытаетесь сделать.
В х64 винде есть обе папки Program Files.
В функции FileCopy третий параметр отвечает за перезапись файлов.
Т.е. можно свести до:
FileCopy (@ScriptDir &"\file.exe",@HomeDrive & "\Program Files (x86)\file.exe", 0) FileCopy (@ScriptDir &"\file.exe",@HomeDrive & "\Program Files\file.exe", 0)
Но я не уверен что это именно желаемый результат.
zbz
Новичок
#5
да не желаемый результат. Есть папка с программой (х86) в ~600 мегов, не приемлемо копировать в обе папки Program Files
ra4o
AutoIT Гуру
#6
Можно обойтись всего одной строкой
If Not FileExists(@ProgramFilesDir &'\file.exe') Then FileCopy (@ScriptDir &'\file.exe',@ProgramFilesDir &'\file.exe')
только запускать и компилировать нужно как для х86 .
Более того , достаточно и просто этого:
FileCopy (@ScriptDir &'\file.exe',@ProgramFilesDir &'\file.exe')
С ключем по умолчанию «0» будет копироваться в том случае, если файла нет
Вам необходимо войти или зарегистрироваться, чтобы здесь отвечать.
Поделиться:
Facebook
Twitter
Reddit
Pinterest
Tumblr
WhatsApp
Электронная почта
Поделиться
Ссылка
Z | определение z-порядка для для гуи элемента | Общие вопросы по AutoIt | 3 | |
O | Определение координат курсора мышки на экране | Общие вопросы по AutoIt | 3 | |
S | Определение нажатой кнопки на клавиатуре — 1н раз, 2ва раза, долгое нажатие | Стол заказов | 1 | |
D | Определение числа на сайте | Стол заказов | 0 | |
Определение дочерней папки | Регулярные выражения и прочее | 4 |
определение z-порядка для для гуи элемента |
Определение координат курсора мышки на экране |
Определение нажатой кнопки на клавиатуре — 1н раз, 2ва раза, долгое нажатие |
Определение числа на сайте |
Определение дочерней папки |
windows — как получить переменную x86 env программных файлов?
В 64-разрядной системе Windows чтение различных переменных среды и некоторых ключей реестра Windows перенаправляется в разные источники, в зависимости от того, является ли процесс, выполняющий чтение, 32-разрядным или 64-разрядным.
В таблице ниже перечислены эти источники данных:
X = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion Y = HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion Z = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList ЧТЕНИЕ ПЕРЕМЕННЫХ СРЕДЫ: Источник для 64-битного процесса Источник для 32-битного процесса -------------------------------|------------------ ----------------------|----------------------------------------- -------------------------------------------------- %ProgramFiles% : X\ProgramW6432Dir X\ProgramFilesDir (x86) %ProgramFiles(x86)% : X\ProgramFilesDir (x86) X\ProgramFilesDir (x86) %ProgramW6432% : X\ProgramW6432Dir X\ProgramW6432Dir %CommonProgramFiles% : X\CommonW6432Dir X\CommonFilesDir (x86) %CommonProgramFiles(x86)% : X\CommonFilesDir (x86) X\CommonFilesDir (x86) %CommonProgramW6432% : X\CommonW6432Dir X\CommonW6432Dir %ProgramData% : Z\ProgramData Z\ProgramData ЧТЕНИЕ ЗНАЧЕНИЙ РЕГИСТРА: Источник для 64-битного процесса Источник для 32-битного процесса -------------------------------|------------------ ----------------------|----------------------------------------- -------------------------------------------------- X\ProgramFilesDir : X\ProgramFilesDir Y\ProgramFilesDir X\ProgramFilesDir (x86): X\ProgramFilesDir (x86) Y\ProgramFilesDir (x86) X\ProgramFilesPath : X\ProgramFilesPath = %ProgramFiles% Y\ProgramFilesPath = %ProgramFiles(x86)% X\ProgramW6432Dir : X\ProgramW6432Dir Y\ProgramW6432Dir X\CommonFilesDir : X\CommonFilesDir Y\CommonFilesDir X\CommonFilesDir (x86) : X\CommonFilesDir (x86) Y\CommonFilesDir (x86) X\CommonW6432Dir : X\CommonW6432Dir Y\CommonW6432Dir
Так, например, для 32-разрядного процесса источником данных для переменных среды %ProgramFiles%
и %ProgramFiles(x86)%
является значение реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion \ProgramFilesDir (x86)
.
Однако для 64-разрядного процесса источником данных для переменной среды %ProgramFiles%
является значение реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir
…и источник данные для %ProgramFiles(x86)%
Переменная среды — это значение реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
Большинство установок Windows по умолчанию помещают строку, подобную C:\Program Files (x86)
в значение реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
, но это (и другие) можно изменить.
Все, что введено в эти значения реестра Windows, будет считано проводником Windows в соответствующие переменные среды при входе в систему, а затем скопировано в любой дочерний процесс, который он впоследствии порождает.
Значение реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesPath
особенно примечательно, поскольку в большинстве установок Windows в него помещается строка %ProgramFiles%
, которая может быть прочитана 64-разрядными процессами. Эта строка относится к переменной среды
%ProgramFiles%
, которая, в свою очередь, берет свои данные из значения реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir
… если какая-либо программа не изменит значение этой переменной среды априори. .
Я написал небольшую утилиту, которая отображает эти переменные среды для 64-битных и 32-битных процессов. Вы можете скачать это здесь.
Включен исходный код VisualStudio 2017, а скомпилированные 64-разрядные и 32-разрядные двоичные исполняемые файлы находятся в каталогах ..\x64\Release
и ..\x86\Release
соответственно.
c++ — Почему FOLDERID_ProgramFiles возвращает «C:\Program Files (x86)»?
спросил
Изменено
1 год, 11 месяцев назад
Просмотрено
323 раза
#includeh> #include <иопоток> #include <строка> std::string fun(REFKNOWNFOLDERID val) { ITEMIDLIST* pIDList; если (S_OK == SHGetKnownFolderIDList (val, 0, NULL и pIDList)) { char cpath[MAX_PATH] = {0}; если (ИСТИНА == SHGetPathFromIDList(pIDList, cpath)) вернуть путь; } вернуть «не удалось»; } интервал основной () { std::cout << "--> " << fun(FOLDERID_ProgramFiles) << std::endl; std::cout << "--> " << fun(FOLDERID_ProgramFilesX86) << std::endl; std::cout << "--> " << fun(FOLDERID_ProgramFilesX64) << std::endl; }
Результат:
--> C:\Program Files (x86) --> C:\Program Files (x86) --> не удалось
Я компилирую с помощью cl.exe test.cpp shell32.lib
.
Я ожидал "C:\Program Files" для FOLDERID_ProgramFiles
. Моя система основана на x64. Почему я получаю «Program Files (x86)»?
- С++
- окна
4
Это происходит из-за того, что вы компилируете приложение как 32-битный исполняемый файл, хотя запускаете его в 64-битной системе. Так
FOLDERID_ProgramFiles
сопоставляется с 32-битной папкой Program Files (x86)
.
Это особенно заметно по тому факту, что FOLDERID_ProgramFilesX64
не работает, согласно документации KNOWNFOLDERID
:
FOLDERID_ProgramFilesX64
Это значение не поддерживается в 32-разрядных операционных системах. Также не поддерживается для 32-битных приложений, работающих в 64-битных операционных системах. Попытка использовать FOLDERID_ProgramFilesX64 в любой ситуации приводит к ошибке. Дополнительные сведения см. в разделе «Примечания».
Более подробно это описано в разделе "Примечания" документации:
Интерпретация некоторых значений KNOWNFOLDERID зависит от того, является ли папка частью 32-разрядного или 64-разрядного приложения и работает ли это приложение в 32-разрядной или 64-разрядной операционной системе. Если вашему приложению необходимо различать, например, Program Files и Program Files (x86), вы должны использовать правильный KNOWNFOLDERID для данной ситуации.
В следующих таблицах приведены сведения об использовании KNOWNFOLDERID в этих случаях.
FOLDERID_ProgramFiles
Операционная система Заявка ИЗВЕСТНЫЙ ID Путь по умолчанию Эквивалент CSIDL 32 бита 32 бита FOLDERID_ProgramFiles %SystemDrive%\Program Files CSIDL_PROGRAM_FILES 32 бита 32 бита FOLDERID_ProgramFilesX86 %SystemDrive%\Program Files CSIDL_PROGRAM_FILESX86 32 бита 32 бита FOLDERID_ProgramFilesX64 (не поддерживается в 32-разрядных операционных системах) Неприменимо Неприменимо 64 бит 64 бит FOLDERID_ProgramFiles %SystemDrive%\Program Files CSIDL_PROGRAM_FILES 64 бит 64 бит FOLDERID_ProgramFilesX86 %SystemDrive%\Program Files (x86) CSIDL_PROGRAM_FILESX86 64 бит 64 бит FOLDERID_ProgramFilesX64 %SystemDrive%\Program Files Нет 64 бит 32 бита FOLDERID_ProgramFiles %SystemDrive%\Program Files (x86) CSIDL_PROGRAM_FILES 64 бит 32 бита FOLDERID_ProgramFilesX86 %SystemDrive%\Program Files (x86) CSIDL_PROGRAM_FILESX86 64 бит 32 бита FOLDERID_ProgramFilesX64 (не поддерживается для 32-разрядных приложений) Неприменимо Неприменимо
Эта 32-битная/64-битная проблема также затрагивает FOLDERID_ProgramFilesCommon
и FOLDERID_System
.