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

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

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) .

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



답변

그 의도는 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가이를 처리하도록합니다.


답변

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


답변

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

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 위치를 나타냅니다.

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

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


답변

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를 읽는 것은 매우 작은 변경 사항이며 사전 컴파일러 지시문이 처리해야한다는 것입니다.


답변

다른 사람들은이 조롱의 수수께끼를 설명하는 좋은 일을 이미 수행했습니다 … 그리고 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 용으로 이전 응용 프로그램을 다시 작성해야합니다 … 그래서 다시 컴파일 / 재구성이 필요했습니다!

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


답변