Почему моя программа не может найти свои библиотеки DLL на Vista 64?

Недавно я получил новый ноутбук. К сожалению, он пришел с Vista. Это была одна большая проблема, когда она работала, а у comp есть аппаратные компоненты, для которых нет драйверов XP, поэтому я не могу "обновить" до ОС, которая действительно работает. Я в основном получал работу, но одна особенно странная проблема меня сильно озадачила.

Я установил Delphi и попытался создать проект. Он скомпилирован, но не будет работать. "Это приложение не удалось запустить, потому что sdl.dll не был найден". Справедливо. Поэтому я схватил SDL.dll и поместил его в папку C:\windows\system32. (Использование Vista 64-bit Home Premium. Это 32-разрядная dll, поэтому я поместил ее в папку 32 вместо 64.)

Повторите попытку. Та же проблема. Но почему? Что там, где это происходит, правильно? И C:\windows\system32 находится в системном пути. Кто-нибудь знает, почему он не может ссылаться на DLL?

(И да, я знаю, что я могу решить проблему, поместив DLL в ту же папку, что и .exe. В настоящее время я делаю это как обходной путь. Это плохая идея в долгосрочной перспективе, потому что у меня есть несколько различных проектов, для которых все требуют SDL.)

Ответ 1

Это не проблема с Vista, а проблема с 64-разрядной Windows: имя System32 действительно запутывает, но на самом деле это папка, в которой находятся системные (64-разрядные) DLL файлы.

Итак, на любой 64-битной версии Windows...

... все системные DLL 64 бит расположены в C:\Windows\ System32.

... все системные DLL 32 бит расположены в C:\Windows\ SysWOW64.

Название происходит от W indows o n W indows 64 (WOW64), который является названием слоя перевода, позволяющего 32-разрядным приложениям использовать собственные 64-разрядные системные ресурсы.

Ответ 2

Раймонд Чен недавно обратился к основной причине, почему 32-разрядные системные каталоги являются странными в 64-битной Windows. Первый абзац этой записи действительно является ключом к пониманию причины сегрегационных 32-разрядных каталогов:

В 64-битной Windows запускаются 32-разрядные программы в слое эмуляции... Если 32-разрядный программа пытается посмотреть на систему, он увидит 32-битную систему.

Думаю, вам придется иметь отдельные каталоги, чтобы все эти вещи были отделены и работали. Кажется, что контр-интуитивное имя SysWOW64 для каталога, в котором находятся файлы, имеет больше смысла, если вы считаете, что WOW64 означает Windows On Windows 64-бит, что и называется эмулятором, упомянутым выше.