64 비트 Windows에 별도의 "Program Files (x86)"폴더가 필요한 이유는 무엇입니까?


178

64 비트 버전의 Windows에서 "Program Files"폴더는 64 비트 프로그램 용이고 "Program Files (x86)"폴더는 32 비트 프로그램 용이지만 왜 이것이 필요한가요?

"필수"라는 말은 "Microsoft가 다른 디자인 결정을 내릴 수 없었던 이유는 무엇입니까?"라는 의미는 아닙니다. 물론 그들은 가질 수있었습니다. 오히려, "현재 64 비트 Windows 디자인에서 32 비트 프로그램이 64 비트 프로그램과 별도의 최상위 폴더를 가져야하는 이유는 무엇입니까?" 다시 말하면, "어떻게 든 리디렉션 메커니즘을 피하고 모든 것을 실제에 설치하도록하면 C:\Program Files\어떻게 될까요?"

수퍼 유저와 다른 곳에서는 "32 비트 프로그램 용, 64 비트 프로그램 용"이라는 많은 질문이 있지만 그 이유는 없습니다. 내 경험에서,하지 않는 32 비트 프로그램은 올바른 위치에 설치 여부는 중요 할 수 있습니다.

"프로그램 파일 (x86)"이 실행되지 않는 프로그램과 Windows가 다르게 표시됩니까? "프로그램 파일"대신 "프로그램 파일 (x86)"에 설치된 프로그램의 차이점을 정확하게 설명하는 설명이 있습니까? Microsoft가 합법적 인 기술적 이유없이 새 폴더를 도입 할 것 같지는 않습니다.


13
귀하의 질문에 대답하기보다는 \ program files \ common files를 어떻게 처리 하시겠습니까?
sgmoore

8
한 줄 응답 (따라서 주석) : 쉽게 아키텍처를 모른 채 모든 폴더에서 모든 응용 프로그램을 실행할 수 있기 때문에, 다음 분명히 더 없다 강제적 이 분리 이유. 두 아키텍처 모두에서 응용 프로그램의 이중 설치를 지원 하는 것이 편리 합니다 . 어떤 경우에는 반드시 단순한 재 컴파일이 아니기 때문에 차이가 있습니다. 주요 문제는 32 비트 앱이 64 비트 dll을로드 할 수 없으므로 일반적으로 동일한 위치에 두 버전을 모두 설치할 수 없다는 것입니다. 다른 대안은 각 응용 프로그램마다 두 개의 "bin"폴더가 있습니다.
Sklivvz 2016 년

1
@Synetech 나는 심지어 x64 바이너리를 갖기 위해 (x86) 아래에 설치하는 프로그램을 가지고있었습니다. 때로는 끔찍합니다.
sinni800

10
Microsoft가 왜 "레거시"프로그램 파일 디렉토리를 프로그램 파일 (x86)로 "이동"하는 대신 "프로그램 파일 (x64)"에 64 비트 프로그램을 넣지 않았는지 항상 궁금했습니다.
LawrenceC

30
/ 윈도우 / system32를가 / 윈도우 / SysWOW64와는 32 비트 재료를 포함하는 동안 ..., 64 비트의 내용을 포함하는 64 / 32 비트 차별화에 대한 진짜 엉망입니다
찌를

답변:


92

짧은 대답 : 기존 32 비트 응용 프로그램이 영구 혼란을 야기 할 수있는 64 비트 응용 프로그램에 대한 추한 규칙을 부과하지 않고 이전과 동일한 방식으로 계속 작동합니다.

필요하지 않습니다. 모든 응용 프로그램에서 32 비트 DLL 및 실행 파일을 64 비트 DLL 및 실행 파일과 분리하는 고유 한 방법을 만들어야하는 등 다른 가능한 솔루션보다 훨씬 편리합니다.

주된 이유는 64 비트 시스템을 모르는 32 비트 응용 프로그램이 64 비트 DLL이 응용 프로그램이 보이는 곳에 설치되어 있어도 "그냥 작동"하는 것입니다. 32 비트 응용 프로그램은 64 비트 DLL을로드 할 수 없으므로 32 비트 응용 프로그램 (64 비트 시스템 이전 버전 일 수 있으므로 64 비트 파일이없는 경우)을 확인하는 방법이 필요했습니다. 심지어 존재하더라도)는 64 비트 DLL을 찾지 못하고로드하고 실패한 다음 오류 메시지를 생성합니다.

이에 대한 가장 간단한 해결책은 지속적으로 분리 된 디렉토리입니다. 실제로 유일한 대안은 모든 64 비트 응용 프로그램이 bin64해당 응용 프로그램 내부 의 디렉토리 와 같이 32 비트 응용 프로그램이 보이지 않는 곳에서 실행 파일을 "숨겨야"하는 것 입니다. 그러나 이것은 레거시 응용 프로그램을 지원하기 위해 64 비트 시스템에서 영구적 인 추악을 부과합니다.


52
동일한 시스템에서 32 비트 및 16 비트 프로그램을 허용하기 위해 이러한 후프를 뛰어 넘을 필요가 없었습니다. 나는 그런 것을 본 적이 없다 ProgramFiles (16). 게다가 32 비트 프로그램이 "64 비트 DLL을 찾아서로드하려고"정확히 어떻게합니까? 어떤 프로그램에서 임의의 DLL을 찾기 위해 이동 %programfiles%합니까? 공유 DLL 인 경우 WinSxS로 이동합니다. 공유되지 않으면 자신의 DLL을 관리하는 것은 프로그래머의 몫입니다. 그럼에도 불구하고 프로그래머에게 편의를 제공하기 위해 필요한 부분.
Synetech

30
IIRC Win3.1에는 프로그램 파일 디렉토리가 없었습니다 (또는 대부분의 앱은이를 무시했습니다). 결과적으로 프로그램 파일에서 무언가를 찾는 레거시 win16 앱은 없습니다. 대신 IIRC 공유 라이브러리는 종종 Windows 폴더 자체의 어딘가에 있습니다. windows \ system과 windows \ system32를 가진 Win32는 그 인공물입니다.
댄 닐리

15
Windows 3.1은 긴 파일 이름을 지원하지 않았으므로 '프로그램 파일'폴더를 가질 수 없었습니다.
Darth Egregious

14
@JarrodRoberson : 그 반대는 Microsoft가 이전 버전과의 호환성을 극도로 높이 평가하기 때문입니다.
David Schwartz

24
@Jarrod : 사실, 모든 개발자가 알고 있듯이 Microsoft는 이전 버전과의 호환성을 너무 중요하게 생각합니다. 말 그대로 모든 API에는 제거를 거부하는 레거시 메소드가 있으며, 종종 해당 API 용으로 작성된 이전 프로그램을 중단하는 것을 두려워하기 때문에 수정을 거부하는 심각한 버그가 있습니다. 대부분의 API도 마찬가지이지만, Microsoft의 현존하는 곳은 아닙니다.
BlueRaja-대니 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 응용 프로그램 구별 시스템은이 목표를 더욱 발전시킵니다. 응용 프로그램은 이름, 이진 로딩 동작 및 보안 (어느 정도)의 충돌을 피하기 위해 두 위치로 분리됩니다.

나는 아직도 그것을 얻지 못한다. 쓸모없는 것 같습니다

한 가지를 잊어서는 안됩니다. 사람들은 엄청나게 바보입니다. 여기에는 사용자, 수퍼 유저 및 특히 프로그래머가 포함됩니다.

그렇기 때문에 시스템을 사용 가능하게 만들려면 파일 시스템 리디렉션 과 같은 것이 필요합니다 .

프로그래머는 거기에 들어가서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\App32C:\Program Files\App64?
Stephen Jennings

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 비트 버전에 대해 별도의 최상위 폴더를 만들하기로 결정했습니다, 그래서 그 부분을 떠날거야 (가장 좋은 이유는이 같은 것을 다윗의 설명을했다 프로그래머 편의성). 물론, 이것이 왜 이것이 필요한지에 대한 직접적인 질문을 다루지 않습니다 . 에 대한 답은 아마도 아닙니다 .

대신 질문의 본문을 다룰 것입니다

"프로그램 파일 (x86)"이 실행되지 않는 프로그램과 Windows가 다르게 표시됩니까?

실제로는 아니지만 프로그램의 위치 는 동작에 영향을 줄 있지만 생각하는 방식에는 영향을 미치지 않습니다.

프로그램을 실행할 때 Windows는 프로그램을 실행할 환경을 설정합니다 (환경 변수뿐만 아니라 메모리, 주소 지정 등을 의미합니다). 이 환경은 실행 파일의 내용에 따라 다릅니다 (32 비트 및 64 비트 프로그램은 내부적으로 다릅니다). 64 비트 시스템에서 32 비트 프로그램을 실행하면 32 비트 환경을 에뮬레이트하는 32 비트 서브 시스템에서 실행됩니다. WoW64 (WoW64는 Windows 64 비트의 Windows를 나타냄 )라고 하며 NTVDM을 사용하여 XP에서 16 비트 앱을 실행하는 방법과 유사합니다 .

관리자 권한이 있거나없는 프로그램을 실행하면 프로그램 실행 방법에 영향을 주지만 위치 영향을 미치지 않아야 합니다 (예를 들어 일부 드라이버와 같은 위치 종속성의 예가 있음).

(나는 다른 컴퓨터를 사용하고, 그래서 난 내 브라우저 기록에 의존 할 수없는 나의 단계를 역 추적하는 것이 아니라 다른 날에 대답하면서 이 SU 질문 난에 결국 이 SO 질문 에 저를 발생 구글 PROCESSOR_ARCHITEW6432 으로 이어질 이 SO 질문이 Microsoft 블로그 게시 .)

어딘가에서 환경 변수 %processor_architecutre% 가 명령 프롬프트를 실행하는 위치에 따라 어떻게 다른 결과를 제공 하는지에 대한 StackOverflow 게시물을 읽었습니다 (정확한 인용문을 찾으려고 노력할 것입니다).

대답은 32 비트 또는 64 비트 버전의 명령 프롬프트가 실행되었는지 여부 (예 : System32\또는 from SysWoW64\) 때문입니다. 즉, 위치 가 프로그램의 동작 영향 미치는 것처럼 보이지만 Windows가 폴더를 특별한 방식으로 취급하기 때문이 아니라 다른 버전의 프로그램이 있기 때문입니다.

실행 파일의 내용이 32 비트인지 64 비트인지를 나타내므로 동일한 폴더에 동일한 프로그램 (예 : foobar32.exefoobar64.exe) 의 32 비트 및 64 비트 복사본을 둘 다 넣을 수 있습니다. 그것들을 실행하면 올바르게로드됩니다 (64 비트 버전은 기본적으로 실행되고 32 비트 버전은 WoW64 에뮬레이션 계층에서 실행됩니다).

FreePascal을 사용하면 DOS 및 Windows 버전을 모두 설치할 수 있으며 동일한 폴더에 %programfiles%\FreePascal있습니다. 그것은 (실행 파일을 유지하여 다른 아키텍처를 관리 .exe, .sys, .dll, .ovr등, 소스 파일)이도 32과에 대해 수행 할 수 없다는 기술적 이유가 없다을 별도의 폴더에, 등) 및 사진과 같은 리소스 파일을 공유 64 비트 버전의 프로그램. David가 말했듯이, 프로그래머가 분리되어 유지되면 프로그래머가 더 쉽습니다 (즉, 변수를 사용하여 파일 세트가 하나만있는 것처럼 보이게합니다).


복수 투표 투표! 무 하하하! 한숨
Synetech

다운 투표 이상한 : \. BTW는 +1을 잘 설명합니다.
avirk

11

또 다른 이유는 % PROGRAMFILES %와 같은 환경 변수를 사용하여 대부분의 프로그램이 프로그램이 설치된 위치를 가리 키기 때문입니다. 64 비트 프로그램의 경우 정상적인 위치로 이동합니다. 32 비트 프로그램의 경우 새 Program Files (x86)폴더로 리디렉션 합니다.

적어도 Visual Studio의 새로운 .Net 항목을 사용하더라도 App.Local 변수가있어이를 필요로하지 않습니다.


4
그것은 설명하지 않습니다. 환경 변수를 정확히 사용하는 사람은 누구이며 프로그램이 32 비트인지 64 비트인지에 관심이있는 이유는 무엇입니까?
Synetech 2016 년

4
@Synetech-프로그램 작성자는 환경 변수를 사용합니다. 관심이있는 이유는 dll에 대한 참조 때문입니다. 64 비트 프로세스 내에서 32 비트 dll을로드 할 수 없으며 그 반대도 마찬가지입니다.
Ramhound

1
그리고 수행하는 방법 %programfiles%, %programfiles(x86)%또는 %programw6432%거기에 차이가? 모든 공유 DLL은 단일 WinSxS 디렉토리로 이동하고 비공유 DLL은 실행 파일과 함께 있습니다. 어떤 이유로 32 비트 및 64 비트 버전의 동일한 프로그램을 설치 한 경우에도 32 비트 실행 파일이있는 32 비트 DLL과 32 비트 실행 파일이있는 64 비트 DLL을 유지하는 경우에만 문제가됩니다. 64 비트 실행 파일 이렇게 할 수 있습니다 : %programfiles%\CoolApp\bin\32% programfiles % \ CoolApp \ bin \ 64`, 왜 별도의 최상위 폴더입니까?
Synetech

@Synetech 물론 그렇습니다. % programfiles %는 오래 전부터 사용되었습니다. 64 비트 컴퓨터에 32 비트 프로그램을 설치하는 경우 한 곳이 있으면 해당 32 비트 앱에 문제가 발생할 수 있습니다. 와우는 % programfile %를 32 비트 앱의 경우 (x86) 버전과 64의 경우 x86이 아닌 버전으로 리디렉션 할 수 있습니다.
Andy

암시 적 리디렉션이 없다면 사람들이 그렇게 혼동하지 않을 것이라고 생각합니다.
kommradHomer

8

32 비트에서 64 비트로의 전환에 대한 Microsoft의 솔루션은 대부분의 32 비트 응용 프로그램에 대한 레거시 지원을 추가하는 것이 었습니다. 즉, 대부분의 32 비트 응용 프로그램은 64 비트 운영 환경에서 작동합니다. 64 비트 아키텍처에서 운영되는 다른 운영 체제는 32 비트 응용 프로그램을 전혀로드하거나 실행할 수 없습니다.

보다 쉽게 ​​전환 할 수 있도록 Microsoft는 기본적으로 모든 32 비트 응용 프로그램을 일반 Program Files 폴더의 실제 64 비트 응용 프로그램과 혼합하지 않고 Program Files (x86) 폴더에로드해야한다고 지정했습니다.

출처

"어떻게 든 리디렉션 메커니즘을 피하고 모든 것이 실제 C : \ Program Files \에 설치되도록하면 어떻게 될까요?"

아무것도. 두 프로그램 디렉토리는 조직 용이거나 Internet Explorer와 같이 두 가지 버전의 32 비트 및 64 비트 버전을 가진 프로그램을 별도로 유지하기위한 것입니다. 그러나 "Program Files"에 32 비트 프로그램을 설치하고 "Program Files x86"에 64 비트 프로그램을 설치할 수 있으며 프로그램이 동일하게 실행됩니다.

위키 는 말한다 :

일부 응용 프로그램 설치 관리자는 설치 경로 위치 내에서 공백을 거부합니다. 32 비트 시스템의 경우 Program Files 폴더의 짧은 이름은 Progra ~ 1 입니다. 64 비트 시스템의 경우 64 비트 Program Files 폴더의 짧은 이름은 Progra ~ 1 (32 비트 시스템과 동일)입니다. 32 비트 Program Files (x86) 폴더의 짧은 이름은 이제 Progra ~ 2 입니다.


1
헤헤 좋은 기사. 그 기사에 대한 의견은 여기에 언급 된 것과 정확히 같습니다. 더 나쁜 것은 그 기사가 2 년 전에 나온 것이기 때문에이 질문은 새로운 것이 아니며 정식으로 대답 할 수 없다면 Windows 팀의 누군가가 소리를 내지 않는 한 결코 그렇지 않을 것입니다. 글쎄요, 우리 모두 걱정을 멈추고 폭탄을 사랑하는 법을 배워야한다고 생각합니다. +1 기사를 지적하고이 질문이 오랫동안 지속되었다는 것을 보여주었습니다.
Synetech

1
@Synetech 감사합니다! 예, 기사 링크를 배치한다는 아이디어는 귀하가 얻은 것과 동일합니다. 이것은 매우 오래된 질문이지만 사람들이 왜 아직 그것을 얻지 못했는지 IDK입니다. 그러나 MS는이 문제에 대한 KB 또는 문서를 작성해야합니다. :)
avirk

그렇습니다. 특히 개발자가 물어 보는 것이 아니라 일반 사용자조차도 궁금하기 때문입니다. 불행히도 Microsoft의 설명서는 종종 좋지 않습니다.
Synetech

@Synetech p! 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

"Program Files (x86)"에서 실행되는 프로그램은 WOW64 하위 시스템을 사용합니다 (Windows 64 비트의 Windows 32 비트는 x64 아키텍처 시스템에서 x32 응용 프로그램을 실행하기위한 드라이버 및 API 세트입니다).

WoW64 하위 시스템은 모든 64 비트 버전의 Windows에서 유사한 인터페이스를 가진 경량 호환성 계층으로 구성됩니다. 64 비트 시스템에서 수정되지 않은 32 비트 Windows 응용 프로그램을 실행하는 데 필요한 인터페이스를 제공하는 32 비트 환경을 만드는 것을 목표로합니다. 기술적으로 WoW64는 3 개의 DLL (동적 연결 라이브러리)을 사용하여 구현됩니다.

  • 포인터 및 호출 스택 조작을 포함하여 32 비트 및 64 비트 호출 간을 변환하는 Windows NT 커널의 핵심 인터페이스 인 Wow64.dll
  • 32 비트 응용 프로그램에 적절한 진입 점을 제공하는 Wow64win.dll
  • 프로세서를 32 비트에서 64 비트 모드로 전환하는 Wow64cpu.dll

64 비트 시스템은 32 비트 응용 프로그램을 "에뮬레이션"해야하므로 Windows가 두 개의 Program Files 폴더를 "분리"해야합니다.


7
그러나 왜 다른 폴더에 넣어야합니까? Windows는 이미 PE 헤더를보고 실행 파일의 아키텍처를 완전히 결정할 수 있습니다. 실행 파일을로드 할 때 적절한 환경을로드 할 수없는 이유는 무엇입니까?
Synetech

1
프로그램을 열 때 두 가지 프로그램 버전에서 원하는 아키텍처를 사용자에게 쉽게 표시하는 것이 Microsoft의 선택이라고 생각합니다. 이 두 폴더가없고 사용자에게 투명하면 (자동으로 전환되는 경우) 32 비트 또는 64 비트 앱을 실행 중인지 알 수없고 어떤 프로그램을 열지 알 수 없습니다. 64 비트에서 실행되는 경우.
Diogo

1
64 비트 버전의 IE는 끔찍한 것으로 유명합니다.
Samuel Edwin Ward

1
메모리 제약 조건을 초과 할만큼 큰 데이터 집합으로 작업하지 않는 한 office32를 사용하는 것이 좋습니다. office64와 함께 작동하려면 바이너리 애드온을 다시 컴파일해야한다고 생각합니다. 정상적인 사용 사례에서 어떠한 이점도 제공하지 않는 것은 결정의 여지가 있습니다.
Dan Neely

1
Program Files (x86) 폴더에 명시 적으로 설치된 64 비트 프로그램은 정상적으로 정상적으로 작동하며 대부분의 경우 그 반대도 가능합니다. Windows는 폴더 위치를 사용하여 실행 파일을 처리하는 방법을 결정하지 않습니다.
Harry Johnston

5

여기와 인터넷의 대답이 상당히 다르다는 것이 흥미 롭습니다. 이 중요한 질문에 대한 정확한 답을 찾는 것은 어려운 일이었습니다. 인터넷에는 꽤 많은 허위 정보가 표시되어 혼동을 일으키는 것으로 보입니다.

나는 상당한 양의 연구를 수행했으며 다음과 같은 결론을 도출했습니다.

  • 응용 프로그램이 저장된 위치에는 차이가 없습니다. 런타임시 Windows는 응용 프로그램이 32 비트인지 64 비트인지 확인하고 적절한 DLL 및 레지스트리 섹션을 자동으로 사용합니다.

이것은 자동으로 발생하며 응용 프로그램이 저장된 위치와 무관합니다. 별도의 32 비트 및 64 비트 폴더를 사용하면 속도, 안정성 또는 기타 기능상의 이점이 없습니다.

기본적으로 두 개의 폴더 ( 'Program Files'및 'Program Files (x86)')로 분리 된 유일한 이유는 동일한 프로그램의 두 버전 (32 비트 및 64 비트 버전)이있는 경우 겹치는 파일을 개별적으로 유지하는 간단한 방법. 이 경우에도 모든 파일 이름이 고유 한 한 실제로 아무런 결과없이 동일한 폴더에 존재할 수 있습니다.

위의 결론에 대한주의 사항이 있으며 이는 잘못 코딩 된 응용 프로그램 중 하나입니다. 응용 프로그램에 하드 코드 된 경로가 있으면 해당 경로 만 사용합니다. 일반적으로 경로는 응용 프로그램에 하드 코딩되어서는 안되지만 때로는 프로그래머가 실수를 범합니다. 이 경우 프로그램은 하드 코드 된 경로를 사용합니다. 응용 프로그램이 설치된 디렉토리는 실제로 파일을 찾는 위치에 영향을 미치지 않습니다.


3

폴더를 분리해야하므로 WoW64 가 필요한 기본 64 비트 응용 프로그램과 장치를 유지할 수 있습니다 .

@OliverSalzburg가 이미 지적했듯이 이는 일부 플러그인 및 애드온이 웹 브라우저 중 하나에서만 사용할 수 있기 때문에 64 비트 및 32 비트 웹 브라우저를 설치하려는 경우에 유용합니다 (예 :). 둘.

폴더를 분리해야하는 경우 레지스트리 리디렉션 과 같은 기술을 사용 하여이 분리가 자동으로 이루어 집니다.

설치 프로그램이 RegQueryValueEx 등 을 사용하여 레지스트리를 읽어 프로그램 파일 폴더를 판별하려고한다고 가정하십시오 .

어쨌든 레지스트리 키를 읽으려고합니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

일반적으로을 가리 킵니다 C:\Program Files.

그러나 설치 관리자가 32 비트 응용 프로그램 인 경우 레지스트리 리디렉션으로 인해 regitry 키가 발생합니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

대신 읽을 수 있습니다 C:\Program Files (x86). 일반적으로을 가리 킵니다 .

이러한 특정 폴더 이름이 사용 된 이유 는이 선택을 한 사람들 만 대답 할 수 있습니다. 원하는 경우 언제든지 기본 폴더의 이름을 변경할 수 있습니다.

"프로그램 파일 (x86)"이 실행되지 않는 프로그램과 Windows가 다르게 표시됩니까?

나는 그것을 의심한다. 대부분의 설치 관리자는 사용자 지정 설치 폴더를 선택할 수 있으므로 프로그램 설치 위치 는 중요하지 않습니다 .


죄송합니다, "permit"과 "forbid"를
섞었습니다

3

나는 혼란을 믿을 수 없다. 처음으로 나는 풀 타임 개발자이다.

MS는 이전 32 비트 응용 프로그램과 최신 64 비트 응용 프로그램에서 DLL을 사용하는 경우를 해결하기 위해이 작업을 수행했습니다. 이전 방법 (System32, Program Files 등)은 다시 컴파일 할 수없는 이전 프로그램을 손상 시키므로 변경할 수 없습니다.

따라서 MS는 64 비트 특정 프로그램, 어셈블리 및 라이브러리를 저장할 폴더를 만들어 새 프로그램이 올바른 라이브러리에 연결될 수있게했으며 이전 프로그램은 계속 정상적으로 작동합니다.

.Net DLL은 동일한 컴퓨터에서 다른 버전과 공존 할 수 있습니다. 예를 들어 Library.1.0.1, Library.1.0.2, Library 1.1.0 등을 가질 수 있습니다. 이는 특정 비트 크기 (32 또는 64)에만 해당됩니다. 별도의 폴더를 사용하지 않으면 모든 어셈블리에 32 및 64 비트 버전이 있어야합니다. 이로 인해 동일한 어셈블리의 여러 버전이 이미 포함 된 디렉토리가 심각하게 어지럽 힐 수 있습니다.

이것은 모두 개발자의 물건입니다. 사용자는 Windows 7 64에서 32 비트 프로그램으로 작업 할 때만 처리하면됩니다. 또한 32 비트 버전과 동일한 응용 프로그램을 64 비트로 실행할 수있는 기능을 선호합니다. 64 비트로 컴파일해야하는 32 비트 응용 프로그램을 작업 할 때는 컴파일러에게 지시하면됩니다. DLL 이름과 다른 모든 것은 동일하게 유지됩니다.

이것이 Windows 95/98에 존재하지 않는 이유는 32 비트 런타임을 시뮬레이트 한 시스템 때문입니다. 진정한 32 비트 운영 체제가 아니 었습니다. "thunking"이라는 이름으로 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 비트 exe가있는 32 비트 DLL 및 64 비트 exe가있는 64 비트 DLL
Synetech

아, 그리고 95/98은 누가 그것에 대해 말했습니까? XP조차도 16 비트 서브 시스템 (NTVDM)을 가지고있었습니다.
Synetech

나는 당신이 설명을 원한다고 생각했습니다. CommonFiles를 사용하는 앱은 거의 없습니까? 거기에 항목이있는 35 가지 응용 프로그램이 있습니다. System32 디렉토리보다 공유 구성 요소를 저장하는 것이 더 안전한 곳입니다. 이것을 사용하는 앱이 거의 없다는 귀하의 진술은 논쟁의 여지가 있습니다. 인용 : "동일한 시스템에서 32 비트 및 16 비트 프로그램을 허용하기 위해 이러한 후프를 뛰어 넘을 필요는 없었습니다. 그래도 프로그래머에게는 편의를위한 부분이 합리적입니다. " 그래, 프로그래머는 그래 우리는 결국 응용 프로그램을 작성합니다.
Jason Locke

응?
Synetech

이 글을 다시 읽으십시오. 그는 자신의 답글 ( superuser.com/a/442253/142951) 에서 더 잘 말했습니다 . 개발자가 아닌 경우 목적이 보이지 않을 수 있습니다.
Jason Locke

0

전혀 필요하지 않습니다. 예를 들어, 작업중인 컴퓨터 C:\MyPrograms\에서는 IT 부서에서 설치 한 응용 프로그램과 분리되도록 각 응용 프로그램을 폴더 에 설치합니다.

물론 이것은 하나의 응용 프로그램의 두 버전 (32 및 64 비트)을 모두 설치하지 못하게하지만 제 경우에는 문제가되지 않습니다.

프로그램을 시작할 때마다 항상 첫 번째 DLL C:\Windows\System32\ntdll.dll이 실행됩니다. 이 DLL은 프로그램이 32 비트인지 64 비트인지를 결정합니다. 그것에 따라 당신은 WoW64이미 여러 답변에서 언급 된 것으로 리디렉션됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.