Может ли 64-битный EXE-файл связать 32-битные библиотеки DLL?

Я спрашиваю, потому что заметил, что многие 64-битные EXE-файлы ссылаются на то, что кажется 32-битными DLL.

Например, мое 64-битное приложение MFC ссылается на user32.dll, urlmon.dll, wininet.dll — все это 32-битные библиотеки DLL, которые находятся в windows\system32.

Так это какое-то специфическое волшебство MS, которое применяется к этим библиотекам DLL, или существует обратная совместимость, так сказать, для 64-битных EXE-файлов, которым необходимо использовать устаревшие 32-битные библиотеки DLL?


person Assaf Lavie    schedule 12.07.2009    source источник
comment
Думаю, мы все готовы к следующей версии Dependency Walker. Он обрабатывает 64-битные исполняемые файлы иногда вводящим в заблуждение образом и показывает некоторые другие раздражающие предупреждения. На самом деле это не ошибки, но их можно представить лучше. Я думаю, что такие вопросы - это +1 для новой версии.   -  person eran    schedule 12.07.2009
comment
@Eran, я скачал последние зависимости для 64-битной версии, и она показывает зависимые библиотеки DLL как 64.   -  person Assaf Lavie    schedule 13.07.2009
comment
На самом деле есть некоторое волшебство - в Win64 64-битная ntdll.dll загружается во ВСЕ процессы, как 32-битные, так и 64-битные. Но ничего волшебного ни в одной из упомянутых вами библиотек DLL.   -  person Ben Voigt    schedule 27.09.2012
comment
blog.mattmags.com /2007/06/30/   -  person Z80    schedule 07.09.2017


Ответы (3)


Вы не можете связать 64-битные EXE-файлы с 32-битными DLL или наоборот. В 64-разрядной ОС Windows библиотеки DLL в Windows\System32 на самом деле являются 64-разрядными библиотеками DLL. 32-разрядные версии находятся в папке Windows\SysWow64.

person Curt Hagenlocher    schedule 12.07.2009
comment
Если depend является 32-разрядной программой, то в игру вступает комментарий ssg — слой WOW перенаправляет представление 32-разрядных приложений в файловую систему, чтобы они видели то, что находится в SysWow64, как в System32. - person Curt Hagenlocher; 12.07.2009
comment
Ого, а я всегда думал наоборот. Интересный. - person thebunnyrules; 07.02.2017

Позвоните 32 из 64, конечно можно. (В Windows это называется WOW, что означает Windows для Windows). Но, наоборот, это не работает.

Здесь у вас есть объяснение того, как:

http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/

Надеюсь, послужит.

person Sheldon    schedule 12.07.2009
comment
Это полезная техника, и она должна работать в обоих направлениях, но на самом деле это не противоречие. - person Curt Hagenlocher; 12.07.2009
comment
Чтобы быть точным (во избежание разочарования), это не совсем Call 32 из 64, решение, описанное в статье, просто создает суррогатный 32-битный процесс и использует IPC для переадресации вызовов к нему из 64-битного процесса. Позвонить 32 с 64 напрямую невозможно (в пользовательском режиме), насколько я знаю. - person rustyx; 20.04.2016

Последняя версия Dependency Walker (находится здесь: http://www.dependencywalker.com/) устраняет эту проблему. . Он находит правильные библиотеки DLL и избегает неточных ошибок.

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

person Some Guy    schedule 22.07.2012