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

StackOverflow https://stackoverflow.com/questions/949959

문제

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

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

저는 32비트용 DLL과 64비트용 DLL 두 개를 가지고 있었습니다.

논리적으로 저는 32비트 DLL을 C:\Windows\System32 아래에 배치하고 64비트 DLL을 C:\Windows\SysWOW64 아래에 배치할 것이라고 생각했습니다.

놀랍게도, 그것은 반대 방향으로!그만큼 32-비트 1은 C:\Windows\SysWOW에 들어갑니다.64, 그리고 64-bit DLL이 C:\Windows\System에 들어갑니다.32.

매우 혼란스러운 내용입니다.그 이유는 무엇입니까?

도움이 되었습니까?

해결책

나는 의도가 System32의 이름을 바꾸는 것이라고 생각하지만, 그 경로를 위해 많은 응용 프로그램이 하드 코딩되어 그것을 제거하는 것이 불가능하지 않았습니다.

SYSWOW64는 64 비트 시스템의 DLL을위한 것이 아니며 실제로 "Windows의 Windows 64"와 같은 것이므로 64 비트 Windows에서 32 비트 앱을 실행하는 데 필요한 비트입니다.

이 기사 조금 설명합니다.

"Windows X64에는 64 비트 DLL (sic!)이 포함 된 디렉토리 System32가 있습니다. 따라서 64의 비트가있는 기본 프로세스는 그들이 기대하는 곳에서"그들의 "dlls를 찾습니다 : System32 폴더에서 두 번째 디렉토리 인 Syswow64에는 32가 포함됩니다. -Bit DLLS. 파일 시스템 리디렉터는 32 비트 프로세스에 대한 실제 System32 디렉토리를 숨기고 System32의 이름으로 SYSWOW64를 보여주는 마법을 수행합니다. "

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

다른 팁

다음을 추가해야 합니다.어쨌든 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 디렉토리(찾을 수 있는 위치)에 넣습니다.exe 디렉토리를 예측할 수 없는 경우(예:다른 exe가 dll을 호출할 예정이라면 dll 디렉토리를 검색 경로에 넣어야 할 수도 있습니다(가능한 경우에는 이를 피하십시오!)

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

같은 문제에 부딪쳐 몇 분 동안 이것을 연구했습니다.

나는 Windows 3.1과 DOS를 사용하도록 배웠습니다. 그 시절을 기억하십니까? Macintosh Computers와 엄격하게 일한 직후 x64 비트 기계를 구입 한 후 Windows로 돌아 가기 시작했습니다.

프로그래머가 작업을 계속하는 데 필요한 이러한 변화에 대한 실제 이유가 있습니다 (일부는 역사적 중요성을 말할 것입니다).

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

  • Program Files vs Program Files (x86)

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

  • System32 정말 의미가 있습니다 System64 (64 비트 창)

    개발자가 처음 Windows7 작업을 시작했을 때 다른 응용 프로그램이 저장된 몇 가지 호환성 문제가있었습니다.

  • SysWOW64 정말 의미가 있습니다 SysWOW32

    본질적으로, 평범한 영어에서는 의미가 있습니다 '64 비트 기계 내의 창문의 창'. 각 폴더는 사용하려는 응용 프로그램을 위해 DLL이 위치하는 위치를 나타냅니다.

다음은 필요한 모든 기본 정보에 대한 두 가지 링크입니다.

이것이 상황을 정리하기를 바랍니다!

System32는 Windows가 역사적으로 32 비트 DLL을 모두 배치했으며 시스템은 16 비트 DLL을위한 것입니다. Microsoft가 64 비트 OS를 만들었을 때, 내가 아는 모든 사람은 System64에 따라 파일이 상주 할 것으로 예상했지만 Microsoft는 System32에 64 비트 파일을 넣는 것이 더 합리적이라고 결정했습니다. 내가 찾을 수 있었던 유일한 추론은 그들이 32 비트가 된 모든 것이 프로그램의 어떤 것도 변경 해야하는 64 비트 창에서 작동하기를 원했기 때문입니다. 32 비트 응용 프로그램이 여전히 실행될 수 있도록이를 해결하는 방식은 Windows64에서 Windows32라는 32 비트 Windows 하위 시스템을 만드는 것이 었습니다. 따라서, 약어 SySwow64는 32 비트 서브 시스템의 시스템 디렉토리에 대해 만들어졌습니다. SYS는 시스템의 경우 짧고 WOW64는 Windows32onwindows64의 경우 짧습니다.
Windows 16은 이미 Windows 32에서 분리되어 있으므로 Windows 64 동등성에서 Windows 16이 필요하지 않았습니다. 32 비트 서브 시스템 내에서 프로그램이 System32 디렉토리에서 파일을 사용하면 실제로 Syswow64 디렉토리에서 파일을 가져옵니다. 그러나 그 과정은 결함이 있습니다.

끔찍한 디자인입니다. 그리고 내 경험상, 나는 64 비트 응용 프로그램을 작성하기 위해 더 많은 변경을해야했는데, System32 디렉토리를 읽기 위해 단순히 변경하는 것은 매우 작은 변화 였을 것이며, 사전 컴파일러 지시문이 처리 할 수있는 것은 매우 작은 변화 일 것입니다.

다른 사람들은 이미이 조롱 수수께끼를 설명하는 데 좋은 일을 해왔습니다. 그리고 Chris Hoffman은 여기서 더 나은 일을했다고 생각합니다. https://www.howtogeek.com/326509/whats-the-difference-between-system32-and-syswow64-folders-in-windows/

내 두 가지 생각 :

  1. 우리 모두는 인생에서 바보 같은 근시한 실수를합니다. Microsoft가 (당시) Win32 DLL 디렉토리 "System32"를 지명했을 때, 당시에는 의미가있었습니다 ... 64 비트 (또는 128 비트) 버전이있을 때 어떤 일이 일어날 지 고려하지 않았습니다. 그들의 OS는 나중에 개발되었으며, 그러한 디렉토리 이름이 발생할 수있는 거대한 뒤로 호환성 문제가 발생했습니다. Hindsight는 항상 20-20이므로 그러한 실수로 실제로 (너무 많은) 비난 할 수는 없습니다. ... 그러나 ... Microsoft가 나중에 64 비트 운영 체제를 개발했을 때, Hindsight의 이점에도 불구하고, 왜 왜 그들은 왜 똑같은 근시안의 실수를 다시 한 번도 나일뿐만 아니라 의도적으로주는 것만으로도 더 악화시킬 것입니다. 그런 오해의 소지가 있습니까?!? 그들에게 수치심 !!! 혼동을 피하기 위해 디렉토리 "Syswin32onwin64"디렉토리의 이름을 실제로 이름을 지정하지 않는 이유는 무엇입니까?!? 그리고 결국 128 비트 OS를 생산할 때 어떻게됩니까? 그러면 32 비트, 64 비트 및 128 비트 DLL을 어디에 두겠습니까?!?

  2. 이 모든 논리는 여전히 나에게 완전히 결함이있는 것 같습니다. 32 비트 버전의 Windows에서 System32에는 32 비트 DLL이 포함되어 있습니다. 64 비트 버전의 Windows에서 System32에는 64 비트 DLL이 포함되어있어 개발자가 코드를 변경할 필요가 없도록하십시오. 이 논리의 문제점은 개발자가 64 비트 DLL이 필요한 64 비트 앱을 만들거나 32 비트 DLL이 필요한 32 비트 앱을 만들고 있다는 것입니다. 내 말은, 그들이 아직도 32 비트 앱을 만들고 있다면, 이제 64 비트 창에서 실행되기 위해서는 이제 동일한 32 비트 dll을 찾거나 참조하기 위해 코드를 변경해야합니다. 이전 (현재 SYSWOW64에 위치) 이전에 사용되었습니다. 또는 64 비트 앱에서 작업하고 있다면 어쨌든 새로운 OS를 위해 이전 앱을 다시 작성해야 할 것입니다 ... 어쨌든 재 컴파일/재건이 필요했습니다 !!!

Microsoft는 때때로 나를 아프게합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top