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

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

C: \ Windows \ System32 или C: \ Windows \ SysWOW64, в 64-битной системе Windows.

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

Логично, я думал, что поместил бы 32-битную DLL под C: \ Windows \ System32 и 64-разрядную DLL под C: \ Windows \ SysWOW64.

К моему удивлению, все наоборот ! 32- битный идет в C: \ Windows \ SysWOW 64 , а 64- битная DLL переходит в C: \ Windows \ System 32 .

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

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

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

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

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

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

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

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

 \program files\\ or \program files\common files\\ 

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

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

 HKLM\software\ -- dllLocation 

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

Вышесказанное – умный способ пойти.

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

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

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

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

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

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

  • Program Files и Program Files (x86)

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

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

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

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

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

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

  • Редиректор файловой системы MSDN

  • Объяснение SysWow64

Надеюсь, это очистит все!

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

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

  • Вы можете вызвать C # DLL из C DLL?
  • Экспорт функций из DLL с помощью dllexport
  • Точка входа в систему EncodePointer не может находиться в файле kernel32.dll
  • C # эквивалент DllMain в C (WinAPI)
  • Зависимость Уокер сообщает, что IESHIMS.DLL и WER.DLL отсутствуют?
  • Целевая 32-разрядная или 64-разрядная нативная DLL-память в зависимости от среды
  • Как устранить недостающие DLL и поврежденные системные файлы после обновления Windows-7?
  • Как вы регистрируете DLL-файл Win32 COM в WiX 3?
  • Есть ли способ найти все функции, открытые dll
  • Ссылки DLL в Visual C ++
  • Эквивалентен «app.config» для библиотеки (DLL)
  • Interesting Posts
    Давайте будем гением компьютера.