Почему 64-разрядные библиотеки DLL отправляются в System32, а 32-разрядные библиотеки DLL - в SysWOW64 в 64-разрядной Windows?

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

Вопрос

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

C:\Windows\System32 или C:\Windows\SysWOW64 в 64-разрядной системе Windows.

У меня было две библиотеки DLL, одна для 32-разрядной, другая для 64-разрядной.

По логике вещей, я подумал, что следует поместить 32-разрядную библиотеку DLL в раздел C:\Windows\System32, а 64-разрядную библиотеку DLL - в раздел C:\Windows\SysWOW64.

К моему удивлению, это как раз наоборот!Тот Самый 32-бит первый переходит в C:\Windows\SysWOW64, и тот 64-бит DLL переходит в C:\Windows\System32.

Очень запутанный материал.В чем причина этого?

Это было полезно?

Решение

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

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

Эта статья поясняет немного:

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

Редактировать:Если вы говорите об установщике, вы действительно не должна жестко запрограммируйте путь к системной папке.Вместо этого позвольте 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 files\ ....)

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

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

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

Вышеописанное — разумный путь.

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

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

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

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

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

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

  • Program Files против Program Files (x86)

    Вначале 16/86-битные файлы записывались на процессорах Intel «86».

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

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

  • SysWOW64 действительно означает SysWOW32

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

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

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

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

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

Другие люди уже проделали хорошую работу по объяснению этой нелепой головоломки ...и я думаю, что Крис Хоффман проделал здесь еще лучшую работу: https://www.howtogeek.com/326509/whats-the-difference-between-the-system32-and-syswow64-folders-in-windows/

Две мои мысли:

  1. Мы все совершаем глупые недальновидные ошибки в жизни.Когда Microsoft назвала свой (на тот момент) каталог библиотеки DLL Win32 "System32", в то время это имело смысл ...они просто не приняли во внимание, что произойдет, если / когда 64-разрядная (или 128-разрядная) версия их ОС будет разработана позже - и возникнет огромная проблема обратной совместимости, вызванная таким именем каталога.Ретроспектива всегда составляет 20-20, так что я не могу их (слишком сильно) винить за такую ошибку....ОДНАКО...Когда Microsoft позже разработала свою 64-разрядную операционную систему, даже оглядываясь назад, почему, о, почему они не только снова совершили ту же самую недальновидную ошибку, но и сделали ее еще хуже, намеренно присвоив ей такое вводящее в заблуждение название ?!?Позор им!!!Почему бы ХОТЯ бы на самом деле не назвать каталог "SysWin32OnWin64", чтобы избежать путаницы ?!?И что произойдет, когда они в конечном итоге создадут 128-битную ОС...тогда куда они собираются поместить свои 32-разрядные, 64-разрядные и 128-разрядные библиотеки DLL ?!?

  2. Вся эта логика до сих пор кажется мне совершенно ошибочной.В 32-разрядных версиях Windows System32 содержит 32-разрядные библиотеки DLL;в 64-разрядных версиях Windows System32 содержит 64-разрядные библиотеки DLL ...чтобы разработчикам не пришлось вносить изменения в код, верно?Проблема с этой логикой заключается в том, что эти разработчики либо сейчас создают 64-разрядные приложения, которым нужны 64-разрядные библиотеки DLL, либо они создают 32-разрядные приложения, которым нужны 32-разрядные библиотеки DLL...в любом случае, разве они все еще не облажались?Я имею в виду, что если они все еще создают 32-разрядное приложение, то для его запуска в 64-разрядной Windows им теперь нужно будет внести изменения в код, чтобы найти / сослаться на ту же старую 32-разрядную библиотеку DLL, которую они использовали раньше (теперь она находится в SysWOW64).Или, если они работают над 64-разрядным приложением, им все равно придется переписать свое старое приложение для новой ОС...так что перекомпиляция / перестройка все равно была бы необходима!!!

Microsoft просто иногда причиняет мне боль.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top