Почему 32-битный проект MSVC 2010 связан с 64-битным kernel32.dll? - PullRequest
10 голосов
/ 24 мая 2011

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

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

Error: Modules with different CPU types were found.

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

Ответы [ 3 ]

13 голосов
/ 02 февраля 2012

Краткий ответ: Использование Зависимость Walker для 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_2b24536c71ed437.DLL \ GDD, I37.dll" G Зависимость Уокер для x86 . Работал как шарм для меня!

6 голосов
/ 25 августа 2011

Dependency Walker не использует тот же путь поиска, что и ОС. Он имеет свои собственные пути поиска, чтобы попытаться найти DLL. Вы можете просмотреть это, выбрав «Опции -> Настроить порядок поиска модулей ...»

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

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

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

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

3 голосов
/ 18 декабря 2012

Ознакомьтесь с часто задаваемыми вопросами о сайте зависимости. 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\")]"
...