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

#visual-c #linker #32bit-64bit #visual-studio-2010

#visual-c #компоновщик #32-битный-64-битный #visual-studio-2010

Вопрос:

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

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

 Error: Modules with different CPU types were found.
  

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

Комментарии:

1. Я понимаю, что это старый вопрос, но я делаю это без проблем. Можете ли вы рассказать мне больше о своих настройках? В частности, есть ли у вас в разделе Компоновщик-> Дополнительно целевой компьютер, установленный на MachineX86?

Ответ №1:

Краткий ответ: Используйте средство обхода зависимостей для x86 для x86-файлов.

Длинный ответ: Изначально я использовал средство устранения зависимостей для x64 в ОС MS Windows 7 и столкнулся с теми же препятствиями, что и вы. Затем я последовал совету МерикоВОЙ об изменении путей поиска (спасибо МерикоВОЙ). Хотя у меня все еще было несколько зависимостей, вызывающих «Ошибка: были найдены модули с разными типами ЦП».

Вместо того, чтобы выяснить, как настроить средство обхода зависимостей для поиска библиотек DLL x86 в причудливо выглядящих путях, таких как «c:windowswinsxsamd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.17514_none_2b24536c71ed437aGDIPLUS.DLL «правильно, я использовал средство управления зависимостями для x86. Для меня это сработало как по волшебству!

Комментарии:

1. Также обычно полезно запускать средство обхода зависимостей на целевой, а не на разрабатываемой машине. Вы даже можете создать пакетный файл, который выводит свои выходные данные в текстовый файл, и попросить вашего дружественного тестировщика отправить его вам по электронной почте. Кроме того, средство управления зависимостями, похоже, не обрабатывает трассировку от начала программы на .Net C # до собственных библиотек DLL. Запустите средство обхода зависимостей в вашем .exe и каждом. dll, за которую вы несете ответственность.

2. Я знаю, что это старый пост, но «Вместо того, чтобы выяснить, что и как ..» ?

Ответ №2:

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

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

Вот почему средство устранения зависимостей ошибочно считает, что ваше приложение смешивает библиотеки DLL x64 с вашим приложением x86.

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

Лучший способ проверить, какое окно вывода открывается в Visual Studio debugger или 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_ROOTdllfileshell]

[HKEY_CLASSES_ROOTdllfileshellView Dependencies]

[HKEY_CLASSES_ROOTdllfileshellView Dependenciescommand]
@="\\psf\Public\Library\DEPE~K17\depends.exe /dde"

[HKEY_CLASSES_ROOTdllfileshellView Dependenciesddeexec]
@="[open("%1")]"

[HKEY_CLASSES_ROOTdllfileshellView Dependencies(32bit)]

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

[HKEY_CLASSES_ROOTdllfileshellView Dependencies(32bit)ddeexec]
@="[open("%1")]"

[HKEY_CLASSES_ROOTexefileshell]

[HKEY_CLASSES_ROOTexefileshellView Dependencies]

[HKEY_CLASSES_ROOTexefileshellView Dependenciescommand]
@="\\psf\Public\Library\DEPE~K17\depends.exe /dde"

[HKEY_CLASSES_ROOTexefileshellView Dependenciesddeexec]
@="[open("%1")]"

[HKEY_CLASSES_ROOTexefileshellView Dependencies(32bit)]

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

[HKEY_CLASSES_ROOTexefileshellView Dependencies(32bit)ddeexec]
@="[open("%1")]"