Почему 32-битный проект MSVC 2010 связан с 64-битным ядром32.dll?

У меня есть DLL-проект Win32 (32bit), который строит и связывает без ошибок. DLL не загружается в 32-битный процесс. Используя DependencyWalker, я вижу, что DLL 32bit, но была связана с 64-битными библиотеками для kernel32, msvcr100d, ws2_32 и msvcr100.

DependencyWalker также показывает ошибку

Error: Modules with different CPU types were found.

Я уже несколько часов озадачился этими проблемами и просто не могу понять, кто-нибудь еще испытал это и нашел решение?

Ответ 1

Краткий ответ: Используйте Уклонение зависимостей для x86 для материалов x86.

Длинный ответ: Первоначально я использовал Dependency Walker для x64 на ОС MS Windows 7 и столкнулся с вашими барьерами. Затем я последовал совету MerickOWA об изменении путей поиска (спасибо MerickOWA). Хотя у меня все еще было несколько зависимостей, вызывающих "Ошибка: были найдены модули с разными типами процессоров".

Вместо того, чтобы выяснить, как настроить Dependency Walker для поиска DLL-библиотек x86 в причудливых поисковых путях, таких как "c:\windows\winsxs\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.17514_none_2b24536c71ed437a\GDIPLUS.DLL" правильно, я использовал Уклонение зависимостей для x86. Работала как шарм для меня!

Ответ 2

Dependency Walker не использует тот же путь поиска, что и ОС. У него есть собственные пути поиска, чтобы найти DLL. Вы можете просмотреть это, перейдя в "Настройки → Настроить порядок поиска модуля..."

К сожалению, его пути поиска не включают "C:\Windows\SysWow64" (расположение 32-разрядной версии для Kernel32.dll)

Вот почему Dependency Walker неправильно думает, что ваше приложение смешивает x64 DLL с вашим приложением x86.

Если вы исправите порядок поиска, включите SysWow64 и удалите все ссылки на каталог System32. Эта ошибка должна исчезнуть.

Лучший способ проверить, какое окно вывода отладчика Visual Studio или WinDbg выполняется при запуске вашего приложения. Он будет перечислять полный путь DLL по мере их загрузки.

Ответ 3

Проверьте часто задаваемые вопросы по сайту зависимостей. http://www.dependencywalker.com/faq.html

Q.Will Dependency Walker work with 64-bit modules?

вам понадобится версия x86 для 32-битных модулей, x64 для 64-битных модулей. Это означает, что вам нужно иметь 2 копии в 64-битной ОС и использовать их соответственно.

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

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\dllfile\shell]

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies]

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies\command]
@="\\\\psf\\Public\\Library\\DEPE~K17\\depends.exe /dde"

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies(32bit)]

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies(32bit)\command]
@="\\\\psf\\Public\\Library\\DEPE~K17\\x86\\depends.exe /dde"

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies(32bit)\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\exefile\shell]

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies]

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies\command]
@="\\\\psf\\Public\\Library\\DEPE~K17\\depends.exe /dde"

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies(32bit)]

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies(32bit)\command]
@="\\\\psf\\Public\\Library\\DEPE~K17\\x86\\depends.exe /dde"

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies(32bit)\ddeexec]
@="[open(\"%1\")]"