Почему 64-разрядные библиотеки DLL переходят в System32 и 32-разрядные библиотеки в SysWoW64 в 64-разрядных окнах?

Я хотел бы знать, когда нам нужно поместить файл под

C:WindowsSystem32 или C:WindowsSysWOW64, в 64-битной системе windows.

У меня было два DLL, один для 32-бит, один для 64-бит.

логически, я думал, что помещу 32-битную DLL под C:WindowsSystem32, и 64-разрядная DLL под C:WindowsSysWOW64 - ...

к моему удивлению, это наоборот! The 32-бит один входит в C:WindowsSysWOW64 и 64-бит DLL входит в C:WindowsSystem32.

очень запутанные вещи. В чем причина этого?

4 ответов


Я считаю, что целью было переименовать System32, но так много приложений, жестко закодированных для этого пути, что было невозможно удалить его.

SysWoW64 не был предназначен для DLL 64-битных систем, это на самом деле что-то вроде "Windows on Windows64", то есть биты, необходимые для запуска 32-битных приложений на 64-битных окнах.

в этой статье объясняет немного:

"Windows x64 имеет каталог System32, который содержит 64-разрядные библиотеки DLL (sic!). Таким образом собственные процессы с разрядностью 64 находят" свои " библиотеки DLL там, где они их ожидают: в папке System32. Второй каталог, SysWOW64, содержит 32-разрядные библиотеки DLL. Перенаправитель файловой системы делает магию скрытия реального каталога System32 для 32-разрядных процессов и отображения SysWOW64 под именем System32."

Edit: если вы говорите об установщике, вы действительно не должен hard-код пути к системной папке. Вместо этого пусть Windows берет это для вас, если ваш установщик не работает на эмуляцию.


Я должен добавить: вы не должны помещать свои dll в \system32\ в любом случае! Измените свой код, измените установщик... найти дом для своей биты, что не везде под\c:\windows

например, ваш установщик помещает ваши DLL в:

\program files\<your app dir>\

or

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

(Примечание: то, как вы на самом деле это делаете использовать среду var: %ProgramFiles% или %ProgramFiles (x86)% для поиска программных файлов.... вы не думайте, это c:\program архив. \...)

а затем устанавливает тег реестра:

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

код, который использует ваши DLL, считывает реестр, а затем динамически связывается с DLL в этом месте.

вышеуказанное умный путь пойти.

вы никогда не устанавливаете свои DLL или сторонние DLL в \system32\ или \syswow64. Если вам нужно статически загрузить, вы помещаете свои DLL в свой exe-каталог (где они будут найдены). Если вы не можете предсказать exe dir (например, некоторые другие exe собираетесь вызвать свою dll), вам, возможно, придется поместить свой dll dir в путь поиска (избегайте этого, если вообще возможно!)

system32 и syswow64 предназначены для файлов, предоставляемых Windows... Не для кого elses файлы. Единственная причина, по которой люди вошли в плохую привычку класть вещи, заключается в том, что он всегда находится в пути поиска, и многие приложения/модули используют статическую связь. (Итак, если вы действительно дойдете до этого, настоящий грех-это статическая связь - это грех в собственном коде и управляемом коде -- всегда всегда всегда динамически!)


столкнулся с той же проблемой и исследовал это в течение нескольких минут.

меня учили использовать Windows 3.1 и DOS, помните те дни? Вскоре после того, как я работал с компьютерами Macintosh строго в течение некоторого времени, затем начал раскачиваться обратно в Windows после покупки x64-битной машины.

есть фактические причины этих изменений (некоторые сказали бы историческое значение), которые необходимы для программистов, чтобы продолжить свою работу.

большинство изменения упомянуты выше:

  • Program Files vs Program Files (x86)

    в начале 16 / 86bit файлы были написаны на,' 86 ' процессоры Intel.

  • System32 на самом деле означает System64 (в 64-разрядной системе Windows)

    когда разработчики впервые начали работать с Windows7, было несколько проблем совместимости, где хранятся другие приложения.

  • SysWOW64 на самом деле означает SysWOW32

    по сути, на простом английском языке это означает 'Windows на Windows в 64-разрядной машине'. Каждая папка указывает, где расположены библиотеки DLL для приложений, которые они хотят использовать.

вот две ссылки со всей необходимой вам базовой информацией:

надеюсь, это проясняет ситуацию!


System32 - это место, где Windows исторически разместила все 32-битные библиотеки DLL,а система - для 16-битных библиотек. Когда microsoft создала 64-битную ОС, все, кого я знаю, ожидали, что файлы будут находиться под System64, но Microsoft решила, что имеет смысл поместить 64-битные файлы под System32. Единственное объяснение, которое я смог найти, это то, что они хотели, чтобы все, что было 32bit, работало в 64bit Windows без необходимости что-либо менять в программах-просто перекомпилировать, и это сделано. Как они чтобы 32-битные приложения все еще могли работать, было решено создать 32-битную подсистему windows под названием Windows32 на Windows64. Таким образом, аббревиатура SysWOW64 была создана для системного каталога 32-битной подсистемы. Функция sys-это короткий для системы, и WoW64-это короткий для Windows32OnWindows64.
Поскольку windows 16 уже отделена от Windows 32, не было необходимости в эквивалентности Windows 16 для Windows 64. В подсистеме 32bit, когда программа идет использовать файлы из каталог system32, они фактически получают файлы из каталога SysWOW64. Но этот процесс несовершенен.

Это ужасный дизайн. И по моему опыту, мне пришлось сделать намного больше изменений для написания 64-битных приложений, что просто изменение каталога System32 на чтение System64 было бы очень небольшим изменением, и те, которые предназначены для обработки директив предварительного компилятора.