64 비트 Windows에서 64 비트 DLL이 System32로, 32 비트 DLL이 SysWoW64로 이동하는 이유는 무엇입니까?


227

언제 파일을 배치해야하는지 알고 싶습니다

64 비트 Windows 시스템의 경우 C : \ Windows \ System32 또는 C : \ Windows \ SysWOW64

두 개의 DLL이 있는데 하나는 32 비트 용이고 다른 하나는 64 비트 용입니다.

논리적으로 C : \ Windows \ System32에 32 비트 DLL을 배치하고 C : \ Windows \ SysWOW64에 64 비트 DLL을 배치한다고 생각했습니다.

놀랍게도, 그것은 다른 길입니다 ! 32 비트 하나는 C로 전환 : \ WINDOWS \ SysWOW (64)(64) DLL은 C로 전환 비트 : \ WINDOWS \ 시스템 (32) .

매우 혼란스러운 것들. 이것의 이유는 무엇입니까?


2
또한, Windows는 현재 작업 디렉토리와 시스템 PATH에서 찾습니다. 달리 지정할 방법이 없습니다. 아 잠깐만 요 DLL에 검색 경로를 포함시킬 수 있습니다. 8 바이트 길이의 필드입니다. 예. 8 자
Jeroen Baert

Windows 7에서는 그렇지 않은 것 같습니다. system32 파일의 DLL에서 파일 실행 C : \ Windows \ system32 \ user32.dll C : \ Windows \ system32 \ user32.dll; MS Windows (DLL) (GUI) 용 PE32 실행 파일 Intel 80386 32 비트 64 비트 DLL의 경우 MS Windows (DLL) (콘솔) Mono / .Net 어셈블리 용 PE32 + 실행 파일을 인쇄합니다.이 DLL은 .Net 이 아닙니다 . 어셈블리. 네이티브 DLL입니다.
user877329


11
전 Microsoftie와의 인터뷰 . (이것에 대한 진지한 설명은 이 답변을 참조하십시오 .)
Tgr

superuser.com/a/157301/241386 "이전 버전과의 호환성 이유. 수많은 응용 프로그램이 가정해서는 안되는 것으로 가정하고 경로를 하드 코딩한다고 가정"
phuclv

답변:


225

그 의도는 System32의 이름을 바꾸는 것이었지만 그 경로를 위해 하드 코딩 된 많은 응용 프로그램은 제거 할 수 없었습니다.

SysWoW64는 64 비트 시스템의 dll을위한 것이 아니라 실제로 "Windows64의 Windows"와 같은 것으로 64 비트 창에서 32 비트 앱을 실행하는 데 필요한 비트를 의미합니다.

이 기사 는 약간 설명합니다.

"Windows x64에는 64 비트 DLL (sic!)이 포함 된 System32 디렉토리가 있습니다. 따라서 64 비트의 기본 프로세스는 System32 폴더에서"그들의 "DLL을 찾습니다. 두 번째 디렉토리 인 SysWOW64에는 32 개의 -비트 DLL. 파일 시스템 리디렉터는 32 비트 프로세스에 대한 실제 System32 디렉토리를 숨기고 System32라는 이름으로 SysWOW64를 표시하는 마술을 수행합니다. "

편집 : 설치 프로그램에 대해 이야기하고 있다면 실제로 시스템 폴더의 경로를 하드 코딩 해서는 안됩니다 . 대신, 설치 관리자가 에뮬레이션 계층에서 실행 중인지 여부에 따라 Windows가이를 처리하도록합니다.


27
어, 오늘 나는이 이상 함을 만났다. 그들이 한 오해의 소지가 있습니다.
앤디 화이트

16
오늘도 이것에 부딪 쳤습니다 ... 혼란스러운 32 비트 dll은 / SysWOW64로, Glut 64 비트 dll은 / System32로갑니다. 누군가 그것을 적어 두어야합니다. 인터넷에서.
Jeroen Baert

8
좋은 소식은 Microsoft 엔지니어링 천재의 한 예로서 이것은 거의 자체 문서화입니다.
Spike0xff

8
내가 얻지 못하는 한 가지는 파일 시스템이 32 비트 응용 프로그램이라고 말하고 SysWOW64폴더로 리디렉션 할 수 있다면 왜 64 비트 응용 프로그램을 감지하고 System64?로 리디렉션 할 수 없었 습니까?!
Cole Johnson

6
System32는 Windows 32 비트 버전의 시스템 DLL입니다. 시스템은 16 비트 버전입니다. Windows 8과 동일한 회사는 64 비트 OS에서 실행될 때 32 비트 DLL 용 SysWow64와 64 비트 DLL 용 System32를 제공했습니다. 64 비트 시스템에서 시스템 폴더는 여전히 오래된 16 비트 정크이며, System32 만 제안 된대로 32 비트가 아니며 32 비트 항목은 이름이 64 인 System 디렉토리에 있습니다. 이것이 어떻게 누군가에게 도움이되는지 알지 못합니다. 그것은 일을 복잡하게 만들고 모든 것을 파괴합니다. 64 비트로 변환 할 때 하드 코딩 된 "System32"를 "System64"로 변경하는 것을 방지합니다. 숙어
Armand

26

추가해야합니다 : dll을 \ system32 \에 넣지 않아야합니다! 코드를 수정하고 설치 프로그램을 수정하십시오. c : \ windows \ 아래에없는 비트의 홈을 찾으십시오.

예를 들어 설치 관리자는 dll을 다음 위치에 넣습니다.

\program files\<your app dir>\

or

\program files\common files\<your app name>\

( 참고 : 실제로 이렇게하는 방법 은 var : % ProgramFiles % 또는 % ProgramFiles (x86) % 환경을 사용하여 Program Files가있는 위치를 찾는 것입니다. c : \ program files \로 가정하지 마십시오. ..)

그런 다음 레지스트리 태그를 설정합니다.

HKLM\software\<your app name>
-- dllLocation

dll을 사용하는 코드는 레지스트리를 읽은 다음 해당 위치의 dll에 동적으로 링크합니다.

위의 방법은 현명한 방법입니다.

dll 또는 타사 dll을 \ system32 \ 또는 \ syswow64에 설치하지 마십시오. 정적으로로드 해야하는 경우 dll을 exe dir (찾을 위치)에 넣습니다. exe dir을 예측할 수없는 경우 (예 : 다른 exe가 dll을 호출 할 예정인 경우) dll dir을 검색 경로에 넣어야 할 수도 있습니다.

system32 및 syswow64는 Windows 제공 파일 용이며 다른 사람 용 파일이 아닙니다 . 사람들이 물건을 넣는 나쁜 습관에 빠진 유일한 이유는 그것이 항상 검색 경로에 있고 많은 앱 / 모듈이 정적 링크를 사용하기 때문입니다. (실제로 죄에 도달하면 진정한 죄는 정적 연결입니다. 이것은 네이티브 코드와 관리 코드의 죄입니다. 항상 항상 동적으로 연결됩니다!)


9
+1 ...하지만 \ Program Files \가 아닌 % PROGRAMFILES %와 같은 변수를 사용해야한다고
Rod MacPherson

XP 시절에는 개발자가 레지스트리를 이러한 용도로 사용하는 것이 일반적이고 제안 된 관행이었습니다. Windows 7에서는 더 이상 사실이 아닙니다! UAC, 다중 사용자 세션 등의 이유로 Windows 7의 레지스트리는 드물게 사용하고 개발자의 판단에 따라 사용해야합니다.
ryyker

@RodMacPherson 귀하의 제안을 고려하여 응답이 향상되었습니다. 당신이 맞아요!
Jonesome Reinstate Monica

몇 가지 사항을 고려한 후에는 "% SYSTEMROOT % 아래에 파일을 배치해야하는시기"라는 질문에 더 잘 대답 할 수 있다고 생각합니다. 못. 이 답변은 syswow64 폴더에 대한 호기심을 만족시키지 않지만 개발자가 실제로 읽어야하는 사람입니다.
Thomas

7

같은 문제에 부딪쳐 몇 분 동안 조사했습니다.

Windows 3.1과 DOS를 사용하도록 배웠습니다. 당시를 기억하십니까? 매킨토시 컴퓨터로 한동안 엄격하게 작업 한 직후 x64 비트 컴퓨터를 구입 한 후 Windows로 되돌아 가기 시작했습니다.

프로그래머가 작업을 계속하는 데 필요한 이러한 변경 사항 뒤에는 실질적인 이유가 있습니다 (일부는 역사적으로 중요 함).

대부분의 변경 사항은 위에서 언급했습니다.

  • Program Files vs Program Files (x86)

    처음에는 16/86 비트 파일이 '86'Intel 프로세서로 작성되었습니다.

  • System32정말 의미합니다 System64(64 비트 Windows에서)

    개발자가 Windows7을 처음 사용하기 시작했을 때 다른 응용 프로그램이 저장되는 곳에서 몇 가지 호환성 문제가있었습니다.

  • SysWOW64 정말 의미 SysWOW32

    기본적으로 일반 영어에서는 '64 비트 시스템 내의 Windows에서 Windows '를 의미 합니다. 각 폴더는 사용하려는 응용 프로그램의 DLL 위치를 나타냅니다.

필요한 모든 기본 정보가 포함 된 두 개의 링크는 다음과 같습니다.

희망이 이것들을 정리하기를 바랍니다!


4
진지하게 받아들이려면, 속어를 어둡게하고 문법을 향상시켜야합니다. 또한 답변을 조금 더 구성하고 단락을 사용하고 싶을 수도 있습니다.
Klas Mellbourn

2
@Crispy가 답을 정리했습니다. 앞으로 Klas가 제안한 내용을 고려하고 응답 가능성을 높이기 위해 응답 형식을 지정해야합니다. :)
RekindledPhoenix

OP를 완전히 다시 작성하거나 제거해야합니다. 오해의 소지가 있으며 실제로 유용하지는 않습니다.
Jonesome Reinstate Monica

5
SysWOW64는 실제로 다음을 의미합니다. [Sys] tem [W] indows 32 비트 [o] n [W] indows [64]-비트 따라서 약식 SysWoW64 (실제로 말이되지 않으며 Microsoft는 32 비트를 위해 System32를 그대로 두었습니다) WoW 샌드 박스에서 Microsoft가하는 일은 SysWoW64에 대한 요청으로 32 비트 액세스에서 System32 로의 메모리 리다이렉트를 만드는 것입니다. 이전 주석에서 언급했듯이 – 바보 (Idiocy)
Armand

1
대답은 질문에 대한 명확성보다 더 많은 오해를 가져옵니다. Armands의 의견은 좋은 설명입니다.
nahab

5

System32는 Windows가 역사적으로 모든 32 비트 DLL을 배치 한 곳이며 System은 16 비트 DLL을위한 것입니다. Microsoft가 64 비트 OS를 만들 때 내가 알고있는 모든 사람들은 파일이 System64에 상주한다고 기대했지만 Microsoft는 64 비트 파일을 System32에 두는 것이 더 합리적이라고 결정했습니다. 내가 찾은 유일한 추론은 프로그램에서 아무것도 변경하지 않고 64 비트 Windows에서 32 비트 인 모든 것이 작동하기를 원했기 때문입니다. 다시 컴파일하면됩니다. 32 비트 응용 프로그램을 계속 실행할 수 있도록이 문제를 해결하는 방법은 Windows64에서 Windows64라는 32 비트 Windows 하위 시스템을 만드는 것입니다. 따라서 약어 SysWOW64는 32 비트 서브 시스템의 시스템 디렉토리 용으로 작성되었습니다. Sys는 시스템의 약자이고 WOW64는 Windows32OnWindows64의 약자입니다.
Windows 16은 이미 Windows 32와 분리되어 있으므로 Windows 16 On Windows 64 동등성이 필요하지 않습니다. 32 비트 서브 시스템 내에서 프로그램이 system32 디렉토리의 파일을 사용하면 실제로 SysWOW64 디렉토리에서 파일을 가져옵니다. 그러나 그 과정에는 결함이 있습니다.

끔찍한 디자인입니다. 그리고 경험상 64 비트 응용 프로그램을 작성하기 위해 훨씬 더 많은 변경 작업을 수행해야했습니다 .System64 디렉토리를 변경하여 System64를 읽는 것은 매우 작은 변경 사항이며 사전 컴파일러 지시문이 처리해야한다는 것입니다.


2

다른 사람들은이 조롱의 수수께끼를 설명하는 좋은 일을 이미 수행했습니다 ... 그리고 Chris Hoffman이 더 나은 일을했다고 생각합니다 : https://www.howtogeek.com/326509/whats-the-difference-between-the- system32 및 syswow64 폴더의 Windows /

내 두 생각 :

  1. 우리 모두 인생에서 어리석은 근시안적 실수를합니다. Microsoft가 당시의 Win32 DLL 디렉토리 이름을 "System32"로 지정했을 때 당시에는 의미가 있었지만, 64 비트 (또는 128 비트) 버전의 경우 / 어떻게 될지 고려하지 않았습니다. 그들의 OS 중 나중에 개발되었습니다-디렉토리 이름과 같은 거대한 역 호환성 문제가 발생할 수 있습니다. Hindsight는 항상 20-20이므로 그러한 실수로 인해 너무 비난 할 수는 없습니다. ... 어쨌든 ... 마이크로 소프트가 나중에 가늠자의 혜택을 받아 64 비트 운영 체제를 개발할 때 왜 정확히 같은 근시안적 실수를 다시 발생시킬뿐 아니라 목적을 달성함으로써 더 악화시킬 수 있는가? 그런 오해의 소지가있는 이름?!? 부끄러운 줄 아세요 !!! 혼동을 피하기 위해 AT LEAST가 실제로 "SysWin32OnWin64"디렉토리의 이름을 지정하지 않는 이유는 무엇입니까? ? 그리고 결국 128 비트 OS를 만들면 어떻게됩니까? 그렇다면 32 비트, 64 비트 및 128 비트 DLL을 어디에 배치할까요?!?

  2. 이 모든 논리는 여전히 나에게 완전히 결함이있는 것 같습니다. Windows 32 비트 버전에서 System32는 32 비트 DLL을 포함합니다. 64 비트 버전의 Windows에서 System32에는 64 비트 DLL이 포함되어 있으므로 개발자가 코드를 변경할 필요가 없습니다. 맞습니까? 이 논리의 문제점은 해당 개발자가 현재 64 비트 DLL이 필요한 64 비트 응용 프로그램을 만들거나 32 비트 DLL이 필요한 32 비트 응용 프로그램을 만들고 있다는 것입니다. 그들이 여전히 32 비트 응용 프로그램을 만들고 있다면 이제 64 비트 Windows에서 실행하려면 동일한 32 비트 DLL을 찾거나 참조하기 위해 코드를 변경해야합니다. 이전에 사용되었습니다 (현재 SysWOW64에 있음). 또는 64 비트 응용 프로그램을 사용하는 경우 어쨌든 새로운 OS 용으로 이전 응용 프로그램을 다시 작성해야합니다 ... 그래서 다시 컴파일 / 재구성이 필요했습니다!

마이크로 소프트는 때때로 나를 아프게한다.

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